8

我正在尝试实现自动版本控制,以便在构建 Bootstrapper 时,MyApp 和 Bootstrapper 版本都会自动递增和同步。否则,对于每个具有匹配版本的安装尝试,您最终会在添加/删除程序中出现重复的引导条目。

当我构建引导程序时,AfterBuild 目标用于GetAssemblyIdentity成功获取自动生成的 MyApp 版本,并且引导程序输出文件使用递增的版本号正确命名,例如MyApp.1.0.5123.1352.exe

但是,当我安装这个引导程序时,添加/删除程序中显示的版本始终是1.0.0.0.

我尝试在 Bootstrapper Bundle Version 字段中使用绑定,但我无法让它读取 MyApp 版本。

使用!(bind.packageVersion.MyApp)结果永远不会增加 1.0.0.0。
使用!(bind.assemblyName.MyApp)会导致构建错误(未解决的绑定时间变量)。
使用!(bind.FileVersion.filAAF013CA9B89B07C81031AE69884BF11)会导致构建错误(未解决的绑定时间变量)。<-- 有意义,因为 FileID 存在于Setup项目中,这就是Bootstrapper项目。

我该怎么做才能让我的 Bootstrapper Bundle 与它正在打包的 MyApp 具有相同的版本?

=====MyApp\AssemblyInfo.cs=====

[assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyFileVersion("1.0.*")] 

=====Setup.wixproj=====

<Target Name="BeforeBuild">
  <PropertyGroup>
    <LinkerBaseInputPaths>..\MyApp\bin\$(Configuration)\</LinkerBaseInputPaths>
  </PropertyGroup>
  <HeatDirectory OutputFile="MyApp_Files.wxs" Directory="..\MyApp\bin\$(Configuration)\" DirectoryRefId="INSTALLLOCATION" ComponentGroupName="MyApp_Project" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="false" GenerateGuidsNow="true" ToolPath="$(WixToolPath)" Condition="'%(ProjectReference.PackageThisProject)'=='True'" />
</Target>

=====Bootstrapper.wixproj=====

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
        <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
    </GetAssemblyIdentity>
    <Copy SourceFiles=".\bin\$(Configuration)\$(OutputName).exe" DestinationFiles=".\bin\$(Configuration)\MyApp.%(AssemblyVersion.Version).exe" />
    <Delete Files=".\bin\$(Configuration)\$(OutputName).exe" />
</Target>

=====Bootstrapper\Bundle.wxs=====

<Bundle Name="$(var.ProductName) Bootstrapper v!(bind.packageVersion.MyApp)" 
        Version="!(bind.packageVersion.MyApp)"
4

2 回答 2

21

这就是我要做的:

  1. 在我的程序集中,我使用自动版本控制:AssemblyVersion("1.0.*")

  2. 在安装项目中引用使用绑定到程序集的版本:!(bind.fileVersion.MyAssembly.dll)(MyAssembly.dll 是程序集的 File/@Id)

  3. 在使用绑定到安装版本的捆绑包中: !(bind.packageVersion.Setup)(Setup 是捆绑包项目中引用的项目名称。)
于 2013-09-26T13:01:25.293 回答
7

知道了!!!我没有意识到你可以DefineConstantsBeforeBuild目标中声明变量。

下面是一个生成变量的示例 BeforeBuild TargetBuildVersion

捆绑.wxs:

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

引导程序.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>
  <!-- This is extra, not needed: Renames output file with version number -->
  <Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
      <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
    </GetAssemblyIdentity>
    <Copy SourceFiles=".\bin\$(Configuration)\$(OutputName).exe" DestinationFiles=".\bin\$(Configuration)\MyApp.%(AssemblyVersion.Version).exe" />
    <Delete Files=".\bin\$(Configuration)\$(OutputName).exe" />
  </Target>
于 2013-09-25T21:51:48.377 回答