web-dev-qa-db-ja.com

Wixにプログラムの以前にインストールされたバージョンを更新させる方法

Wixでインストールプログラムを作成しましたが、プログラムを正常にインストールできました。今、私はそれを更新する必要があるので、バージョン番号を上げましたが、古いプログラムの上に新しいプログラムをインストールしようとすると、古いバージョンが既にインストールされていると不平を言い、最初にアンインストールするように指示します。

再インストールする前に、更新または自動アンインストールする方法を教えてください。

64
EddieD

提供された答えはどれも完全または自己完結型ではないと感じているため、この沼地を掘り進んだ後、アップデートの(完全に自明の)要件を機能させるために必要な手順は次のとおりです:

  1. ビルドするたびに製品IDが変更されることを確認してください。そうしないと、OPが言及した「インストール済み」メッセージが常に表示されます。

    <Product Id="*" ...>
    
  2. 製品自体が変更されるたびに、製品バージョンを変更します。最適なオプションは、アセンブリバージョンにバインドすることです(自動インクリメントも必要)が、もちろん手動で変更することもできます。ポイント4でAllowSameVersionUpgrades属性を使用する場合、この手順は厳密には必要ありませんが、製品のバージョンを一定に保つことはいずれの場合でも悪い習慣であると言いたいと思います。

    <Product Version="!(bind.FileVersion.MyAssemblyDll)" ...>
    <File Id="MyAssemblyDll" Name="$(var.001_Application.MyAssembly.TargetFileName)" Source="$(var.001_Application.MyAssembly.TargetPath)" />
    
  3. UpgradeCodeを一定に保ちます(例):

    <Product UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be" ...>
    
  4. MajorUpgrade要素を追加します(Wix 3.5.1315.0から)。 MajorUpgradeが製品バージョンのリビジョン番号の変更を無視するというキャッチを回避するには、AllowSameVersionUpgrades(またはAllowDowngradesを好む場合)属性を追加します。このようにして、例えばからアップグレードすることができます。 1.0.0.7から1.0.0.8へ。 1.0.7.0から1.0.8.0だけではありません。これを行わないと、プログラムと機能に複数のインストールが表示される場合があります。

    <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    

ここに私の全体の.wixファイルがあります(関連部分、製品のバインドに使用されるアセンブリにつながる2つのフラグメントはほとんどオプションであり、説明のために、アセンブリを取得する方法はすべて機能します)。

<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="!(bind.FileVersion.MyAssemblyDll)"?>
<?define UpgradeCode="f4d7f199-28f6-45d5-ad99-7c62938274be"?>

<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.Microsoft.com/wix/NetFxExtension">
  <Product
    Id="*"
    Name="My Product's name"
    Language="1033"
    Version="$(var.ProductVersion)"
    Manufacturer="My company"
    UpgradeCode="$(var.UpgradeCode)"
    Codepage="1252">

    <Package
      InstallerVersion="200"
      Compressed="yes"
      InstallScope="perUser"
      Description="My product description"
      Manufacturer="My company"
      Languages="1033"
      SummaryCodepage="1252"
      InstallPrivileges="limited" />

    <MajorUpgrade AllowSameVersionUpgrades="yes" 
                  DowngradeErrorMessage="A newer version of [ProductName] is already installed. If you are sure you want to downgrade, remove the existing installation via Programs and Features." />

  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="LocalAppDataFolder">
        <Directory Id="INSTALLFOLDER" Name="My Install Dir" >
          <Component Id="INSTALLFOLDER" Guid="f6ba8a12-6493-4911-8edd-dce90e1d8e8b" >
            <RemoveFolder On="both" Id="INSTALLFOLDER"/>
            <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="My Registry value" />
          </Component>
        </Directory>
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" >
      <Component Id="ProductComponent" Guid="1939f0f5-19f6-498b-bf95-8f1c81501294" DiskId="1" Directory="INSTALLFOLDER" >
        <File Id="MyAssemblyDll" Name="$(var.001_MyApplication.MyAssembly.TargetFileName)" Source="$(var.001_MyApplication.MyAssembly.TargetPath)" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>
86
Mike Fuchs

上記のすべての投稿を確認し、stillこれを機能させるために何年も費やしました。

ステップ3の 公式HOWTOアップグレードhintは大いに役立ちました:新しいProduct/@Idが必要です「この製品の別のバージョンが既にインストールされています」というメッセージを無効にします。

このアップグレードセクションを使用しました(製品の子):

<Upgrade Id="$(var.UpgradeCode)">
  <UpgradeVersion Minimum="1.0.0"
                  IncludeMinimum="yes"
                  OnlyDetect="no"
                  Maximum="$(var.Version)"
                  IncludeMaximum="no"
                  Property="PREVIOUSFOUND" />
</Upgrade>

OnlyDetectが「no」に設定されていることに注意してください。次のセクションがある場合(製品の子)、これにより古いバージョンの削除がトリガーされます。

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallInitialize"/>
</InstallExecuteSequence>

また、明らかに、バージョン番号の最初の3つのコンポーネントのみがアップグレードの確認に使用されることに注意してください...

39
Daren Thomas

アップグレードテーブルを使用する必要があります。

<Upgrade Id='15E2DAFB-35C5-4043-974B-0E342C25D76A'>
    <UpgradeVersion Property='OLDVERSIONFOUND' IncludeMinimum='no' Minimum='0.0.0.0' />
</Upgrade>

アクションも追加する必要があります。

<InstallExecuteSequence>
    <LaunchConditions After='AppSearch' />
    <RemoveExistingProducts After='InstallValidate' />
</InstallExecuteSequence>

チュートリアルはこちら

7
Bernd Ott

これを試してみたところ、うまくいきました。

  1. 製品タグを次のように配置します:

    製品Id = "*" Name = "Something" Language = "1033" Version = "1.0.0.0" Manufacturer = "Someone" UpgradeCode = "43ab28d7-6681-4a05-a6b5-f980733aeeed"

製品IDを*に設定して、プロジェクトをビルドするたびに異なるIDが取得されるようにする必要があります。

  1. Package要素内にMajorUpgradeタグをネストします:

    MajorUpgrade AllowDowngrades = "no" DowngradeErrorMessage = "[ProductName]の新しいバージョンが既にインストールされています。" AllowSameVersionUpgrades = "yes" /

そのため、バージョンを更新するたびに(または、バージョンが同じで、現在のバージョン以上である場合)、以前のファイルを削除して製品ファイルをインストールすることにより、製品を再インストールします。 ダウングレードではない製品。

3
Rohit Raghav