5

大規模なアプリをインストールしています。その一部は、ターゲット データベースに対して SQL スクリプトを大量に実行するための「DbUpdateManager」と呼ばれるカスタム作成ツールです。

現在、WiX 2.x のインストールは機能していますが、1 つの欠点があります。インストール中に、必要に応じてすぐに開始できる Windows サービスもいくつかインストールします。ただし、DbUpdateManager がまだ実行されていない場合、これらは失敗します。

だから私が達成しようとしているのはこれです:

  1. MSI から DbUpdateManager とサービスをインストールする
  2. サービスを開始する前に DbUpdateManager を実行します。

現在の WiX ソースは次のようになります。

<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
  <!-- DbUpdateManager component with the necessary files -->
  <Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
     <File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe' 
           Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe'  KeyPath='no' />
  </Component>

  <!-- Component to install one of my Windows services -->
  <Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
     <File Id='InstallServiceFile' LongName='MyService.exe' 
           Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/>
     <ServiceInstall Id='InstallMyService' Name='MyService' 
                     Description='My Service' ErrorControl='normal' 
                     Start='auto' Type='ownProcess' Vital='yes' />
     <ServiceControl Id='UninstallMyService' Name='MyService' 
                     Remove='uninstall' Wait='yes' />
  </Component>

  <!-- Feature for the DbUpdateManager referencing the above component -->    
  <Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR' 
           AllowAdvertise='no' Description='DbUpdateManager' Level='1' 
           Title='Database Update Manager'>
     <ComponentRef Id='DbUpdateManagerComponent'/>
  </Feature>

  <!-- Custom action for running DbUpdateManager -->    
  <CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile' 
                ExeCommand='' Return='asyncWait' />

  <!-- Calling the custom action in the install sequence -->    
  <InstallExecuteSequence>
      <RemoveExistingProducts After='InstallInitialize' />
      <Custom Action='RunDbUpdateManagerAction' 
              After='InstallFinalize'>&amp;DbUpdateManager=3</Custom>

私はこの WIX を継承しましたが、動作しますが、前述したように、DbUpdateManager がプロセスの後半で呼び出されるため ("After=InstallFinalize" のみ)、サービスは最初は適切に起動しません (2 回目は正常に実行されます)。 DbUpdateManager の実行後に手動で再起動したときなど)。

MSI のドキュメントを少し調べたところ、「StartServices」と呼ばれる適切な手順が見つかりました。そのため、カスタム アクションの呼び出しを次のように変更することにしました。

   <InstallExecuteSequence>
          <Custom Action='RunDbUpdateManagerAction' 
                  Before='StartServices'>&amp;DbUpdateManager=3</Custom>

残念ながら、この場合、何も起こりません.DbUpdateManagerは決して呼び出されません....

理由はありますか?MSI/WiX のデバッグは本当に大変で、もう木を見て森を見ているようには見えません....

ありがとう!マルク

編集:「RunDbUpdateManagerAction」は、MSIのInstallExecuteSequenceテーブルの正しい位置に配置されます-InstallServicesの直後、StartServicesの直前-それでも機能しません.... DbUpdateManager(Winformsユーティリティ)は実行中に表示されませインストール:-(

編集 2: アクションが適切なタイミングで実行されているように見えます。残念ながら、ウィザードが表示されません :-( 表示されているのは、「MSI サービス開始できませんでした" - wtf ???

MSI (s) (2C:D8) [20:53:36:383]: アクションを実行中: RunDbUpdateManagerAction アクション 20:53:36: RunDbUpdateManagerAction。アクションは 20:53:36 に開始されました: RunDbUpdateManagerAction。MSI (s) (2C:D8) [20:53:36:383]: アクションを実行中: StartServices アクション 20:53:36: StartServices。サービスが開始されています 20:53:36 にアクションが開始されました: StartServices。アクションは 20:53:36 に終了しました: RunDbUpdateManagerAction。戻り値 1631。

4

4 に答える 4

10

さて、私はついにそれを機能させました - 応答したすべての人からの少しの助けと、Web 上の WiX チュートリアルとヘルプ ページのいくつかを参照することによって。MSI インストーラーの内容を理解して習得するのは簡単ではありません......

基本的に、カスタム アクションの実行を「遅延」に変更し (Rob の提案に従って)、実行されるシーケンスのポイントを「After=InstallFiles」に移動しました。また、<Custom> タグの条件を "NOT Installed" に変更しました。これは、私のシナリオでは問題なく機能しているようです。

Rob の懸念に反して、Db Update Manager とその UI はこの方法で非常にうまく表示され、(データベースに依存する) サービスが開始される前に、データベースの更新プロセスが完了しました。

WiX 3.0 (およびその将来) の完全な RTM リリースを楽しみにしています!

皆さんに感謝します。残念ながら、私は 1 つの回答しか受け入れることができませんでした。すべての回答に値するものでした。

マルク

于 2009-04-23T19:36:10.867 に答える
7

CustomAction は、インストールされている「DbUpdateManagerFile」に依存しているようです。つまり、 InstallFiles の実行後に CustomAction をスケジュールする必要があります。InstallExecuteSequence には 2 つのパスがあることに注意してください。最初に、「即時」(または「スケジュールされた」または「スクリプト生成」) アクションが実行され、トランザクション ログ (別名: 「インストール スクリプト」) が作成されます。次に、トランザクション ログ内の「遅延」アクションが実行されます。

現在、CustomAction は「即時」(デフォルト) であるため、ファイルが実際にマシンにコピーされる前に実行しようとしています。InstallFiles アクションは CustomAction の前のスクリプトにありますが、まだ実行されていません。

そのため、ファイルのインストールに CustomAction を実行するには、CustomAction を「遅延」としてマークする必要があります。

注: 延期された CA から UI を表示することはおそらくできません。あなたのこのツールが UI を表示することが期待されているかどうかはわかりませんでした。

PS: うまく説明できなかったらすみません、長い一日でした。

于 2009-04-23T04:39:38.727 に答える
5

インストールのログ ファイルを取得して、そこにあるシーケンスの順序と、カスタム アクションを実行する条件の値を探します。

コマンド ラインでこれを使用します: msiexec /i [msiname] /l*v [ファイル名]

編集: コメントを読んだ後、このページを見てください条件に NOT INSTALLED を追加してみてください。

EDIT2: このページを見つけましたエラー番号 1631 を検索してください

于 2009-04-22T17:34:30.603 に答える
4

Orcaで.msi を開き、InstallExecuteSequence テーブルを見て、実際にどのような順序で処理が行われているかを確認できます。これにより、実際に何がいつ行われているかを把握できます。

于 2009-04-22T17:03:40.287 に答える