web-dev-qa-db-ja.com

すべてのファイルをインストールしないwixメジャーアップグレード

いくつかのファイル(.NETプログラムバージョン6.0.0.0)をインストールする非常に単純なWiXプロジェクト(バージョン3.7)があります。 WiXのMajorUpgrade機能を使用して新しいバージョン6.0.1.0をリリースする準備ができました。

Product要素でUpgradeCodeを同じに保ち、バージョンを6.0.0.0から6.0.1.0に変更します

<Product Id="*" Name="MyApp" Version="6.0.1.0" Manufacturer="Me" 
       UpgradeCode="$(var.TheUpgradeCodeGUID)">

6.0.0.0がインストールされているマシンで、新しいインストーラーを実行します。

古いバージョン6.0.0.0の削除は正常に実行されます(インストールされているすべてのファイルが削除されます)が、インストーラーが新しいバージョンをインストールし続けると、2つのファイルが失われます:サードパーティDLLおよびサードパーティのEXE(変更されていない)は再インストールされていません。

<Component Id="AutomaticUpdaterWPF.dll" Guid="*">
        <File Id="AutomaticUpdaterWPF.dll" Source="AutomaticUpdaterWPF.dll" KeyPath="yes" Checksum="yes" />
</Component>
<Component Id="wyUpdaterProgram" Guid="*">
        <File Id="wyUpdaterProgram" Source="wyUpdate.exe" KeyPath="yes" Checksum="yes" />
</Component>

<ComponentGroup>内の他のすべてのファイル(一部は変更済み、一部は未変更(他のサードパーティDLLを含む))は、メジャーアップグレード中に正しくインストールされています。

メジャーアップグレード後に「修復」をクリックすると、2つの欠落しているファイルが再表示されます。また、バージョン6.0.1.0を初めてインストールする場合(アップグレードはありませんが、最初にクリーンなマシンにインストールします)、これら2つのファイルは直接正常にインストールされます。 (いくつかのWindowsマシン(XP、7、および8)でテスト済み)

誰かが何が間違っているのか、そしてそれを修正する方法について何か提案はありますか?

31
Robbie

提供されたログファイルは、すでにマシン上にあるいくつかのファイルの新しいバージョンを示しています。

MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {015A4DC1-56F4-562B-96B5-B3BE0D45FA5F} since the same component with higher versioned keyfile exists
MSI (s) (0C:5C) [16:13:25:890]: Disallowing installation of component: {4B6A1404-3892-5BEF-AB47-8FE3149211A4} since the same component with higher versioned keyfile exists

私は過去にこのアップデーターでこの問題を見てきました。クリストファーは正しいです。アップデーターはファイルを更新しましたが、MSIに通知しませんでした(MSIを更新しません。これは正しいことではありません)。新しいMSIは、新しいものがマシン上にあると見なし、ファイルをインストールしないことを選択しますが、アップグレード中に古いパッケージがファイルを削除します(バージョンが新しいことに気づきません)。新しいインストーラーがファイルをインストールしないことを選択したので、修復するまで何もありません。

この問題を回避するには、後でRemoveExistingProductsアクションを移動する必要があります。 MajorUpgrade要素を使用している場合は、Schedule='afterInstallExecute'またはSchedule='afterInstallFinalize'トリックを行う必要があります。 コンポーネントルール にはもっと注意する必要があります。

また、サードパーティベンダーであるIMHOは、MSIの外部でファイルを更新しないでください。彼らの決定は、あなたの製品を特定のアップグレード方法に強制することです。

27
Rob Mensching

ログファイルが役立ちます。私の推測では、RemoveExistingProductsをスケジュールした場所に基づいています。 Costingが、インストールされているファイルがすでにインストールされているファイルと同じであると判断し、そのファイルをインストールしないことを決定する状況を見てきました。その後、メジャーアップグレードが発生し、ファイルがなくなります。ファイルが存在せず、コストがそれをインストールする必要があることを認識しているため、修復は機能します。

5

この問題には別の解決策がありましたが、前の返信は確かに正しい方向を示していました。 .NETプロジェクトのDLLには、以前のインストールよりも低いバージョン番号が割り当てられていました。 AssemblyInfo.csファイルに移動し、3番目のオクテットを0から1にインクリメントすると、問題が解決しました。 WixはDLLを新しいものとして認識しました。

[Assembly: AssemblyVersion("1.0.1.*")]
2
user3589909

古いバージョンのWindowsインストーラーでは、問題はここに記載されています。

https://support.Microsoft.com/en-us/kb/905238

影響を受ける製品のリストは、MSIエンジン4.0以降で修正されていることを示しています。 OSバージョンに該当する場合は、インストールを実行する前に4.5再配布可能ファイルを使用すると役立つはずです。

0
PhilDW

エラーはインストーラー5.0にまだ存在し、まだ問題です。 RemoveExistingProductの後にInstallFinalizeを配置する回避策は、私たちにとって解決策ではありません。単一ファイルのプロパティ設定による更新を強制しました。

このソリューションは今私たちのために働いています。

0
Jonnyo