【IRIS】エクスポート・コンパイルの設定値ってどうする?

本記事は、エクスポート・コンパイルの「qspec」の設定値について解説します。

※この記事は下記の方向けになります。
  • エクスポート・コンパイルの設定値「qspec」に関して知りたい方
  • 設定方法と各項目について確認したい方

はじめに

ソースのエクスポートやインポート、クラスのコンパイル等について、どのような設定(qspec)を行っていますか?

システムの性格によって、設定値は千差万別だと思いますが、今回はこの設定についてざっくりと解説していきたいと思います。

設定値の確認方法

先ずは、現在の設定値を確認するために、ターミナルを起動して下記コマンドを実行しましょう。

d $system.OBJ.ShowQualifiers()

コマンド実行後、種々の設定情報が表示されます。
かなりのボリュームなので、内容に関しては割愛させて下さい。

【一部抜粋】

設定方法

設定値の確認ができたら、後は設定値の変更方法になります。

ターミナルを起動し、下記コマンドで設定を変更します。
設定を変更するネームスペースで実行して下さい。

d $system.OBJ.SetQualifiers([設定値], [1 or 0])
引数位置説明
第一引数変更する項目を設定します。
複数の項目を変更する場合、同時に設定する必要があります。
 複数設定例)”/autoinclude=0/checkschema=0”
第二引数システム全体に設定する場合は「1」を設定します。
ネームスペース固有にする場合は、省略しても問題ありません。

後は、[設定値]に該当する、各設定項目を見てみましょう。

コンパイラ修飾子

コンパイル時に設定する「qspec」に設定する項目です。

