CRSアーカイブ¶
CRSアーカイブとは¶
CARファイルのロード¶
CARファイルは、URLによって指し示す場所よりimport文によってロードします。
import car-file-url[ ,version] ;
project.xml¶
CRSアーカイブの属性を記述したxmlファイルです。
Biz/DesignerからCARファイルを生成する場合は指定されたアーカイブ情報に基づき自動的に生成されます。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.opst.co.jp/CRS/2017/project" xmlns:xlink="http://www.w3.org/1999/xlink">
<import src="初期インポートするCRS" />
<carinfo>
<description>アーカイブの説明</description>
<company>作成者、企業名など</company>
<copyright>著作権情報など</copyright>
<carversion>6.0.0</carversion><!-- 現在固定値 -->
<apiversion>対応APIバージョン(参考情報)</apiversion>
<comment>コメント</comment>
<version>CARファイルのバージョン</version>
</carinfo>
</project>
importの動作¶
CARファイルをロードするとき、次の動作が行われます。
(1) キャッシュ
importで指定したURLをキャッシュから検索します。
(2) 既にメモリ上にロードされている別のCARファイルの内部
importで指定したURLを解析し、別のCARファイルの内部を指すURLと識別した場合、 認識したCARファイルをメモリ上から検索し、含まれる指定URLのCARファイルを取り出します。
例えば次のようなケースです
import "http://server/lib1.car";
import "http://server/lib1.car/subdir/lib2.car";
この例では、先にlib1.carがロードされ、つづくimportでlib1.car内部を指すURLでlib2.carが指定されているため、lib2.carはlib1.car内部から検索されます。
(3) WEBサーバなどの外部リソース
上記の検索で、対象CARファイルが見つからない場合、指定URLからのダウンロードを行います。
以上の検索で指定されたCARファイルが見つからない場合、原因を示す例外がスローされ、import処理は中断されます。
CARファイルの整合性維持¶
不正なバージョン管理の例
import "/lib1.car";
var lib_ver = HttpSession.getSession().Get("/lib1.car/ver.txt");
if (lib_ver.Read() != "3.0") {
//.DeleteCache("/lib1.car");
import "/lib1.car";
}
Get("/lib1.car/main.crs");
例外が発生する例
--- file1.crs ---
import "lib1.car","ver1.0";
:
--- file2.crs ---
import "lib1.car","ver2.0";
:
上の例では、後に実行したほうのimport文はバージョン不一致で例外を起こします。
--- file1.crs ---
import "lib1.car";
:
--- file2.crs ---
import "lib1.car","ver2.0";
:
この例では、file2.crsが後に実行された場合、file1.crsが異なるバージョンをロードした時に限って例外を起こします。
CARファイルを使った運用で、最も容易にバージョン管理を行う方法は、import文のバージョン指定ですが、先にあげた例のように、複数のCRSでimportしている場合には、複数のCRSをメンテナンスする必要があり、別の面で非合理的です。
通常のCRSファイルに対するバージョン管理と同じ方法でCARファイルのバージョンを維持することも可能です。
例
--- lib1_version.crs ---
String lib1_version = "2.0.0.1";
--- app.crs ---
String lib1_curVersion = "2.0.0.2";
Get("lib1_version.crs");
if (lib1_curVersion != lib1_version) {
//.DeleteCache("lib1_version.crs");
//.DeleteCache("lib1.car");
Get("lib1_version.crs");
}
import "lib1.car"