2017-08-28 10 views
0

私はかなりWiXを初めて使っていますので、私は非常にストレートなものを求めているかもしれませんが、私はそれをグーグルで見つけられませんでした。WiX:別のCustomActionの結果に基づくカスタムアクション

CA2の実行は、CA1の結果に以下のようなものを依存し、私は2 customActions、たとえば、CA1およびCA2を実行したい

、:

if (ca1 == SUCCESS) 
{ 
    Perform ca2 
} 

私CA1が成功を返すのであればCA2にのみ(実行する必要がありますdoesntは失敗する)。

WiXでこれを行う最も簡単な方法は何ですか?

答えて

5

あなたの説明はデフォルトです。カスタムアクションが失敗した場合、インストールは中止され、後でロールバックアクションのみが実行されます。あなたの疑問を理解するには、最初に、最初のカスタムアクションで失敗を無視するか、またはマスクする必要があります。

第2に、MsiDoAction(またはそのラッパー)を呼び出して、あるアクションが別のアクションの戻り値を知る唯一の方法です。そうすることで、カスタムアクション間の線がぼやけてしまうので、私が想定しているシナリオではないと想定します。

3つ目の最終的な方法として、外部の通信チャネルを見つけることができます。私は即座に行動するために、成功したときにca1がプロパティを設定することを提案します(MsiSetPropertyまたはDTFのセッション[プロパティーのようなラッパー)、ca2は(MsiGetProperty/MsiEvaluateCondition)を読むか、そのプロパティの値に対して直接調整されます。遅延アクションの場合、プロパティは伝播しないため、他のチャネルを特定する必要があります。 (おそらく、そのパスがあらかじめ選択されている一時ファイルが動作するかもしれません)。

しかし、シナリオ全体はWindowsインストーラでは珍しいです。私はそれを避けることをお勧めします。おそらく、シーケンスに戻ってくる前に、あらゆる障害シナリオを「内部的に」処理できるように、アクションをマージしてください。あるいは、あなたの行動の詳細がより具体的な提案につながるかもしれません。

+0

お返事ありがとうございます。それは、ca1が失敗した場合、インストールを中断してロールバックしたくないということです。ca2の失敗に対してca2は実行されません。 ca1アクションとca2アクションの両方が即座に行われるので、第3の方法を使用するのが方法だと思います。だから、どのように私はca1の結果に基づいてプロパティを設定する..任意のサンプルコードですか? – foobar

+0

具体的には、ca1では、Windowsファイアウォールサービスが有効になっているかどうかを確認したいのですが、ca2ではファイアウォールの例外リストに例外としてアプリケーションを追加します。 – foobar

+0

1つのCAによって書き込まれたHKLMキーは、2番目のCAによって読み取られますか?遅延モードでも?私はそのような構造物を使ったことは一度もありません。私には少し「配備臭い」と思われます。どちらの場合でも、WiXのファイアウォール機能を試してみるべきだと思いますか? –

0

最初のカスタムアクションでプロパティを設定してください。その後、そのプロパティが存在するか、または期待値に設定されている場合にのみ、2番目のカスタムアクションを実行します。

+0

ありがとうございます。カスタムアクションを使用してプロパティを設定します。 – foobar

2

即時モードカスタムアクションを使用してシステムを変更してはなりません。昇格された権限を持つ制限されたユーザーによってセットアップが実行されると、これらの設定は正しく実行されません(即時モードのアクションは昇格しない、常にユーザーを偽装するため、変更しようとするものはアクセスが拒否されます)。さらに、シーケンシングに応じて(たとえば、セットアップGUIから呼び出しようとした場合など)、サイレント実行モードで実行できないことがあります。

マイケル・ウーマン氏が語っている別の「外部通信チャネル」は、HKLMのレジストリキーで、書き込んだり、読み込んだりすることができます。

しかし実際の解決方法は、WiXの内蔵ファイアウォール機能を試すことです。これは、知識のあるMSIの専門家によって信頼できる形で書かれ、適切なロールバックをサポートします。それは、誰もが自分の上に転がることができるものに非常に優れていることになります。 http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

+0

あなたの入力のためにありがとうございます。既に、プロジェクトで使用されているC++で書かれたファイアウォールDLLがあるので、変更する権利はありません。しかし、あなたの答えが他の誰かを助けることを願っています。 – foobar

+1

OK、前述のとおり、即時モードでカスタムアクションを実行しないでください。制限付きのユーザーが昇格した権限でインストールする企業展開の問題があります。また、カスタムアクションをセットアップGUI(InstallUISequence)にのみ挿入しないでください。セットアップがサイレントモードでインストールされると、このシーケンスは完全にスキップされます。 InstallExecuteSequenceに挿入された遅延カスタムアクションを使用する必要があります。別の答えが好きな人には、これが動作することをテストする方法についていくつかの詳細を述べることができます。 –

1

WiXのドキュメントからhere

<InstallExecuteSequence> 
     <Custom Action='FooAction1' After='InstallFiles'/> 
     <Custom Action='FooAction2' After='FooAction1' Condition='FOOACTION1SUCCESS'/> 
    </InstallExecuteSequence> 

FooAction1のコードでプロパティMsiSetProperty( 'FOOACTION1SUCCESS'、 '1')を設定しました FOOACTION1SUCCESSプロパティが設定されている場合にのみFooAction2が実行されます。しかし、実際にマイケル・ウーマンの反応は正しい。 1つのカスタムアクション内で例外をすべて処理する必要があります。

関連する問題