WIX:如何动态设置msi输出文件的名称

时间:2009-11-06 16:09:05

标签: wix windows-installer variables installation

我想在wix项目生成的msi文件的文件名中包含一些动态部分。这个动态部分应该由变量控制,这些变量是我的wix项目的一部分,并且声明如下:

<?define ProductVersion="7.1.0.1" ?>

是否有人知道将该wix变量的值发送给链接器以将其用作输出文件名的一部分的方法?

顺便说一下:我正在使用Wix3

8 个答案:

答案 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链接器
  • 使用相同的环境变量 你的wix文件为 $(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)"