1

会社で製品のインストール パッケージをビルドするために WiX を使用しています。テスト用に社内で使用するか、社外で使用するかによって、わずかに異なる 2 つのバージョンの .msi をビルドできるようにしたいと考えています。顧客。

比較のために複数のバージョンを同時にインストールできるように、内部バージョンは UpgradeCode なしでビルドする必要があります。外部バージョンには、静的な UpgradeCode が必要です。

WiX では、次のようにして UpgradeCode を自動生成することはできません。

<?if $(var.Configuration) = "Internal Release"?>
   <?define UpgradeCode = "*"?>
<?else?>
   <?define UpgradeCode = "[REALGUID]"?>
<?endif?>

<Product ... UpgradeCode="$(var.UpgradeCode)">

UpgradeCode を「自動生成」するには、UpgradeCode 属性を完全に省略する必要があります。

これを達成する方法について何か提案はありますか?

4

2 に答える 2

0

おそらくアップグレードコードに * を使用することはできませんが (よくわかりません)、msbuild を介してプロパティとして渡すことができます。

<UpgradeCode Condition="$(InternalRelease)==1">{$([System.Guid]::NewGuid().ToString().ToUpper())}</UpgradeCode>

msbuild.proj で、そのプロパティを Target/msbuild project/Properties に追加します。定数 (wixproj) に UpgradeCode=$(UpgradeCode) を追加します。

次に、メインの wxs に次のようなものを追加します。

<?if $(var.UpgradeCode)=""?>
     <?define UpgradeCode=your-static-upgradecode ?>
<?endif?>

したがって、プロジェクトがアップグレード コードを受け取った場合は、それを使用します。それ以外の場合は、 defined.

最後に、/p:InteralRelease=1 で msbuild.proj を呼び出して GUID を生成します。

于 2013-11-10T01:28:57.790 に答える
0

同じ課題を持つ他のユーザーの代替ソリューションとしてこの回答を追加します。

IlirBの回答はおそらく期待どおりに機能しますが(回答が提供される前に独自のソリューションで問題を解決したため、試したことはありません)、Product-tagの2つの異なるバージョンのいずれかを条件付きで含めることで問題を解決しました。そのうち、UpgradeCode が定義されているのは 1 つだけです。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include Config.wxi?>
  <?if $(var.IsExternalRelease) = yes?>
  <Product Id="$(var.ProductID)" Name="$(var.ProductName)" Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
      <Package Id="$(var.PackageID)" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
        <MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes"/>
    <PropertyRef Id="AllProperties"/>
    <UIRef Id="CUSTOM_UI"/>
    <FeatureRef Id="F_AllFeatures"/>
    </Product>

  <?else?>
  <Product Id="$(var.ProductID)" Name="$(var.ProductName)" Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)">
    <Package Id="$(var.PackageID)" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    <MediaTemplate EmbedCab="yes"/>
    <PropertyRef Id="AllProperties"/>
    <UIRef Id="CUSTOM_UI"/>
    <FeatureRef Id="F_AllFeatures"/>
  </Product>
  <?endif?>
</Wix>

wixのコードをいくつかに分けてProductタグから参照するように工夫したので、コードの重複はあまりありませんでした。

于 2014-04-01T08:21:44.107 に答える