【发布时间】:2015-01-22 18:43:35
【问题描述】:
我正在尝试创建一个安装程序,该安装程序在每次构建解决方案时都会构建,并在解决方案构建输出文件夹中创建一个 MSI。安装仅用于安装 soution \bin 文件夹的组件。我们通过 Wintellect TFS 内部版本号任务使用 Major.Minor.Patch.Build 版本架构。
我希望能够在不卸载前一个的情况下安装每个 MSI。每次安装都将安装到其特定的 \bin_x.x.x.x 文件夹中,并使用应用程序 x.x.x.x 描述创建特定的桌面快捷方式和菜单项。它应该能够检测到您尝试安装的 MSI 是否已经安装,并提示修复或卸载。
<?define ProductVersion=!(bind.FileVersion.$(var.MyProject.TargetFileName)) ?>
<?define ProductName=MyProduct !(bind.FileVersion.$(var.MyProject.TargetFileName)) ?>
<Product Id="*" Name="$(var.ProductName)" Version="$(var.ProductVersion)" UpgradeCode="$(var.NewUpgradeCode)">
<MajorUpgrade AllowSameVersionUpgrades="yes" AllowDowngrades="no" MigrateFeatures="no" Schedule="afterInstallInitialize" DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />
在目录定义中,我使用 var.ProductVersion 来定义 \bin_x.x.x.x 文件夹
<Directory Id="BINFOLDER" Name="bin_$(var.ProductVersion)"/>
在项目文件中我定义了 NewUpgradeCode
<PropertyGroup>
<NewUpgradeCode>$([System.Guid]::NewGuid())</NewUpgradeCode>
<DefineConstants>NewUpgradeCode=$(NewUpgradeCode)</DefineConstants>
</PropertyGroup>
我在项目文件中使用 HeatDirectory 条目来获取输出 bin 文件夹中要安装的文件列表。
<HeatDirectory OutputFile="BinFiles.wxs" Directory="..\Build\x64\Release\" ToolPath="$(WixToolPath)" PreprocessorVariable="var.MyProject.TargetDir" DirectoryRefId="BINFOLDER" ComponentGroupName="BinFolderComponents" GenerateGuidsNow="true" SuppressFragments="true" SuppressCom="true" SuppressRegistry="true" SuppressRootDirectory="true" KeepEmptyDirectories="true">
这一切都很好地解决了一些小问题。
当前的升级方案仍在删除以前安装的版本,无论版本号如何。我希望同时安装 1.0.0.1 和 1.0.0.2 版本。我在上面配置的方式似乎一直在卸载我安装的最后一个版本?
-
我想将 MSI 文件命名为 MyProject_x.x.x.x.MSI。但无论我采用什么方法来命名 MSI 文件,我总是得到 0 作为内部版本号。
即使 EXE 的版本类似于 1.2.0.321 它总是返回 1.2.0.0
但是 bind.FileVersion 确实提取了完整版的 EXE?但这仅在 Product.XML 中可用,而不在定义 MSI 文件名的 Project 文件中可用?
-
我想在运行 HeatDirectory 文件采集之前从输出文件夹中删除 Name_x.x.x.x.msi,以便不包含它。但由于我不知道以前的版本号,我需要在 BeforeBuild 过程中执行通配符删除 *.msi。如果我将删除作为 Pre-Build 事件进行,它不会删除文件,直到在 BeforeBuild 目标中运行 HeatDirectory 之后。
通配符删除在上述 XML 标记中不起作用。那么在运行 HeatDirectory 之前如何确保输出中没有 .MSI 文件?
【问题讨论】:
-
GetAssemblyIdentity 的奇怪行为没有意义。如果我将它指向一个已经构建的 EXE,它应该从中提取版本吗?但它似乎正在使用我当前的构建版本,它确实有一个 0 作为 4 位数。
标签: wix windows-installer