d $system.OBJ.Compile(.[classes], [qspec], .[errorlog], [recurse])
d $system.OBJ.CompileAll([qspec], .[errorlog])
d $system.OBJ.CompileAllNamespaces([qspec], .[errorlog])
修飾子意味初期値
/autoincludeこのクラスのコンパイルに必要な、最新でないすべてのクラスを自動的に含めます。1
/checkschemaインポートした XML ファイルをスキーマ定義に対して検証します。1
/checksysutdシステム・クラスが最新であるかどうかを確認します。0
/checkuptodate最新のクラスまたは最新の拡張クラスのコンパイルをスキップします。expandedonly
/compileロードされたクラスをコンパイルします。0
/compileembedded埋め込み SQL は、これを含む ObjectScript コードのコンパイル時にコンパイルされます。既定では、埋め込み SQL は、SQL コードの初回実行時にコンパイルされます。0
/cspcompileclassCSP または CSR のロードによって作成されたクラスをコンパイルします。1
/cspdeployclassCSP ページがロードされたら生成したクラスを配置します。0
/csphiddenCSP および CSR のコンパイルで生成されたクラスを非表示としてマーク付けします。1
/defaultownerクラスのロード時、Owner キーワードが定義されていない場合、この文字列で指定されているユーザ名をクラス所有者としてクラス定義に挿入します。この文字列の値が $USERNAME である場合、現在のユーザ名をクラス所有者としてクラス定義に挿入します。
/defines定義するマクロのコンマ区切りリスト。必要に応じてそれらの値も指定します。
/deleteextentエクステントによって使用されるグローバル・ストレージを記述するエクステント定義を削除し、データを削除します。0
/diffexportdiff/merge ツールで実行できるよう、ファイルのエクスポートに時間やプラットフォーム情報を含めません。0
/display/displaylog および /displayerror のエイリアス修飾子。
/displayerrorエラー情報を表示します。1
/displaylogログ情報を表示します。1
/expand/predecessorclasses、/subclasses、および /relatedclasses のエイリアス修飾子。
/exportgeneratedクラスをエクスポートするとき、生成したクラスもエクスポートし、そのクラスの生成元となったクラスも追加します。0
/exportselectivityこのクラスのストレージ定義内に格納されている SELECTIVITY 値をエクスポートします。1
/filterin/application、/system、および /percent のエイリアス修飾子。
/generated生成される項目 (ルーチン、クラスなど) がパッケージ内の展開中のパターンまたはクラスのリストに含まれるかどうかを決定します。1
/generatemapマップ・ファイルを生成します。1
/importselectivity0 : XML ファイルから SELECTIVITY 値をインポートしません。1 : XML ファイルをインポートするときに、ストレージ定義に格納されている SELECTIVITY 値をインポートします。2 : 既存のクラスの SELECTIVITY 値を維持しますが、既存のクラスに、XML ファイルの内容に対して指定された SELECTIVITY がない場合は、XML ファイルの SELECTIVITY 値を使用します。2
/includesubpackagesサブ・パッケージを含めます。1
/journalクラス・コンパイル実行中にジャーナリングを有効にします。特に、コンパイルを実行しているプロセスでジャーナリングが無効になっている場合、/journal は既定値 0 になります。システム全体の既定値 1 にはなりません。1
/keepsource生成されたルーチンのソース・コードを保持します。0
/lock非推奨 — この修飾子の設定に関係なく、クラスはコンパイル時には常に自動的にロックされます。1
/mapped別のデータベースからマップされたクラスを含めます。別のデータベースからクラスをコンパイルすることを明確に指定すると (CompileList() メソッド)、/mapped の設定にかかわらず、そのクラスがコンパイルされます。/mapped は、コードがクラスを検索する場合 (例えば、CompileAll() メソッドを使用する場合) にのみ適用されます。Upgrade() メソッドを使用して 1 つのネームスペースのクラス定義データベースをアップグレードする場合、または UpgradeAll() メソッドを使用してすべてのネームスペースのクラス定義データベースをアップグレードする場合、/mapped = 1 に設定する必要があります。そうしないと、マップされたオブジェクトはアップグレードに含められません。0
/mergeglobalXML ファイルからグローバルをインポートする場合は、そのグローバルを既存のデータとマージします。0
/multicompile複数のユーザのジョブを有効にして、クラスをコンパイルします。1
/percentパーセント・クラスを含めます。0
/predecessorclasses先行依存するクラスを再帰的に含めます。0
/relatedclasses関連するクラスを再帰的に含めます。0
/retainstorageクラスのコンパイル時、コンパイラによってストレージ定義が生成されます。既定では、ストレージ定義が更新された場合、クラス定義は更新されたストレージ定義で更新されます。新しいバージョンのクラスが外部ソースからロードされた場合、その更新されたストレージ定義は新しいバージョンのクラス定義で定義されている内容に上書きされます。新しいバージョンのクラスにストレージ定義が含まれていない場合、既存のストレージ定義は削除されます。/retainstorage を設定すると、既存のストレージ定義が一時的に保存され、新しいバージョンのクラスのロード後にリストアされます。新しいバージョンのクラスでもストレージ定義が定義されている場合、既存のストレージ定義は上書きされ、保持されません。新しいバージョンのクラスでストレージ定義が定義されていない場合、前のバージョンのストレージ定義がリストアされます。0
/subclassesサブ・クラスを再帰的に含めます。0
/systemシステム・メッセージまたはアプリケーション・メッセージを処理します。0

エクスポート修飾子

エクスポートコマンド等の「qspec」に設定する項目になります。

d $system.OBJ.Export([items],[filename],[qspec],[Charset])
d $system.OBJ.Load([file],[qspec],...)
d $system.OBJ.Delete([classes],[qspec],[errorlog])

%SYSTEM.OBJ.clsの各関数説明で、「qspec」の説明に「.ShowQualifiers(), .ShowFlags()」が記載されています。

