如何将WiX安装程序版本设置为当前内部版本?


134

我编写了一个应用程序及其WiX安装程序,并使用Subversion将其置于版本控制下。WiX安装程序生成时,我希望其版本号为应用程序的当前生成版本。我该如何完成?我使用c#编写应用程序代码。

注意:我正在使用ccnet构建该项目

Answers:


181

你可以使用Product/@Version="!(bind.FileVersion.FileId)"(替换FileIdId从您想要得到的版本号文件)和light.exe将被引用的文件的版本填充值FileId


4
正是我想要的!尽管我必须使用“!(bind.FileVersion.FileId)”(“!”而不是“ $”),否则我遇到了预处理器指令错误。
尼古拉斯·皮亚塞斯基

8
是的,抱歉,我经常犯精神错。$是预处理器变量,!是 是活页夹变量。
罗布·曼斯兴

20
请注意,“ Fileid”应该是<File Id =“ Fileid” ...>元素中的值,并且显然可以包含点(。)字符。
詹姆斯·休加德

6
是否也可以对捆绑软件/引导程序执行此操作?
noelicus

6
到相关文档的链接,其部分:活页夹变量
mcdon 2015年

39

我在一个项目中做到了这一点,方法是编写一个预处理程序扩展,以从可执行文件中读取文件版本。因此,WiX文件如下所示:

<?define ProductName="$(fileVersion.ProductName($(var.MyApp.TargetPath)))" ?>
<?define CompanyName="$(fileVersion.CompanyName($(var.MyApp.TargetPath)))" ?>
<?define ProductVersion="$(fileVersion.ProductVersion($(var.MyApp.TargetPath)))" ?>
<Product 
    Id="<product ID>" 
    Name="$(var.ProductName)" 
    Version="$(var.ProductVersion)" 
    Manufacturer="$(var.CompanyName)" 
    Language="1033" 
    UpgradeCode="<upgrade code>">

我已经在中将代码发布在CodePlex上:http : //wixfileversionext.codeplex.com/


您的扩展程序仍然有效吗?我尝试将其添加为参考,但出现错误。
Stefan Vasiljevic 2014年

此扩展与Wix 3.5配合使用效果很好,在更新为Wix 3.9之后,它抛出NullPointerException。显然,这些版本之间发生了冲突。
2015年

2
@Gigo我通过它在<?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> 其中的其中一个元素FileIdId属性值在哪里工作。FileComponent
加里德(Jared)2016年

CodePlex链接没有为我打开。除了编写自己的预处理程序扩展以外,还有其他方法吗?
RDV

28

如果有人在寻找实际的XML示例,则此示例可与.NET程序集一起使用(并且您不必执行Assembly或KeyPath属性)。我消除了与占位符无关的代码:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product [...] Version="!(bind.fileVersion.MyDLL)">
        [...]
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="INSTALLDIR" Name="MyDLLInstallLocation">
                    <Component Id="MainLib" Guid="[...]">
                        <File Id="MyDLL" Name="MyDll.dll" Source="MyDll.dll" />
                        [...]
                    </Component>
                    [...]
                </Directory>
            </Directory>
        </Directory>
    </Product>
</Wix>

1
这是一个更好的答案。谢谢您的工作示例。
轧辊

它在哪里获取实际版本号?
foob​​ar

@foobar自从我在这里已经有一段时间了,但是如果您查看字符串,!(bind.fileVersion.MyDLL)它会使用第三部分来引用该<File Id="MyDLL"...部分
K0D4

这对我来说很好。适用于编译的可执行文件以及dll,这非常适合将安装程序版本和UI内容固定到exe程序集信息,而无需在多个地方进行更改
rcbevans

21

这是一种非常简单的方法,可以使用BeforeBuild Target和来获取Bootstrapper捆绑软件版本以匹配MyApp AssemblyVersion DefineConstants

Bundle.wxs:

<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
     Version="$(var.BuildVersion)"

Bootstrapper.wixproj:

<Target Name="BeforeBuild">
  <GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
    <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
  </GetAssemblyIdentity>
  <PropertyGroup>
    <DefineConstants>BuildVersion=%(AssemblyVersion.Version)</DefineConstants>
  </PropertyGroup>
</Target>

@AliKazmi您是否定义了您的名称,var.ProductName并且var.BuildVersion位于您上方的某个位置<Bundle>
Brock Hensley 2014年

2
我尝试了这一点,并不能推荐足够的方法-将其与TeamCity的组装修补程序结合使用,您将获得一个成功的公式。我没有使用Bundle元素,而是使用了product元素,但仍然为我工作。
IbrarMumtaz

VS只是喜欢忽略BeforeBuild目标,因此可能需要明确指定AfterTargets="AfterResolveReferences"是否在IDE中构建
Dmitry

我在* .wixproj和Product.wxs文件中添加了Bootstrapper.wixproj代码,将buildversion变量定义为:
RDV

4

您可以将版本传递给安装项目的MSBuild脚本,就像传递应用程序的构建脚本一样。

例如,如果您的CI系统定义了变量AppVersionBuildNumber,并将它们传递给MSBuild脚本,则wixproj可以创建一个相应的Version属性,将其转发给Wix,如下所示:

<PropertyGroup>
    <Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
    <Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
    <DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>

第一个定义Version为您在本地构建时提供默认设置。无论最终结果如何,都将成为VersionWix中的变量。像这样在wsx文件中使用它:

<Product Version="$(var.Version)" ...>
    <Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />

我希望在说明中包括该版本,以便可以从Window Explorer(作为“详细信息”视图中的列或“属性”页面上的列)轻松查找,而与文件名无关。

与从文件读取版本相比,将版本作为变量传递给您更多的控制权。从文件读取时,将获得编程版本的所有4个部分。但是,ProductVersion仅设计为使用前3个部分。


谢谢,这挽救了我的一天。顺便说一句:上面的代码片段被插入到您的项目(* .wxiproj)中。最好管理Devops / VSTS CI-Build。因为我已经准备好了最终版本变量。在我<Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>看来,这是:尽管BuildVersionOfAsm是devops管道中的变量。
Robetto

我想动态选择版本,此方法将要求我继续更新* .wixproj中的版本。有没有办法在此字段中的任何dll版本?
RDV

@RDV此方法的目的是不更改源代码管理中的任何文件,包括.wixproj。动态版本号由您的CI系统提供(在此示例中为AppVersion和BuildNumber)。通常,您将主要和次要版本号设置为CI变量,然后让CI系统动态生成内部版本号。
爱德华·布雷

出色-正是我需要的解决方案,包括本地版本的默认设置。
ColH

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.