2017-09-20 44 views
0

私の欲求不満レベルは10に近づいています。私は数週間前からwixインストーラーに取り組んできました。このインストーラは、当社ソフトウェアの前提条件をインストールします。私はVisual Studioを持っていないので、ビルドファイルを作って(コマンドラインだけを読む)wixプロジェクトを作った。このバンドルには.msi、.msu、および.exeファイルを含む約9つの前提条件があります。Wix ExePackageは、インストール時にDetectCondition、InstallCondition、またはアンインストールに関係なく常にインストールされます。

私の質問は、具体的にチェーン要素で説明されているExePackageに関連しています。 DetectCondition、InstallCondition、InstallおよびUnistallに関係なく、いくつか(ただしすべてではありません)のExePackagesが常にインストールされます。ログファイルにはDetectCondition = trueとInstallCondition = falseが表示されますが、これらの問題のExePackagesは実行され、インストールされます。すべて。時間。

私は過去2週間の不満の中で、ExePackagesはインストーラによって.msiファイルと同じ可視性を許可しておらず、それが私が扱っているものとまったく同じ問題を引き起こす可能性があります。アンインストール時にExePackageがどのように実行され、実際の.exeファイルに適切な内部フラグがない場合、アンインストールの代わりにインストールされることに言及している人を覚えているようです。しかし、私が正しく覚えていれば、それらの答えは彼らの質問には良いものでしたが、特定の条件下でExePackageの実行を完全に防ぐ何かを見つけることができませんでした。

EDIT 1:私はWiXバージョン3.7を使用しています。

私はこれを行う方法についての手がかりを与える例やライフラインを希望します。ここで問題ExePacakgeの例です:あなたの助けを事前に

[0910:0794][2017-09-20T06:30:33]i000: Setting numeric variable 'CHROMEEXISTS' to value 1 
[0910:0794][2017-09-20T06:30:33]i000: Setting version variable 'CHROMEVERSION' to value '51.0.2704.103' 
[0910:0794][2017-09-20T06:30:33]i052: Condition 'CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"' evaluates to true. 
[0910:0794][2017-09-20T06:30:33]i101: Detected package: Chrome, state: Present, cached: None 
[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false. 
[0910:0794][2017-09-20T06:30:34]w321: Skipping dependency registration on package with no dependency providers: Chrome 
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log' 
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleRollbackLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log' 
[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None 
[01B4:0E6C][2017-09-20T06:30:54]i305: Verified acquired payload: Chrome at path: C:\ProgramData\Package Cache\.unverified\Chrome, moving to: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe. 
[01B4:0F1C][2017-09-20T06:31:19]i301: Applying execute package: Chrome, action: Uninstall, path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe, arguments: '"C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe"' 
[0910:0794][2017-09-20T06:31:33]i319: Applied execute package: Chrome, result: 0x0, restart: None 
[01B4:0F1C][2017-09-20T06:31:59]i351: Removing cached package: Chrome, from path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ 
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEEXISTS = 1 
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEVERSION = 51.0.2704.103 
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log 
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleRollbackLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log 

ありがとう:

... 
<Bundle Name='MySoftware' Version='1.0.0.0' Manufacturer='MyCompany' 
    UpgradeCode='{GUID}' 
    Condition='(VersionNT >= v6.1 AND ServicePackLevel >= 1)'> 

    ... 
    <util:FileSearch Id='CheckChromeVersion' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEVERSION' Result='version' /> 
    <util:FileSearch Id='CheckChromeExists' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEEXISTS' Result='exists' /> 
    ... 

    <Chain> 
     ... 
     <ExePackage Id='Chrome' 
      Compressed='yes' 
      SourceFile='.\installers\ChromeStandaloneSetup64-v51.0.2704.103.exe' 
      PerMachine='yes' 
      DetectCondition='CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"' 
      InstallCondition='(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' /> 
     ... 
    </Chain> 
</Bundle> 
... 

そしてここでは、ログファイルからの「クローム」のすべてのインスタンスです。

+0

'InstallCondition'の場合:条件がfalseと評価され、バンドルがインストール、修復、または変更されている場合、パッケージはアンインストールされます。つまり、パッケージをアンインストールする必要がありますが、アンインストールコマンドはありません。私は、バンドルがインストーラを無視しているいくつかのパラメータでインストーラを実行していることを意味すると思います。 'UninstallCommand'を' ChromeStandaloneSetup64-v51.0.2704.103.exe'(それが可能であれば)を取り除くのに必要なパラメータで追加してみてください。 – philselmer

+1

実際には、 'DetectCondition'がfalseと評価された(または省略された)場合にのみバンドルがパッケージをインストールするので、' InstallCondition'を削除できます。 Burnは、この条件を使用してバンドルアクション中にこのパッケージをどのように扱うかを決定します。たとえば、この条件がfalseまたは省略され、バンドルがインストールされている場合、Burnはこのパッケージをインストールします。 – philselmer

+0

ありがとうphilselmer。 InstallConditionの削除は正常に機能しました。ブライアン・サザーランドの答えは正しいと書いてありました。応答していただきありがとうございます。 – Scottlysan

答えて

1

問題は、パッケージをインストールする前に評価するために、あなたのExePackage

条件にInstallConditionによって引き起こされています。パッケージは、条件がtrueと評価された場合にのみインストールされます。条件がfalseと評価され、バンドルがインストール、修復、または変更されている場合、パッケージはアンインストールされます。

ログには、DetectConditionが正しく「True」と評価されているため、バンドルが正しいバージョンのChromeを検出していることがわかります。 InstallConditionがfalseに評価されているが

[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false. 

これは私がどこに選択できる場合に使用されることになっていると思うの条件をインストール

[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None 

を表示するには、この計画のラインを引き起こしシステム上に既に存在するもの、またはブートストラップのUI部分の間にインストールするように選択されたものに基づいて物をインストールしてください。つまり、別のプログラムが既に存在する場合は、このExePackageを使用できます。それ以外のプログラムがインストールされている場合は、それをインストールしないでください(他のプログラムが存在しなくなった場合はアンインストールしてください)。この場合、インストール条件を使用しますが、通常、インストール条件を定義することは有用ではありません。

以下の古い答えは質問には適用されませんが、私は条件で


バージョンの比較は

する必要があり、それを残しておきますので、それはまだバージョン比較条件を持つ人に役立つことができ

CHROMEVERSION gt;= v51.0.2704.103

バージョンのv infrontは、条件を2つのバージョン変数として評価するようにwixに指示します。すべてのRegistrySearch変数は文字列変数で、条件内の変数の比較は変数自体の形式に基づいて評価されます。レジストリ検索は常に文字列であるため、式のもう一方のオペランドによって、どのような比較が行われるかが決まります。

+0

私はRegistrySearchの代わりにFileSearchをやっています。私はインストールログを見て見つけましたが、FileSearchのバージョンは二重引用符で囲む必要があります - 少なくとも私のために働いていたもの。 – Scottlysan

+0

うわー、私は完全にちょうどそれを空白にして、私はちょうど "InstallCondition"を使わないであなたの質問を読んでください。私はブートストラップバンドルでこれを使うことはありません。あなたが期待していることはしません。そして、ファイル検索では、 "バージョン"変数を取得するように見えます。少なくとも1つはバージョンの比較でバージョンが比較されるので、そこにはすべていいです。 –

+0

InstallConditionを削除します - それが役立つかどうかを確認してください。ありがとう。 – Scottlysan

関連する問題