フラグ意味初期値
/checksysutdシステム・クラスが最新であるかどうかを確認します。0
/checkuptodate投影の際にクラスが最新であるかどうかを確認します。expandedonly
/createdirs存在しない場合はディレクトリを作成します。0
/cspdeployclassCSP ページがロードされたら生成したクラスを配置します。0
/diffexportdiff/merge ツールで実行できるよう、ファイルのエクスポートに時間やプラットフォーム情報を含めません。0
/display/displaylog および /displayerror のエイリアス修飾子。
/displayerrorエラー情報を表示します。1
/displaylogログ情報を表示します。1
/documatichostJavaDoc の生成に使用されるホスト。
/documaticnamespaceJavaDoc の生成に使用されるネームスペース。
/documaticportJavaDoc の生成に使用されるポート。
/exportgeneratedクラスをエクスポートするとき、生成したクラスもエクスポートし、そのクラスの生成元となったクラスも追加します。0
/exportselectivityこのクラスのストレージ定義内に格納されている SELECTIVITY 値をエクスポートします。1
/exportversionエクスポート先のシステムの InterSystems プラットフォームとバージョンを指定します。プラットフォームは iris または cache として指定します。このバージョンを、3 つの部分で構成されるリリース・バージョン (2018.1.1 など) で指定します。例えば、/exportversion=iris2018.1.1 または /exportversion=cache2018.1.2 です。エクスポート・システムとインポート・システムが同じ InterSystems バージョンでない場合、IRIS は /exportversion 値を使用します。以前の InterSystems バージョンでは実装されていなかったクラス・キーワードを削除することで、バージョン間でのエクスポート形式の変更を処理します。/exportversion を指定しても、エクスポート・システムとインポート・システム間のコードの互換性は保証されません。InterSystems IRIS の現在のバージョン
/generatemapマップ・ファイルを生成します。1
/generationtype生成モード。
/genserialuidserialVersionUID を生成します。1
/importselectivity0 : XML ファイルから SELECTIVITY 値をインポートしません。
1 : XML ファイルをインポートするときに、ストレージ定義に格納されている SELECTIVITY 値をインポートします。
2 : 既存のあらゆる SELECTIVITY 値を維持しますが、既存の値がないプロパティには XML ファイルの SELECTIVITY 値を使用します。
2
/includesubpackagesサブ・パッケージを含めます。1
/javadocjavadoc を作成しません。1
/make最新のコンパイルのタイムスタンプが、最新の生成時のタイムスタンプよりも新しい場合は、依存またはクラスのみを生成します。0
/mapped別のデータベースからマップされたクラスを含めます。0
/mergeglobalXML ファイルからグローバルをインポートする場合は、そのグローバルを既存のデータとマージします。0
/newcollectionsネイティブの Java コレクションを使用します。1
/percentパーセント・クラスを含めます。0
/pojoPOJO 生成モードを指定します。0
/predecessorclasses先行依存するクラスを再帰的に含めます。0
/primitivedatatypes%Integer、%Boolean、%BigInt、%Decimal に Java 基本関数を使用します。0
/projectabstractstream引数が抽象ストリームであるか、返りタイプが抽象ストリームであるメソッドを含むプロジェクト・クラスを指定します。0
/projectbyrefmethodstopojopojo 実装に ByRef メソッドを投影します。0
/recursiveクラスを再帰的にエクスポートします。1
/relatedclasses関連するクラスを再帰的に含めます。0
/skipstorageクラスのストレージ情報をエクスポートしません。0
/subclassesサブ・クラスを再帰的に含めます。0
/systemシステム・メッセージまたはアプリケーション・メッセージを処理します。0
/unconditionallyprojectコードのコンパイルまたは正常な動作を妨げる問題を無視して投影を実行します。0
/usedeepestbaseメソッドまたはプロパティ定義に対してメソッドまたはプロパティが定義されている場合に、最も下部にあるベースを使用します。 P が A、B、および C に定義されており、A が B を拡張し、B が C を拡張する場合、より深い位置にあるベースは C になります。0

さて、何を設定しよう?

先ほども記載した通り、システムの性格や開発環境(主にvscode等の脱スタジオ環境)、本番環境/練習環境・・・等によって、設定する項目と値は変わってくると考えます。

個人的なお勧め設定項目

お勧めの項目として、下記「手間」だったり「困ったり」する点を解決してくれる設定になります。

手間だったり困ったりする事
  • xmlで出力し更新箇所を比較する場合、更新日時のタグを出力したくない
  • SQLの選択性には生データが乗ってくるため、出力したくない
  • クラスに付随しているSQLの選択性を取り込みたくない。

上記を解決する項目と設定値

