記事
· 2022年10月13日 4m read

デプロイモードで別環境にプログラムを配布する方法

以下、デプロイモード(配置モード)でプログラムを配布する方法を2つご紹介します。


① DB内のソースコードをデプロイモードでエクスポートする方法

② ソースコード用DBを用意してIRIS.datごとデプロイモードにする方法


①は、プログラムのみデプロイモードでエクスポート/インポートできるので、初回システム構築時はもちろん、プログラムの修正が発生した時などソースの一部のみエクスポートすることも可能となります。

②は、IRIS.dat ごとデプロイするので初回システム構築時に IRIS.dat のみ配置すればよく手順が単純です。

クラスがデプロイモードになると、そのクラスのメソッドとトリガのソースコードは削除されます。
クラスがデータ型クラスである場合、クエリキャッシュによって実行時にメソッド定義が必要になる可能性があるために、メソッド定義が保持されるのでご注意ください。

 

それぞれの方法について、詳しく説明します。
 

① DB内のソースコードをデプロイモードでエクスポートする方法

(1) 開発環境:Hidden属性をオンにして保存し、Deployモードでエクスポートします。
   ※こちらの操作は、移行先環境で行うことも可能です。必要に応じて設定するようにしてください。

 set cls = ##class(%Dictionary.ClassDefinition).%OpenId("User.test")
 set cls.Hidden=1
 set st = cls.%Save()

    プロジェクト単位でエクスポートします() 

 set p=##class(%Studio.Project).%OpenId("プロジェクト名")
 set sc=p.DeployToFile("c:\temp\testP.xml",,1)    // 3番目の引数=1:ソース・中間コードを含まない

    個別にエクスポートしたい場合は以下のようにします。
   ルーチンについては別途OBJのみエクスポートするようにします。 

 set p=##class(%Studio.Project).%New()
 set rc=p.AddItem("User.test.cls")
 set sc=p.DeployToFile("c:\temp\test.xml",,1)

クラス/ルーチン一覧の取得方法については、以下開発者コミュニティ記事をご覧ください。

ネームスペース内のクラス一覧を取得する方法
   CSP/CSRを含む場合は「if $extract(name,1,3)=~」の行をコメントアウトしてください   
ルーチン一覧を取得する方法

(2) 移行先環境:上記ファイルを移行先環境にコピーします。

(3) 移行先環境:以下のようにしてインポートします(個別にOBJをエクスポートしている場合は別途インポート)

set sc=##class(%Studio.Project).InstallFromFile("c:\temp\testP.xml")


(4) 開発環境:Hidden属性をオフにします。

 set cls = ##class(%Dictionary.ClassDefinition).%OpenId("User.test")
 set cls.Hidden=0
 set st = cls.%Save()

 

② ソースコード用DBを用意してIRIS.datごとデプロイする方法

【注意点】
・一度デプロイモードにしてしまうと、編集、エクスポート、再コンパイルができなくなりますのでご注意ください。
・CSPファイルを含む場合、コピー先のウェブアプリケーション設定で、
    CSP ファイルの設定:自動コンパイル のチェックを外すようにしてください。
・必要に応じて、①と同様にクラスをHidden属性を設定するようにしてください。
・クラスクエリを使用している場合、SQLクエリ文は保持されます。
・ソースコードは別途バックアップしてください。


(1) 開発環境:対象のネームスペースのIRIS.dat内のクラスをデプロイモードに設定します。
      以下のようなサンプルクラスを使って行う方法をご案内します。

Class ISJ.Utils
{

ClassMethod MakeClassDeployed(ns = {$namespace})
{
    #dim ex As %Exception.AbstractException
    try {
	    new $namespace
	    set $namespace=ns

        Set statement = ##class(%SQL.Statement).%New()
        Do statement.%PrepareClassQuery("%Dictionary.ClassDefinitionQuery","Summary")
        set rs = statement.%Execute()
        while rs.%Next() {
            set name=rs.%Get("Name")
            if name["%" continue            // %つきのクラスは飛ばす
            set st=$System.OBJ.MakeClassDeployed(cls)
            write:st !,cls," deployed"
        }
    }
    catch ex {
        write "エラー発生 : ",ex.DisplayString(),!
        set $NAMESPACE=ns
    }
}
}

     次のように実行します。

 do ##class(ISJ.Utils).MakeClassDeployed()


(2) 開発環境:ルーチンはOBJコードのみ残します(*.mac, *.int を削します)

USER>do ^%RDELETE
Delete routines/INCLUDE files.
WARNING: When <rtn>.MAC.0 is deleted, the latest backup is moved
         to <rtn>.MAC.0, UNCOMPILED.

Routine(s): a*.mac            // *.mac で全ての mac ルーチンを削除
Routine(s): a*.int
Routine(s): b*.int
Routine(s):                       // <Enter>で終了

 

詳細は、ドキュメントをご覧ください。
 

enlightened【ご参考】
Deploying solutions without source code from ZPM  (英語のみ)

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください