こんにちは。 この記事では、InterSystemsCachéでアプリケーションのインストーラを作成する別の方法について説明します。 ここでのアプリケーションとは、1つのアクションでCachéに追加または削除できるさまざまなライブラリまたはユーティリティを意味します。 ユーザーが複数行で構成されるアプリケーションをCachéにインストールするための指示をまだ書いている場合は、今が自動化の時間です。
問題の声明
将来提供するWebベースのCaché用ユーティリティを開発したとします。 もちろん、あらゆる種類の構成の詳細とインストールプロセスの詳細な指示をインストールするユーザーを邪魔しないようにします。 さらに、これらの指示はすべて、Cachéを知らない可能性のある、できるだけ詳細で使いやすいものにする必要があります。 Webユーティリティの場合、インストール中に、ユーザにユーティリティクラスをCachéにインポートするだけでなく、少なくともWebアプリケーションを構成してアクセスするように要求する必要があります。
もちろん、これらのすべてのアクションをプログラムで実行することは難しくありません。CachéObjectScriptを使用してWebアプリケーションを作成する方法を 1回だけ扱う必要があります。 ただし、この場合でも、たとえば、ターミナルを介してインストールスクリプトを実行するようにユーザーに要求する必要があります。
1回のインポートでインストール
Cachéには、配信時の1つのアクション(クラスパッケージのインポート)に制限する機会があります。 これで十分です-ユーザーは、XMLファイルをクラスパッケージと共にインポートするだけでよくわかります。
- ドラッグアンドドロップを使用して、XMLファイルをStudioエリアにドラッグアンドドロップするだけです。
- 管理ポータル経由:ブラウザ->クラス->インポート。
- ターミナル経由: do $ system.OBJ.Load( "C:\ FileToImport.xml"、 "ck") 。
この場合、クラスのコンパイル時間はインストールされるコードが実行されます。 さらに、ユーザーがインストールしたアプリケーション(パッケージ)が気に入らず、アンインストールした場合、いわゆる「逆コンパイル」で任意のコードを実行して、インストール中に実行されたアクションをロールバックする機会があります。
プロジェクション作成
Cachéコンパイラの動作を拡張する、つまりクラスをコンパイルおよび「逆コンパイル」するときに任意のコードを実行することにより、ユーザーにインストールするパッケージにプロジェクションクラスを作成できます。 これは%Projection.AbstractProjectionを継承し、クラスがコンパイルされるときに実行されるCreateProjectionと、クラスが再コンパイルおよび削除される前に実行されるRemoveProjectionをオーバーライドするクラスです 。
通常、このクラスはインストーラーと呼ばれます。 MyPackageアプリケーションのこのようなクラスの例を見てみましょう。
Class MyPackage.Installer Extends %Projection.AbstractProjection [ CompileAfter = (Class1, Class2) ] { Projection Reference As Installer; /// This method is invoked when a class is compiled. ClassMethod CreateProjection(cls As %String, ByRef params) As %Status { write !, "Installing..." } /// This method is invoked when a class is 'uncompiled'. ClassMethod RemoveProjection(cls As %String, ByRef params, recompile As %Boolean) As %Status { write !, "Uninstalling..." } }
ここでの動作は次のように説明できます。
- パッケージを初めてインポートすると、 CreateProjectionメソッドのみが実行されます。
- MyApp.Installerクラスを再コンパイルするか、このクラスを既存のクラスに「インポート」すると、古いクラス(以前にコンパイルされた)のrecompile = 1パラメーターで RemoveProjectionメソッドが呼び出され、新しいクラス(ロードされた)のCreateProjectionメソッドが実行されます;
- パッケージ(およびクラスMyApp.Installer)を削除する場合、 recompile = 0パラメーターを指定したRemoveProjectionメソッドのみが呼び出されます。
以下に注意することも重要です。
- CompileAfterクラスのキーワードには、投影クラスのメソッドを実行する前にコンパイル(または削除)を待機する必要があるアプリケーションのクラス名のリストが含まれています。 他のクラスのコンパイル中にエラーが発生した場合、プロジェクションクラスのコードは実行されないため、 常にこのリストにアプリケーションのすべてのクラスをリストすることを強くお勧めします。
- どちらのメソッドも最初のclsパラメーターを受け入れます。これはクラスの名前です。この場合、常に「MyApp.Installer」になります。 実際、このような「インストーラー」は、アプリケーションのクラスごとに個別に作成し、 %Projection.AbstractProjectionを継承するクラスから継承することができます。 この場合にのみ、このパラメーターを使用するのが理にかなっていますが、私たちの目的のためには、これを行うべきではありません。
- 両方のメソッドは、2番目のparamsパラメーターを受け入れます。これは、現在のコンパイル設定に関する多くの追加情報と、「パラメーター名」-「値」の形式の現在のクラスのパラメーター値のセットを含む連想配列です。 zwrite paramsを実行すると、 paramsに含まれる内容をより詳細に確認できます。
- RemoveProjectionメソッドは、クラスが削除されて再度コンパイルされない場合にのみ、 0に等しい再コンパイルパラメーターを受け入れます。
%Projection.AbstractProjectionクラスには、オーバーライド可能な他のメソッドも含まれていますが、これらのメソッドはタスクにはまったく必要ありません。
例
次に、ユーティリティ用のWebアプリケーションを作成するタスクをもう少し詳しく見てみましょう。 単純なケースをシミュレートします-Webブラウザーで開こうとすると、 「私はインストールされました!」と答えるRESTアプリケーションがあるとします。 このようなアプリケーションを作成するには、それを記述するクラスを作成する必要があります。
Class MyPackage.REST Extends %CSP.REST { XData UrlMap { <Routes> <Route Url="/" Method="GET" Call="Index"/> </Routes> } ClassMethod Index() As %Status { write "I am installed!" return $$$OK } }
クラスが作成されましたが、管理ポータルを介してこのWebアプリケーションを登録する必要があります。 これがどのように行われるかは、この記事の冒頭の写真に示されています。 これらの手順を実行した後、この段階でアドレスhttp:// localhost:57772 / myWebApp / (1.末尾のスラッシュが必要です。2。ポート57772が異なる場合があります。システム、管理ポータルを表示したポートと同じになります)。
もちろん、 CreateProjectionメソッドをオーバーライドしてWebアプリケーションを作成し、 RemoveProjectionメソッドをオーバーライドして削除することにより、このWebアプリケーション作成ルーチン全体を自動化できます。 最も単純な場合の投影クラスは次のようになります。
Class MyPackage.Installer Extends %Projection.AbstractProjection [ CompileAfter = MyPackage.REST ] { Projection Reference As Installer; Parameter WebAppName As %String = "/myWebApp"; Parameter DispatchClass As %String = "MyPackage.REST"; ClassMethod CreateProjection(cls As %String, ByRef params) As %Status { set currentNamespace = $Namespace write !, "Changing namespace to %SYS..." znspace "%SYS" // %SYS, Security.Applications write !, "Configuring WEB application..." set cspProperties("AutheEnabled") = $$$AutheUnauthenticated // set cspProperties("NameSpace") = currentNamespace // , set cspProperties("Description") = "A test WEB application." // set cspProperties("IsNameSpaceDefault") = $$$NO // set cspProperties("DispatchClass") = ..#DispatchClass // - return ##class(Security.Applications).Create(..#WebAppName, .cspProperties) } ClassMethod RemoveProjection(cls As %String, ByRef params, recompile As %Boolean) As %Status { write !, "Changing namespace to %SYS..." znspace "%SYS" write !, "Deleting WEB application..." return ##class(Security.Applications).Delete(..#WebAppName) } }
この例では、 MyPackage.Installerクラスがコンパイルされるたびに、Webアプリケーションが作成され、「逆コンパイル」によって削除されます。 もちろん、削除または作成する前にWebアプリケーションが存在するかどうかのいくつかのチェックを追加するのは良いことですが( ##クラス(Security.Applications).Exists(「名前」) )、例の単純化のために、読者に任せましょう宿題が好きです。
この段階では、 MyPackage.RESTクラスとMyPackage.Installerクラスを作成した後、クラスを単一のXMLファイルとしてエクスポートし、このファイルを全員と共有できます。 次に、XMLファイルをインポートおよびコンパイルするときにWebアプリケーションが自動的に作成されます。残りの作業は、指示で指定したアドレスに移動することだけです。
この記事で検討した、自身をインストールするアプリケーションの例は、 ここからダウンロードでき、すぐに「インストール」を試みることができます。
まとめ
Habrにも記述されている%Installerシステムクラスを使用してアプリケーションをインストールする方法とは異なり、プロジェクションクラスを介したインストールには、次の大きな違いがあります。
- 純粋なCachéObjectScriptのみが使用されます。 %Installerの場合、かなりのドキュメントで説明されている特定のマークアップでxDataブロックを埋める必要があります。
- インストール方法は、アプリケーションのクラスをインポートしてコンパイルした直後に実行され、個別に呼び出す必要はありません。
- クラス(パッケージ)が削除されると、削除メソッドが自動的に実行されます。これは、%Installerを使用してアプリオリに実装することはできません。
アプリケーションの提供に対するこのアプローチは、私のプロジェクト( CachéWEBターミナルとCachéクラスエクスプローラー )で既に使用されています 。 実装されたInstallerクラスの例を見ることができます。
最後に、インターシステムズのエンジニアのコミュニティが、NodeJS(npm)、Ruby(RubyGems)などのプラットフォーム用に長い間存在してきたPackage Managerの実装を実験していることを付け加えます。 このツールを使用すると、1つのコマンドを使用して、パッケージおよびアプリケーション( CachéのWebターミナルなど)をインストールおよび構成できます。 それまでの間、InterSystemsCachéおよびEnsembleのソースコード付きの新しいアプリケーションは、 このリポジトリにあります 。