3

この前の質問/回答に従って、wix インストール スクリプトを更新しましたWiX インストーラーのアップグレードを実装するにはどうすればよいですか? . アイデアは、古いバージョンが新しいバージョンを「ダウングレード」するのを防ぐことでした。したがって、次のようなwixファイルの一部があります。

  <Product Id="A_GUID"
    <Upgrade Id="18626be5-521c-4b58-ab8a-54baddf66679">
      <UpgradeVersion
        Property="NEWERVERSIONDETECTED"
        Minimum="$(var.Version)"
        IncludeMinimum="no"
        OnlyDetect="yes"
        ExcludeLanguages="yes"        
        />
     </Upgrade>

     <CustomAction Id="NewerVersionFound" Error="Can't downgrade." />

     <InstallExecuteSequence>
       <Custom Action="NewerVersionFound"
             After="FindRelatedProducts">NEWERVERSIONDETECTED</Custom>
       <RemoveExistingProducts After="InstallInitialize" />
     </InstallExecuteSequence>

私はこれの 2 つのバージョン、たとえば 2.1 と 2.2 を持っています。現在の慣行では、製品 ID GUID (上記の「A_GUID」として表示) をマイナー バージョン (2.x など) と同じに保ち、メジャー バージョンのみを変更することになっています。そのため、1.x から 2.x に移行する際に Guid を変更します。 .

ただし、「$(var.Version)」が変更されているにもかかわらず、製品ガイドが 2.1 と 2.2 で同じままである場合、上記は機能しません。Guid を変更すると、機能します (2.2 から 2.1 へのダウングレードを防ぎます)。

なぜこれが事実なのか疑問に思っていました (私が正しく行っていると仮定して) - これが機能するために 2 ビットの情報 (GUID とバージョン) が必要なのはなぜですか?

Edit1a: Wix には UpgradeCode Guid があり、これは各バージョンで同じままです。Edit1b: 関連する場合、これは古いバージョンの wix (2.x) で行われます。

4

1 に答える 1

4

製品ガイドとは関係ありません。

製品ノードで属性として指定する UpgradeCode に常に関連しています。

<Product Id="*" Name="name" Version="$(var.Version)" UpgradeCode="12345678-55F7-4731-A318-772EF75D2830">

アップグレード ノード内では、(製品 GUID ではなく) upgradecode を探しています。複数の Upgradecode を指定して、ソフトウェアの異なるバージョンを見つけることができます。ただし、upgradecode は通常、製品内で同じままにする必要があります。MS のホームページでベスト プラクティスを参照してください。

    <Upgrade Id="12345678-55F7-4731-A318-772EF75D2830">
        <UpgradeVersion ExcludeLanguages="no" Property="OLDVERSIONFOUND"   
            IgnoreRemoveFailure="yes" MigrateFeatures="no" IncludeMinimum="no"                
            Minimum="0.0.0.0" Maximum="$(var.Version)" IncludeMaximum="no"                
        />
        <UpgradeVersion OnlyDetect="yes" Property="NEWAPPFOUND" IncludeMinimum="yes" Minimum="$(var.Version)" Maximum="99.99.99.99" />
    </Upgrade>

カスタム アクション (既に持っているもの) を使用すると、それに反応します。

 <CustomAction Id="OldAppFound" Error="Newer app of [ProductName] is installed" />

もちろん、シーケンスでそのためのテストをスケジュールする必要があります(あなたもそうしました)

    <InstallExecuteSequence>
        <Custom Action="OldAppFound" After="FindRelatedProducts">NEWAPPFOUND</Custom>
    </InstallExecuteSequence>
    <InstallUISequence>
        <Custom Action="OldAppFound" After="FindRelatedProducts">NEWAPPFOUND</Custom>
    </InstallUISequence>

そして、必要に応じて古いものを削除します(コードにもあります)

    <InstallExecuteSequence>    
        <RemoveExistingProducts After="InstallInitialize" />
    </InstallExecuteSequence>
于 2013-04-05T08:59:47.657 に答える