WixFailWhenDeferred カスタムアクション

MSI で (システム状態を変更するカスタムアクションである) deferred custom actions を オーサリングしている時、MSI が失敗してロールバックする 場合に備えて システム状態変更をアンドゥするのに、同等な 一連のロールバック カスタム アクションを提供する事も 必要です。ロールバック動作は 通常、MSI がインストールされているのか 修復されているのか アンインストールされているのか に依存して 異なって作動する必要が あります。これは、一連の遅延カスタムアクションが 成功した場合も失敗した場合も 期待した 通りに働いている事を 確かめるのに、以下のシナリオが それらをコーディングしてテストして いる時に 説明される必要があることを 意味しています:

  1. インストール 成功
  2. インストール 失敗
  3. 修復 成功
  4. 修復 失敗
  5. アンインストール 成功
  6. アンインストール 失敗

失敗の場合は たいてい、カスタムアクション コードを直接にユニットテストする事で シミュレートするのが 難しいものです。なぜなら、遅延カスタムアクション コードは 通常、アクティブなインストールセッション中 Windows Installer によって提供される 状態インフォメーションに依存しているからです。結果として、このタイプのテストは たいてい、 本物のインストールシナリオ中に 適切な時に実行されるロールバック カスタムアクションを 生じさせる為に fault injection を必要とします。

WiX は、MSI でロールバック カスタムアクションをテストするのを より簡単にする事を助けるのに WixFailWhenDeferred と呼ばれる シンプルな遅延カスタムアクションを 含んでいます。 WixFailWhenDeferred は、MSI のインストール、修復、アンインストールの間に実行される時、 常に 失敗します。WixFailWhenDeferred カスタムアクションを あなたの MSI に追加する事は、 ロールバック カスタムアクションをテストするのに MSI に容易に失敗を導入する事を 可能にします。

MSI でロールバック カスタムアクションをテストする為に WixFailWhenDeferred カスタム アクションを使うには、3ステップ 必要です:

Step 1: プロジェクトに WiX utilities extensions library を追加する

WiX の WixFailWhenDeferred についてのサポートは、WiX extension library に含まれていて、 使用する前に プロジェクトに追加されなければ なりません。もし コマンドラインで WiX を使って いるなら、light.exe のコマンドラインに 以下を追加する必要があります:

light.exe myproject.wixobj -ext WixUtilExtension

もし Votive を使っているなら、Add Reference dialog を使って extension を追加する事が できます:

  1. Visual Studio で Votive プロジェクトを 開く
  2. ソリューション エクスプローラーでプロジェクトを右クリックして、Add Reference... を選ぶ
  3. リストから WixUtilExtension.dll アセンブリを選んで、追加をクリックする
  4. Add Reference dialog を 閉じる

Step 2: WixFailWhenDeferred カスタムアクションへの参照を 追加する

WixFailWhenDeferred カスタムアクションへの参照を 追加するには、WiX セットアップ オーサリングで 以下をインクルードします:

<CustomActionRef Id="WixFailWhenDeferred" />

これは WiX に、MSI に WixFailWhenDeferred カスタムアクションを追加させ、 InstallFinalize アクションの前に いますぐスケジュールに入れさせ、プロパティが WIXFAILWHENDEFERRED=1 である場合だけ実行する様に 条件付けさせます。

Step 3: MSI をビルドして 様々なシナリオをテストする

WixFailWhenDeferred カスタムアクションは、 Windows Installer public property ( 英語 ) WIXFAILWHENDEFERRED=1 の時にだけ実行するように 条件付けられています。WixFailWhenDeferred カスタムアクションへの参照を付けて MSI を ビルドした後、一連のスタンダードなインストールとロールバック テスト シナリオを シミュレートするのに、以下のセットのコマンドラインを使う事ができます:

  1. スタンダードなインストール: msiexec.exe /i MyProduct.msi /qb /l*vx %temp%\MyProductInstall.log
  2. インストールのロールバック: msiexec.exe /i MyProduct.msi /qb /l*vx %temp%\MyProductInstallFailure.log WIXFAILWHENDEFERRED=1
  3. スタンダードな修復: msiexec.exe /fvecmus MyProduct.msi /qb /l*vx %temp%\MyProductRepair.log
  4. 修復のロールバック: msiexec.exe /fvecmus MyProduct.msi /qb /l*vx %temp%\MyProductRepairFailure.log WIXFAILWHENDEFERRED=1
  5. スタンダードなアンインストール: msiexec.exe /x MyProduct.msi /qb /l*vx %temp%\MyProductUninstall.log
  6. アンインストールのロールバック: msiexec.exe /x MyProduct.msi /qb /l*vx %temp%\MyProductUninstallFailure.log WIXFAILWHENDEFERRED=1