我正在尝试创建一个安装程序,每次构建解决方案时都会构建该安装程序,并在解决方案构建输出文件夹中创建一个MSI。安装仅用于安装soution \ bin文件夹的组件。我们使用Wintellect TFS内部版本号任务使用Major.Minor.Patch.Build版本架构。
我希望能够在不卸载前一个MSI的情况下安装每个MSI。每个安装都将安装到其特定的\ bin_x.x.x.x文件夹中,并使用app 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为Build编号。
即使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文件?
答案 0 :(得分:0)
我能解决其中一些问题。如果我删除MajorUpgrade,升级行为就像我想要的那样。
在BeforeBuild中解决了删除文件问题
<Exec Command="del ..\Build\x64\Release\*.msi"/>