開発者の皆さん、こんにちは!
InterSystems IRIS(以下、IRIS)を使用したアプリケーション開発において、皆さんは環境設定をどうされていますか?
私は最近になって、「インストールマニフェスト」という機能があることを知りました。
これは、管理ポータルでポチポチしていた作業をコード化・自動化できる強力なツールです!
最初こそとっつきづらかったものの良いところがたくさんあるなと思ったので、簡単にではありますが皆さんにその良さと始め方をご紹介したいと思います。
なお、私が使用しているIRISバージョンは以下です。
2022.1
バージョンが異なる場合、違う書き方になっているもの等が存在する場合がありますので、
公式ドキュメント等を参照し適宜読み替えていただければと思います。
目次
- はじめに
- インストールマニフェストとは
- インストールマニフェストのメリット・デメリット
- インストールマニフェストの始め方と基本構造
- マニフェストの作成
- マニフェストの編集
- マニフェストの実行
- インストールマニフェストでできること
- 変数の設定
- ネームスペースとデータベースの設定
- データのインポートとマッピング
- セキュリティ設定
- InterOperability 機能の設定
- インストールマニフェスト以外で行う環境設定
- ObjectScriptによる実装
- Pythonによる実装
- まとめ
1. はじめに
IRISを使用するにあたって、管理ポータルでの環境設定は切っても切れない作業だと思います。
IRIS のインストールマニフェストを使用することで、ネームスペース、データベース、セキュリティ設定、InterOperabilityの有効化、
さらにはカスタムコードの実行まで、一連のプロセスを自動化することができます。
本記事では、実際のマニフェストファイルを例に挙げながら、IRIS の環境設定自動化の方法について解説します。
なお、本記事で解説しているサンプルコードの全文と、付随するフォルダ・ファイルについては、Githubにて公開しています。
2. インストールマニフェストとは
IRIS のインストールマニフェストとは、%Installer
というツールのことを指します。
インストールマニフェスト定義を記述するだけで、
IRIS環境設定を変更するために必要なコードを自動生成することができます。
他人に共有する際は、定義したインストールマニフェストを配布するだけで済みます。
インストールマニフェストは XML 形式で記述されます。
主要な要素として <Manifest>
、<Namespace>
、<Configuration>
、<Database>
などがあります。
なお、公式ドキュメントは以下です。
3.インストールマニフェストのメリット・デメリット
私が使ってみて感じた、インストールマニフェストのメリット・デメリットについてお伝えします。
全ての場合でインストールマニフェストが優れているとは言えないと思いますので、下記を参考に使用したほうが良いかどうか判断してもらえたらと思います。
-
メリット
- IRIS環境構築(管理ポータルで手動で実行していた作業)の自動化ができる
- 環境構築内容をコードとして管理できる
- 共通の環境を誰でも簡単に、素早く作れるようになる
- 事前に内容を定義しておけるので、管理ポータルで操作してうっかり設定ミスや設定忘れをしてしまうといったことがなくなる
-
デメリット
- 環境構築経験が豊富でない人にとっては、公式ドキュメントを読みながらでもコードが示す内容の把握が難解なところがある
- マニフェストの記法を理解した人でないと、コードのメンテナンスを実施できない
- 定義の作成、定義の配布、実行方法の共有など、事前準備に手間がかかるため、少人数の環境が対象だったり、設定項目が少なかったりすると手間のほうが大きくなる可能性がある
4. インストールマニフェストの始め方と基本構造
4-1. マニフェストの作成
インストールマニフェストは、簡単に作成することができます。
例えばあなたがスタジオを使っている場合、下記の手順でテンプレートを作成できます。
ファイル > 新規作成 > 一般 > %Installer マニフェスト > OK
こうして作成されるマニフェストは、以下のようになっています。
Include %occInclude
/// %Installer Manifest MyApp.MyInstaller
Class MyApp.MyInstaller
{
/// マニフェスト定義.
XData MyManifest [ XMLNamespace = INSTALLER ]
{
<Manifest>
<Namespace>
<Configuration>
<Database>
<!-- Your Manifest code here -->
</Database>
</Configuration>
</Namespace>
</Manifest>
}
/// これは XGL により生成されたメソッド・ジェネレーターです。.
ClassMethod setup(ByRef pVars, pLogLevel As %Integer = 3, pInstaller As %Installer.Installer, pLogger As %Installer.AbstractLogger) As %Status [ CodeMode = objectgenerator, Internal ]
{
#; XGL ドキュメントでこのメソッドのコードを生成する.
Quit ##class(%Installer.Manifest).%Generate(%compiledclass, %code, "MyManifest")
}
}
4-2. マニフェストの編集
なにやら見覚えのないコードがたくさん生成されますが、安心してください。
そのうち、私たちが編集すればよいのは基本的に下記の部分のみです。
<Manifest>
<Namespace>
<Configuration>
<Database>
<!-- Your Manifest code here -->
</Database>
</Configuration>
</Namespace>
</Manifest>
■マニフェストの基本構造
詳細については後ほど解説しますが、ここでは基本的な構造について紹介していきます。
<Manifest>
:すべてのタグのルートタグである必要がある。 他のすべてのタグを含む。<Namespace>
:ネームスペースを定義する。 【親タグ:<Manifest>
】<Configuration>
:<Namespace>
内で構成タグの親タグとして記述する必要がある。【親タグ:<Namespace>
】<Database>
:データベースを定義する。 【親タグ:<Configuration>
】
ここで覚えるべきは、<Manifest>
タグは唯一無二ですべてのルートタグとなること、
その中身となるそれぞれのタグにも親子関係があるためそれを守らなければならないこと、の2点です。
これら以外の記述は、インストールマニフェストの作成や実行に必要なコードです。
詳細の説明については、下記のページにあるので任せたいと思います。
4-3. マニフェストの実行
このマニフェストを実行したいときは、ターミナルで以下のコマンドを実行してください。
※マニフェストを実行する時は、%SYSネームスペースで実行することを推奨します。(それ以外のネームスペースでも動作はします)
USER>zn "%SYS"
%SYS>do ##class(MyApp.MyInstaller).setup()
そうすると、マニフェストが環境設定のためのコードを生成し、そのコードが実際にIRISの環境設定を変更していきます。
5. インストールマニフェストでできること
それではさっそく、インストールマニフェストで実際にできることについてみていきましょう。
私が触ったことのある機能を中心に紹介していますが、前述の公式ドキュメントにはそれ以外の設定もできるXMLタグが多数紹介されていますので、参照してみてください。
5-1. 変数の設定
マニフェストでは、変数を設定することができます。
変数設定ができるタグには2種類あります。
<Default>
:変数値がまだ設定されていない場合のみ、変数値を設定します。(すでに値が設定されている場合、無効になる)【親タグ:<Manifest>
】<Var>
:マニフェストで使用できる変数を定義および設定します。【親タグ:<Manifest>
】
<Var Name="var1" Value="aaa" />
// 事前に変数 var1 が設定されているので、var1 は aaa のまま
<Default Name="var1" Value="bbb" />
// 事前に変数 var2 は設定されていないので、var2 は ccc になる
<Default Name="var2" Value="ccc" />
5-2. ネームスペースとデータベースの設定
マニフェストを使用して、ネームスペースとそれに関連するデータベースを簡単に作成できます。
関連するタグは3種類です。
<Namespace>
:ネームスペースを定義する。【親タグ:<Manifest>
】- Name:ネームスペースの名前
- Create:新しいネームスペースを作成するかどうか(yes/no/overwrite) ※デフォルト:yes
- Code:コード用データベースの指定
- Data:データ用データベースの指定
- Ensemble:InterOperabilityを使用するネームスペースかどうかの指定
<Configuration>
:<Namespace>
内で構成タグの親タグとして記述する必要がある。【親タグ:<Namespace>
】<Database>
:データベースを定義する。【親タグ:<Configuration>
】- Name:データベース名
- Dir:データベース・ディレクトリ
- Create:新しいデータベースを作成するかどうか
- InitialSize:データベースの初期サイズ(MB)
- Resource:データベースへのアクセスを制御するリソース
- PublicPermissions:リソースに割り当てられる許可の値(新規作成リソースのみ適用)(R/W/RW)
<Default Name="Namespace" Value="TESTNMSP"/>
<Default Name="DATADB" Value="${Namespace}-GBL"/>
<Default Name="CODEDB" Value="${Namespace}-RTN"/>
<Default Name="SetupDir" Value="C:\work\git"/>
<!-- ネームスペース作成 -->
<Namespace Name="${Namespace}" Code="${CODEDB}" Data="${DATADB}" Create="yes" Ensemble="0">
<!-- DB作成 -->
<Configuration>
<Database Name="${DATADB}" Dir="C:\IRISDB\${Namespace}\GBL" Create="yes" InitialSize="100" Resource="%DB_${DATADB}" PublicPermissions="R"/>
<Database Name="${CODEDB}" Dir="C:\IRISDB\${Namespace}\RTN" Create="yes" InitialSize="10" Resource="%DB_${CODEDB}" PublicPermissions="R"/>
</Configuration>
</Namespace>
■結果(管理ポータル画面)
(ネームスペース)
(データベース)
5-3. データのインポートとマッピング
マニフェストを使用して、特定のネームスペースに既存のデータやコードをインポートすることもできます。
関連するタグは1種類です。(既出除く)
<Import>
:ファイルをインポートする。(%SYSTEM.OBJ.ImportDir または %SYSTEM.OBJ.Load を使用する)【親タグ:<Namespace>
】- File:インポートするファイルまたはフォルダ
- Flags:コンパイル・フラグ(参考:フラグおよび修飾子)
- Recurse:再帰的にインポートするかどうかを指定 ※デフォルト:0
- IgnoreErrors:エラー時に続行するかどうかを指定 ※デフォルト:0
<Default Name="Namespace" Value="TESTNMSP"/>
<Default Name="DATADB" Value="${Namespace}-GBL"/>
<Default Name="CODEDB" Value="${Namespace}-RTN"/>
<Default Name="SetupDir" Value="C:\work\git"/>
<Namespace Name="${Namespace}" Code="${CODEDB}" Data="${DATADB}" Create="yes" Ensemble="0">
<!-- グローバル、クラス、ルーチンインポート -->
<Import File="${SetupDir}\Test1" Flags="ck" Recurse="1" IgnoreErrors="1"/>
<Import File="${SetupDir}\Test2" Flags="ck" Recurse="1" IgnoreErrors="1"/>
</Namespace>
■結果(管理ポータル画面)
マニフェストを使用して、グローバルやクラスをマッピングすることもできます。
関連するタグは3種類です。(既出除く)
<GlobalMapping>
:グローバルを現在のネームスペースにマッピングする。【親タグ:<Configuration>
】- Global:グローバル名
- From:グローバルのソース・ネームスペース
<ClassMapping>
:パッケージを現在のネームスペースにマッピングする。【親タグ:<Configuration>
】- Package:マップするパッケージ
- From:マッピングに使用するソース・データベース
<RoutineMapping>
:ルーチンを現在のネームスペースにマッピングする。【親タグ:<Configuration>
】- Name :ルーチン
- Type :ルーチン・タイプ
- From:ルーチンのソース・データベース
<Default Name="Namespace" Value="TESTNMSP"/>
<Default Name="Namespace2" Value="${Namespace}2"/>
<Default Name="DATADB2" Value="${Namespace2}-GBL"/>
<Default Name="CODEDB2" Value="${Namespace2}-RTN"/>
<Namespace Name="${Namespace2}" Code="${CODEDB2}" Data="${DATADB2}" Create="yes" Ensemble="0">
<Configuration>
<!-- DB作成 -->
<Database Name="${DATADB2}" Dir="C:\IRISDB\${Namespace2}\GBL" Create="yes" InitialSize="100" Resource="%DB_${DATADB2}" PublicPermissions="R"/>
<Database Name="${CODEDB2}" Dir="C:\IRISDB\${Namespace2}\RTN" Create="yes" InitialSize="10" Resource="%DB_${CODEDB2}" PublicPermissions="R"/>
<!-- グローバル、クラス、ルーチンマッピング設定 -->
<GlobalMapping Global="test2" From="${DATADB}"/>
<ClassMapping Package="Test2" From="${CODEDB}"/>
</Configuration>
</Namespace>
■結果(管理ポータル画面)
5-4. セキュリティ設定
マニフェストを使用して、ロールやユーザアカウントを複数作成することができます。
関連するタグは2種類です。
<Role>
:ロールを定義する。【親タグ:<Manifest>
】- Name:ロール名
- Description:ロールの説明(カンマ不可)
- Resources:ロールで保持されているリソースと特権。
- RolesGranted:付与されるロール
<User>
:ユーザを定義する。【親タグ:<Manifest>
】- Username:ユーザ名
- PasswordVar:ユーザ・パスワードが含まれる変数の名前(変数名を渡す必要があることに注意)
- Fullname:ユーザのフルネーム
- Roles:ユーザを割り当てるロールのリスト
- Namespace:ユーザの実行開始ネームスペース
- Enabled:ユーザが有効かどうか
- Comment:オプションコメント
- ChangePassword:次回ログイン時にユーザにパスワードの変更を要求するかどうか
- ExpirationDate:それ以降のユーザ・ログインが無効になる日付
<Default Name="TestUserPw" Value="12345"/>
<!-- ロール作成・変更 -->
<Role
Name="TestOperator"
Description="テスト運用者ロール"
Resources="%DB_TESTNMSP-GBL:RW,%DB_TESTNMSP-RTN:RW"
RolesGranted="%Developer"/>
<Role
Name="TestAdministrator"
Description="テスト管理者ロール"
RolesGranted="%All"/>
<!-- ユーザ作成・変更 -->
<User
Username="TestUser1"
PasswordVar="TestUserPw"
Fullname="テストユーザ1"
Roles="TestOperator"
Namespace="USER"
Enabled="1"
Comment="テストユーザ1"/>
<User
Username="TestUser2"
PasswordVar="TestUserPw"
Fullname="テストユーザ2"
Roles="TestAdministrator"
Namespace="USER"
Enabled="1"
Comment="テストユーザ2"/>
■結果(管理ポータル画面)
(ロール)
(ユーザ)
■クラスメソッドの実行(Invoke)
また、管理ポータルのセキュリティ設定をまるっと読み込むこともできます。
これにより、管理ポータルやターミナル等のログインの有効化や、詳細のセキュリティ設定までを一括で行うことができます。
ロールやユーザアカウントについても、この読み込みにより一括で作成することができます。
関連するタグは2種類です。(既出除く)
<Invoke>
:クラス・メソッドを呼び出して、実行結果を変数の値として返す。【親タグ:<Namespace>
】- Class:クラス名
- Method:メソッド名
- CheckStatus:返されたステータスをチェックするかどうか
- Return:結果の書き込み先の変数の名前
<Arg>
:<Invoke>
または<Error>
から呼び出されるメソッドに引数を渡す。【親タグ:<Invoke>
,<Error>
】- Value:引数の値
<Default Name="SetupDir" Value="C:\work\git"/>
<Namespace Name="%SYS" Create="overwrite">
<!-- セキュリティ設定のインポート -->
<Invoke Class="Security.System" Method="ImportAll" CheckStatus="false">
<Arg Value="${SetupDir}\SecurityExport.xml"/>
</Invoke>
</Namespace>
これらのタグは、セキュリティ設定のインポート以外にも様々な用途に使用することができます。
例えば、タスクスケジュール全体のインポートをセキュリティと同じように行ったり、自作のクラスの処理を実行したり、既存のシステムクラスの処理を実行したりなどです。
※管理ポータルのログインの有効化設定については、2024.3以降のバージョンであればマニフェストのタグにて変更することができます。
(ターミナルのログイン有効化については、現在は<Invoke>
を用いる方法か、後述の別途マニフェスト以外のコードを書く方法で実現するしかありません)
具体的には、下記のタグで実現できます。
<CSPApplication>
:クラス内で定義されている 1 つ以上の Web アプリケーションを定義する。【親タグ:<Namespace>
】- AuthenticationMethods:有効な認証方法(例:32=password、64=unauthenticated)
- CSPEnabled:CSP が有効かどうか ※デフォルト:1
- DefaultTimeout:セッション・タイムアウト
- Description:説明
- Directory:CSP ファイルへのパス
- Url:Webアプリケーションの名前
- :
※セキュリティ設定のインポートの事前準備として、管理ポータルのセキュリティ設定(上述の「SecurityExport.xml」にあたるもの)をXMLとしてエクスポートしておく必要があります。
エクスポートは、次のように実施します。
ターミナルで^SECURITY ユーティリティを起動し、12) System parameter setup
> 5) Export All Security settings
を選択します。
そうすると、C:\InterSystems\[IRISインスタンス名]\mgr\SecurityExport.xml
ができているはずです。
(IRISを入れている場所によっては出力場所は異なります)
★4.セキュリティ情報(ユーザ・サービスなど)のインポート
InterSystems 製品の設定内容をインポート/エクスポートする方法 > セキュリティについて
%SYS>Do ^SECURITY
:
Option? 12 // System parameter setup
:
Option? 5 // Export All Security settings
Export ALL security records? Yes => Yes
Export to file name SecurityExport.xml =>
Parameters? "WNS" =>
Confirm export of selected security records to SecurityExport.xml? No => Yes
■結果(管理ポータル画面)
(デフォルトでは管理ポータルのログイン時にパスワード認証はないが、それをマニフェストで有効化した例)
5-5. InterOperability 機能の設定
InterOperability機能を使用する場合、専用のネームスペースを作成することができます。
また、プロダクションを自動的に設定することもできます。
関連するタグは2種類です。<Namespace>
も改めて紹介します。
<Namespace>
:ネームスペースを定義する。【親タグ:<Manifest>
】- Name:ネームスペースの名前
- Create:新しいネームスペースを作成するかどうか(yes/no/overwrite) ※デフォルト:yes
- Code:コード用データベースの指定
- Data:データ用データベースの指定
- Ensemble:InterOperabilityを使用するネームスペースかどうかの指定
<Production>
:プロダクションを定義する。【親タグ:<Namespace>
】- Name:プロダクション名
- AutoStart:プロダクションを自動的に起動するかどうか ※デフォルト:0
<Default Name="Namespace3" Value="ENSNMSP"/>
<Default Name="DATADB3" Value="${Namespace3}-GBL"/>
<Default Name="CODEDB3" Value="${Namespace3}-RTN"/>
<Default Name="SetupDir" Value="C:\work\git"/>
<Namespace Name="${Namespace3}" Code="${CODEDB3}" Data="${DATADB3}" Create="yes" Ensemble="1">
<!-- Database作成などの設定は省略 -->
<!-- グローバル、クラス、ルーチンインポート -->
<Import File="C:\work\git\Test3" Flags="ck" Recurse="1" IgnoreErrors="1"/>
<!-- プロダクションの作成 -->
<Production Name="Test3.job.Main" AutoStart="1" />
</Namespace>
■結果(管理ポータル画面)
6. インストールマニフェスト以外で行う環境設定
マニフェストを作成していると、管理ポータルでは設定できるけどマニフェストではどうやるのだろう?という設定に度々出会います。
公式ドキュメントを見るなどしてマニフェストでの実現方法がわかる場合もありますが、
中にはマニフェストでは実現方法がないもの、後続のバージョンでは修正されたが今使っているバージョンではバグが残っており実現できないもの、
等がある場合があります。
その場合、あきらめて管理ポータルで設定するというのも手ですが、
別途コード化してマニフェストの処理と一緒に実施してしまうのもありです。
実際に、いくつかの設定をマニフェスト以外のコードで実現し、それをマニフェストと一緒に実行するコードの簡単な例をご紹介します。
6-1. ObjectScriptによる実装
下記のコードでは、マニフェストの生成・実行処理であるsetupメソッド(前述のスタジオでの新規作成にて自動作成されるメソッド)を、
自作のsetupExecuteというメソッドでラップしています。
その上で、ロケールの変更や不要タスクの一時停止といった処理をコードで記述し、実行します。
/// <h2>マニフェスト生成・実行処理</h2>
/// <p><pre>SAMPLES>
/// Do ##class(MyApp.MyInstaller).setup()
/// </p></pre>
ClassMethod setup(ByRef pVars, pLogLevel As %Integer = 3, pInstaller As %Installer.Installer, pLogger As %Installer.AbstractLogger) As %Status [ CodeMode = objectgenerator, Internal ]
{
#; XGL ドキュメントでこのメソッドのコードを生成する.
Quit ##class(%Installer.Manifest).%Generate(%compiledclass, %code, "MyManifest")
}
/// <h2>セットアップ開始処理</h2>
/// <p>return %Status</p>
/// <p><pre>SAMPLES>
/// Do ##class(MyApp.MyInstaller).setupExecute()
/// </p></pre>
ClassMethod setupExecute(ByRef pVars) As %Status
{
Set tSC = 0
New $NAMESPACE
Set $NAMESPACE = "%SYS"
#; すでにネームスペースがあるときはManifestの処理はスキップ
If ('##class(%SYS.Namespace).Exists("TESTNMSP")) {
Set tSC = ..setup(.pVars)
}
#; 日本語ロケールへ変更
Do ##class(Config.NLS.Locales).Install("jpuw")
#; 不要なタスクを停止
Do ..SuspendTask()
Return tSC
}
/// <h2>タスク停止</h2>
/// <p>不要なタスクスケジュールを停止する。</p>
/// <p><pre>SAMPLES>
/// Do ##class(MyApp.MyInstaller).SuspendTask()
/// </p></pre>
ClassMethod SuspendTask()
{
Set targetId = -1
Set query = 0
Set query($INCREMENT(query)) = "SELECT %ID,Name FROM %SYS.Task"
Set tStatement = ##class(%SQL.Statement).%New()
Do tStatement.%Prepare(.query)
Set result = tStatement.%Execute()
While (result.%Next()) {
If (result.%GetData(2) = "機能トラッカー") {
Set targetId = result.%GetData(1)
Quit
}
}
If (targetId '= -1) {
#; 機能トラッカーを一時停止
Do ##class("%SYS.TaskSuper").Suspend(targetId)
}
}
これを実行する時は、setupメソッドではなくsetupExecuteメソッドを、ターミナルから実行します。
%SYSネームスペースから実行してください。
USER>ZN "%SYS"
%SYS>Do ##class(MyApp.MyInstaller).setupExecute()
■結果(管理ポータル画面)
(機能トラッカーを一時停止した結果)
6-2. Pythonによる実装
本題からは逸れてしまいますが、「InterSystems Embedded Python」について私は今まで触ったことがなかったため、この機会にチャレンジしてみました。
簡単にですが、その結果と所感について述べたいと思います。
6-1の内容を、Embedded Pythonを用いて書き換えたコードは以下です。
※setupメソッドについては「objectgeneratorメソッド」という特別なメソッドのため、ObjectScriptのみでしか動作しません。そのため、Pythonへの書き換えはできないようでした。
/// <h2>マニフェスト生成・実行処理</h2>
/// <p><pre>SAMPLES>
/// Do ##class(MyApp.MyInstaller).setup()
/// </p></pre>
ClassMethod setup(ByRef pVars, pLogLevel As %Integer = 3, pInstaller As %Installer.Installer, pLogger As %Installer.AbstractLogger) As %Status [ CodeMode = objectgenerator, Internal ]
{
#; XGL ドキュメントでこのメソッドのコードを生成する.
Quit ##class(%Installer.Manifest).%Generate(%compiledclass, %code, "MyManifest")
}
/// <h2>セットアップ開始処理</h2>
/// <p>return %Status</p>
/// <p><pre>SAMPLES>
/// Do ##class(MyApp.MyInstaller).setupExecute()
/// </p></pre>
ClassMethod setupExecute(pVars As %SYS.Python = "") As %Status [ Language = python ]
{
import iris
tSC = 0
# すでにネームスペースがあるときはManifestの処理はスキップ
if not iris.cls('%SYS.Namespace').Exists('TESTNMSP') == 1:
tSC = iris.cls(__name__).setup(pVars)
# 日本語ロケールへ変更
iris.cls('Config.NLS.Locales').Install('jpuw')
# 不要なタスクを停止
iris.cls(__name__).SuspendTask()
return tSC
}
/// <h2>タスク停止</h2>
/// <p>不要なタスクスケジュールを停止する。</p>
/// <p><pre>SAMPLES>
/// Do ##class(MyApp.MyInstaller).SuspendTask()
/// </p></pre>
ClassMethod SuspendTask() [ Language = python ]
{
import iris
targetId = -1
df = iris.sql.exec('SELECT %ID,Name FROM %SYS.Task').dataframe()
for i in range(len(df)):
if df.iloc[i, 1] == '機能トラッカー':
targetId = df.iloc[i, 0]
break
if not targetId == -1:
# 機能トラッカーを一時停止
iris.cls('%SYS.TaskSuper').Suspend(int(targetId))
}
※SuspendTaskメソッドの実行に当たっては、事前にpandasライブラリのインストールが必要です。
未インストールの場合、下記のコマンドを実行してインストールを実行してください。
(IRISを入れている場所によっては対象のパスは異なります)
> cd C:\InterSystems\[IRISインスタンス名]\bin
> irispip install --target ..\mgr\python pandas
Embededd Pythonを少しだけ使用してみた所感としては、
純粋にPythonを書くところは知っている記法をそのまま書けるので苦なく書けましたが、
IRISとの連携部分(IRISのクラスを利用するなどIRIS独自の機能を利用したいとき)は都度書き方を調べる必要があったので少し大変でした。
一度書き方を覚えてしまえばより多くのコードを書く時でも問題なさそうですが、慣れが必要だと思います。
ObjectScriptの記法に慣れていると、ObjectScriptで当たり前にできることがPythonでは実装が難しい、直感的に書けない場合もあるようなので、注意が必要です。
しかし、それを踏まえてもコードをPythonで書けるのは良いと思いました!
Pythonの記法のメリットとしてObjectScriptよりもシンプルに記載できる箇所も多いですし、
前述のPythonでは実装が難しい部分についても、バージョンがあがっていくことで機能は徐々に追加されていくと思いますので、これからに期待ができます。
なにより、ObjectScriptの経験がない人に対しても共通の言語を持てるというのはとても素晴らしいことだと思います。
これを実行する時は、ObjectScriptのときと同じで問題ありません。
%SYSネームスペースから実行してください。
※そうでないと、「Config.NLS.Locales」の実行時にエラーとなります(%SYSにあるパッケージのため)
USER>ZN "%SYS"
%SYS>Do ##class(MyApp.MyInstaller).setupExecute()
7. まとめ
IRIS のインストールマニフェストを使用することで、環境設定の自動化が可能になり、共通の環境を素早く構築できます。
これにより、開発チームの生産性が向上し、人為的なミスも減らすことができそうです。
本記事で興味を持っていただいた方は、ぜひインストールマニフェストを使ってみてください!
以上、ここまでお読みいただきありがとうございました。