当前,每当我构建软件包时,都必须像这样在Product.wxs文件中手动增加Version属性:
<Product
Id = "*"
Version="4.1.3"
Run Code Online (Sandbox Code Playgroud)
我想自动化,以简化构建过程。我们对exe / dll文件使用以下版本控制方案:
major.minor.special.build
Run Code Online (Sandbox Code Playgroud)
特殊字符几乎从未使用过,并且设置为0,并且约定是按如下方式对打包的MSI进行版本控制,因为您只能使用三个数字:
major.minor.build
Run Code Online (Sandbox Code Playgroud)
我见过的唯一解决方案是让您获取另一个项目的4位数字版本,然后截断构建版本,因此最终得到以下结果:
major.minor.special
Run Code Online (Sandbox Code Playgroud)
显然,这对我们的方案不起作用,因为我们丢失了内部版本号。我该如何抓住major.minor.build而忽略特殊性?
我使用包含文件中的WiX变量,该文件在每次构建时都会重新生成。
由于我的项目是.wixproj(MSBuild / Visual Studio),因此我只是在其中编码版本提取和格式设置为自定义的嵌入式MSBuild任务,并在BeforeBuild目标中调用它。
在下面的示例中,我获得了产品主装配体的装配体版本。您可以将其编码为所需的任何版本。
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include ProductVersion.wxi?>
<Product Version="$(var.ProductVersion)" …>
…
</Wix>
Run Code Online (Sandbox Code Playgroud)
<Include>
<?define ProductVersion=1.0.38549?>
</Include>
Run Code Online (Sandbox Code Playgroud)
我建议在项目中包括.wxi文件,以便在解决方案视图中可见。并且,由于它是生成的,因此我建议将其从源代码管理中排除。
.wixproj既是Visual Studio项目文件,又是MSBuild项目文件。要在Visual Studio中编辑Visual Studio项目文件,请选择一个教程或扩展名。
如.wixproj注释中所述,包括WiX在内的MSBuild系统提供BeforeBuild和AfterBuild目标。
只需将目标从注释中拉出并添加任务调用即可。
<Target Name="BeforeBuild">
<GenerateProductVersion AssemblyPath='../wherever/whatever.exe' />
</Target>
Run Code Online (Sandbox Code Playgroud)
任务代码可以在其自己的MSBuild文件中,甚至可以在DLL中进行重用。或者,对于脚本编制方法,它可以是内联的。
此任务分为三部分:
。
<UsingTask TaskName="GenerateProductVersion" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<AssemblyPath ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Using Namespace="System" />
<Using Namespace="System.Xml.Linq" />
<Using Namespace="System.Reflection" />
<Code Type="Fragment" Language="cs"><![CDATA[
var assemblyVersion = AssemblyName.GetAssemblyName(AssemblyPath).Version;
var productVersion = String.Format("{0}.{1}.{2}", assemblyVersion.Major, assemblyVersion.Minor, assemblyVersion.Revision);
Log.LogMessage(MessageImportance.High, "ProductVersion=" + productVersion + " extracted from assembly version of " + AssemblyPath);
new XDocument(
new XElement("Include",
new XProcessingInstruction("define", "ProductVersion=" + productVersion)))
.Save("ProductVersion.wxi");
]]></Code>
</Task>
</UsingTask>
Run Code Online (Sandbox Code Playgroud)
所有这些在项目文件中都隐藏得太好了。许多项目设计人员都有一个“构建”选项卡,该选项卡允许在构建中输入名称/值对。这提供了一种提高XML路径的机制。
<Target Name="BeforeBuild">
<GenerateProductVersion AssemblyPath='$([System.Text.RegularExpressions.Regex]::Match(";$(DefineConstants);", ";VersionExtractionPath=(?<path>.*?);").Groups["path"].Value)' />
</Target>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1494 次 |
| 最近记录: |