項目説明設定値
/diffexportdiff/merge ツールで実行できるよう、ファイルのエクスポートに時間やプラットフォーム情報を含めません。1
/exportselectivityこのクラスのストレージ定義内に格納されている SELECTIVITY 値をエクスポートします。0
/importselectivity0 : XML ファイルから SELECTIVITY 値をインポートしません。
1 : XML ファイルをインポートするときに、ストレージ定義に格納されている SELECTIVITY 値をインポートします。
2 : 既存のクラスの SELECTIVITY 値を維持しますが、既存のクラスに、XML ファイルの内容に対して指定された SELECTIVITY がない場合は、XML ファイルの SELECTIVITY 値を使用します。
0

従って、設定コマンドは下記になります。

d $system.OBJ.SetQualifiers("/diffexport=1/exportselectivity=0/importselectivity=0")

設定値は「一度に」「まとめて」設定する必要があります。
個別に設定した場合、前回の設定は「デフォルト値に戻る」事になります。
  ・・・うーん、面倒

設定が終わったら、念のためグローバルを確認してみます。
ターミナルで下記を実行して下さい。

zw ^%oddENV

【実行結果】
^%oddENV(“defaultqualifiers”,”SAMPLE”)=”/diffexport=1/exportselectivity=0/importselectivity=0″

このグローバル構造から分かる通り、設定する度に前回の設定値が上書きされる理由が分かりますね。

では、気を取り直してクラスの出力結果を見てみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<Export generator="IRIS" version="26">
<Class name="developer.data.Test">
<Super>%Persistent,%Populate</Super>
<TimeCreated>66873,39667.120505</TimeCreated>

<Index name="prm">
<PrimaryKey>1</PrimaryKey>
<Properties>patientId</Properties>
</Index>

<Property name="patientId">
<Type>%String</Type>
</Property>

<Property name="name">
<Type>%String</Type>
</Property>

<Storage name="Default">
<Type>%Storage.Persistent</Type>
<DataLocation>^developer.data.TestD</DataLocation>
<DefaultData>TestDefaultData</DefaultData>
<IdLocation>^developer.data.TestD</IdLocation>
<IndexLocation>^developer.data.TestI</IndexLocation>
<StreamLocation>^developer.data.TestS</StreamLocation>
<Data name="Defrag2DefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>patientId</Value>
</Value>
<Value name="3">
<Value>name</Value>
</Value>
</Data>
<Property name="%%CLASSNAME">
</Property>
<Property name="%%ID">
</Property>
<Property name="name">
</Property>
<Property name="patientId">
</Property>
<SQLMap name="IDKEY">
</SQLMap>
<SQLMap name="prm">
</SQLMap>
</Storage>
</Class>
</Export>

更新日時や、出力端末情報が出力されていないのが確認できます。
また<Selectivity>関連も出力されていませんね。

<Export generator="IRIS" version="26" zv="IRIS for Windows (x86-64) 2023.1.2 (Build 450U)" ts="2025-04-30 08:03:25">
<TimeChanged>67325,28963.1349</TimeChanged>

これで作業が捗りそうです!

状況によって適宜設定値を変更したい項目

主に、エクスポート時やコンパイル時に付与すると、色々捗りそうな修飾子。

項目説明
/checkuptodate=none最新クラスやプロパティの型等も含めてコンパイルを実施する。
 ※コンパイル時
/keepsource=0INTルーチンを作成しない。本番環境とかで実施すると良いかも。
 ※コンパイル時
/predecessorclasses/recursive=1単独では動作しないため、/recursive=1と組み合わせる
先行依存するクラスを再帰的に含めます。
 ※エクスポート時
/subclasses=1/recursive=1単独では動作しないため、/recursive=1と組み合わせる
サブ・クラスを再帰的に含めます。
/journal=0クラス・コンパイル実行中にジャーナリングを無効にします。
※ジャーナリングが無効になっている場合、/journal は既定値 0 になります。
/displaylog=0エラーログだけ出れば十分だと思う時

他にも便利な設定値をご存じの方が居たら、ご連絡いただけると幸いです!

おわりに

いかがだったでしょうか。

いくつかに動作の不具合があったり、ドキュメントの説明が分かりにくかったりしますが、概ね普段使いする修飾子は問題なさそうです。

場面場面で修飾子を使い分けれれば、作業効率はかなり上がると思います。
この記事をみて、何かの参考になれば幸いです。