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

Dra*_*aco 125 c# svn wix

我编写了一个应用程序及其WiX安装程序,并使用subversion将其置于版本控制之下.当WiX安装程序构建时,我希望其版本号是应用程序的当前构建版本.我该如何做到这一点?我使用c#来编写应用程序代码.

NB我正在使用ccnet来构建这个项目

Rob*_*ing 170

你可以使用产品/ @版本="!(bind.FileVersion.FileId)"(替换FileIdId的文件,从中你想要得到的版本号),并light.exe将的版本填充值文件引用的FileId.

  • 请注意,"Fileid"应该是<File Id ="Fileid"...>元素中的值,并且显然可以包含点(.)字符. (19认同)
  • 是的,对不起,我犯了不断的精神错误.$是预处理器变量而且!是活页夹变量. (8认同)
  • 是否可以为bundle/bootstrapper执行此操作? (6认同)
  • 相关文档的链接,部分:[Binder变量](http://wixtoolset.org/documentation/manual/v3/overview/light.html) (4认同)
  • 正是我在寻找的!虽然我不得不使用"!(bind.FileVersion.FileId)"(一个"!"而不是"$"),否则我得到一个预处理器指令错误. (3认同)
  • Binder变量应该在WiX文档中具有更高的可见性.我花了几个小时来处理预处理器变量,我现在可以用两个简单的Binder变量替换它们. (3认同)

Chr*_*zor 36

我在我的一个项目中通过编写预处理器扩展来从可执行文件中读取文件版本.所以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>">
Run Code Online (Sandbox Code Playgroud)

我在CodePlex上发布了代码:http: //wixfileversionext.codeplex.com/

  • 为此+1 ...我在每次安装时都使用它. (3认同)
  • @Gigo我通过`<?define ProductName ="!(bind.property.ProductName)"?> <?define CompanyName ="!(bind.property.Manufacturer)"?> <?define ProductVersion =!(bind .FileVersion.FileId)?>```FileId`是`Component`中你的一个`File`元素的`Id`属性的值. (2认同)

K0D*_*0D4 24

如果有人正在寻找一个实际的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>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的答案。谢谢你的工作示例。 (3认同)

Bro*_*ley 19

这是一个非常简单的方法,让你的Bootstrapper Bundle版本与你的MyApp AssemblyVersion匹配使用BeforeBuild TargetDefineConstants.

Bundle.wxs:

<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
     Version="$(var.BuildVersion)"
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

  • 错误LGHT0298:未解析的绑定时变量 (2认同)
  • 我尝试了这个并且不能推荐这个 - 将它与TeamCity的装配修补器结合起来,你就有了一个成功的公式.我没有使用Bundle元素,而是使用产品元素,但仍然适用于我. (2认同)

Edw*_*rey 6

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

例如,如果您的 CI 系统定义了变量AppVersionand BuildNumber,并将它们传递给您的 MSBuild 脚本,您的 wixproj 可以创建一个相应的Version属性,它会像这样转发给 Wix:

<PropertyGroup>
    <Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
    <Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
    <DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

<Product Version="$(var.Version)" ...>
    <Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />
Run Code Online (Sandbox Code Playgroud)

我喜欢在描述中包含版本,以便可以轻松地从 Window Explorer(作为详细信息视图或属性页面中的列)进行查找,而不受文件名的影响。

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


Joh*_*hnW 5

这看起来相当接近您想要完成的任务。看看巡航控制系统中的等效项是什么。

http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/