我想在wix项目生成的msi文件的文件名中包含一些动态部分。这个动态部分应该由变量控制,这些变量是我的wix项目的一部分,并且声明如下:
<?define ProductVersion="7.1.0.1" ?>
是否有人知道将该wix变量的值发送给链接器以将其用作输出文件名的一部分的方法?
顺便说一下:我正在使用Wix3
答案 0 :(得分:42)
您可以更新.wixproj的OutputName并使用MSBuild变量来传递版本号或您喜欢的任何其他变量。
我的构建脚本如下所示:
set PRODUCTVERSION=7.1.0.1
MSBuild.exe /p:Configuration=Debug /p:ProductVersion=%PRODUCTVERSION% Installer.wixproj
我的WiX项目看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>1.0.0.0</ProductVersion>
<ProjectGuid>{b7415c44-8d59-4ac2-b698-03e399a305e3}</ProjectGuid>
<SchemaVersion>2.0</SchemaVersion>
<OutputName>Installer.$(ProductVersion)</OutputName>
...
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Debug</DefineConstants>
<WixVariables>ProductVersion=$(ProductVersion)</WixVariables>
</PropertyGroup>
...
</Project>
输出结果为:
Installer.7.1.0.1.msi
答案 1 :(得分:15)
msi文件名不是由您的wix文件决定的,而是由light.exe -out
开关决定的。如果在构建脚本中执行以下操作,则可以在-out
和wix文件中使用相同的值,假设它是批处理脚本:
set
productversion=1.2.3
-out foo%productversion%.msi
传递给
light.exe
链接器$(env.productversion)
答案 2 :(得分:4)
我找到了几个很好的参考文章来做这个操作:
http://blog.tentaclesoftware.com/archive/2009/05/03/38.aspx
以及使用预构建事件创建输出文件的更好方法的后续步骤:
http://blog.tentaclesoftware.com/archive/2010/08/05/99.aspx
我知道链接很旧,但方法很合理。
以下是基本步骤:
将您要使用的版本放入可以从项目中访问的文件中。我使用我的安装的主要可执行文件,因为我也绑定到我的wxs中的该版本。在我的例子中,因为我使用C#构建并使用SVN,所以我有assembly.cs的模板版本,assembly.cs.txt,我将subwcrev作为预构建事件运行,以创建获得的assembly.cs编译成我的可执行文件(我实际上是在我的解决方案中的一个单独的项目中)。 Subwcrev插入一些日期和修订信息,用于创建“major.minor.version.0”形式的版本,我的版本使用“year.month.revision.0”。
现在,我通常只使用此方法设置AssemblyFileVersion,但为了能够在上面帖子中引用的wixproj构建事件中使用我的版本号,我还需要设置AssemblyVersion,因为这是可以访问的使用GetAssemblyIdentity。如果我真的使用其他人链接到的程序集,这个方法会有问题,但对我来说这是可以的,因为它在我的最终应用程序可执行文件中。
按照第二篇文章中概述的步骤(第一篇文章讨论在wxs中使用版本的绑定方法以及如何卸载和编辑wixproj - 第二篇文章的有价值的上下文)。
像魅力一样!
答案 3 :(得分:2)
由于它只是一个文件名,为什么不在构建脚本中重命名文件的后构建操作(假设是MSBuild)?
答案 4 :(得分:1)
如果您有多个配置而不是.wixprj文件,则可以执行以下操作
<OutputName Condition="'$(Configuration)' == 'User'">User.Setup</OutputName>
<OutputName Condition="'$(Configuration)' == 'Designer'">Designerr.Setup</OutputName>
答案 5 :(得分:1)
打开* .wixproj(例如:Setup.wixproj
)
转到文件末尾。
$(Configuration)
=调试|释放……
在AssemblyFiles上设置应用程序的路径。
<Target Name="BeforeBuild">
<GetAssemblyIdentity AssemblyFiles="..\App\bin\$(Configuration)\App.exe">
<Output TaskParameter="Assemblies" ItemName="AsmInfo" />
</GetAssemblyIdentity>
<CreateProperty Value="$(SolutionName)_%(AsmInfo.Version)_$(Configuration)">
<Output TaskParameter="Value" PropertyName="TargetName" />
</CreateProperty>
</Target>
输出= App_1.0.0.0_Debug.msi
答案 6 :(得分:0)
是否必须在WiX中定义变量?我正在从MSBuild构建我的设置二进制文件,我只是将输出文件名设置为MyProject_$(Platform)
- 我希望任何MSBuild变量替换都能正常工作。
答案 7 :(得分:-5)
Product Id="GUID" Name="whatevername $(var.ProductVersion)"