2

私は2つの要件を持つWIXインストーラーを書いています:

  1. アップグレードルールを実装します(<MajorUpgrade>または<Upgrade>テーブルで正常に実行しました
  2. 現在のバージョンと並行して古いバージョンを強制的にインストールする方法を維持します(したがって、アップグレードしないでください)。

問題は2番目の要件に起因します。アプリのすべてのバージョンに同じUpgradeCodeがある場合、システムは古いものを削除し(同じUpgradeCodeを使用)、新しいものをインストールします。

それで、古いバージョン(デフォルト)をアップグレードして、ユーザーに並列インストールを強制させることは可能ですか?私が持っている解決策の1つは、MSIをインストールするときにUpgradeCodeを変更することです。この場合、2つのバージョンは完全に独立しています。それが私が望んでいることです。

しかし、インストール段階で別のUpgradeCodeを指定する方法が見つかりませんでした。試しmsiexec /i app.msi UpgradeCode="{60C200E9-E317-4a67-9CC1-7BF156DEF4FD}"ましたが、ログによると、UpgradeCodeプロパティは適切に取得されますが、MSIを構築するときにGUID指定を使用します。

MSIをインストールするときにUpgradeCodeを強制する方法はありますか?

参考までに、私のWixファイルは次のように構成されています。

<?define ProductUpgradeCode = "32318521-631C-4064-88C6-4A54FAA3B383"?>
[...]
<Product Name='App' Id='*' UpgradeCode='$(var.ProductUpgradeCode)'
Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='App inc'>
[...]
<MajorUpgrade AllowDowngrades="yes" Schedule="afterInstallInitialize" />

編集-ソリューション、Ciprianの回答に基づく:

まず、ALLOWUPGRADEデフォルト値を次のように設定してプロパティを定義しますYes

<Property Id="ALLOWUPGRADE" Value="Yes" />

次に、のアクションを条件付けして、次<InstallExecuteSequence>の場合にのみ古いバージョンをアンインストールしますALLOWUPGRADE=Yes

<RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts>

さらに、アップグレードするか並列インストールするかをユーザーに尋ねるダイアログを追加することをお勧めします。ボタンParallelInstallBtnを押すと、プロパティ値がに変更されNoます。このダイアログは、セクションFindRelatedProductsによって古いバージョンが検出された後に呼び出されます。UpgradeVersion

<UI>
  <Dialog Id="InstallDlg" Width="370" Height="270" Title="[ProductName] Setup" NoMinimize="yes">
    [...]
    <Control Id="ParallelInstallBtn" Type="PushButton" X="280" Y="243" Width="80" Height="17" Default="no" Text="&amp;Parallel Install">
      <Publish Property="ALLOWUPGRADE" Value="No">1</Publish>
      <Publish Event="EndDialog" Value="Return">1</Publish>
    </Control>
  </Dialog>
  <InstallUISequence>
    <Show Dialog="InstallDlg" After="FindRelatedProducts">OLDERVERSIONBEINGUPGRADED</Show>
  </InstallUISequence>
</UI>
4

1 に答える 1

3

これを行うには、 RemoveExistingProductsアクションを調整します。

 <InstallExecuteSequence> 
      <RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts> 
 </InstallExecuteSequence> 

デフォルトでは、ALLOWUPGRADE プロパティの値は「Yes」です。アップグレードを実行する必要がない場合は、変更してください。

于 2012-05-10T05:44:50.537 に答える