【问题标题】:inject version to DLLs during build process在构建过程中向 DLL 注入版本
【发布时间】:2013-05-26 10:51:39
【问题描述】:

这是我的情况:

  1. 我有包含 X 项目的 VS2010 解决方案。

  2. Wix 项目,可以从所有已编译的工件创建 msi。

  3. 我已经构建了机器 \ Jenkins,它首先编译 (MSBuild .Net 4) 所有解决方案,然后编译 wix 以将其打包到 msi。

什么\如何向all artifacts\dlls注入产品的编号(例如 11.2.0.4789) - 尽可能简单?

编译解决方案时是否可以传递命令行参数?

【问题讨论】:

  • 如果您打算使用该版本格式作为 msi 版本,请注意 Windows Installer 将忽略第四部分,如果仅更改第四部分可能会导致升级问题。见ProductVersion property

标签: visual-studio-2010 msbuild jenkins wix versioning


【解决方案1】:

有一些工具(例如 MSBuild 的几个扩展)可以进行版本标记,但每个工具都假定一个特定的工作流程。您可能会找到适合您的方法,但 DIY 方法可以帮助您评估它们,即使这不是您的最终解决方案。

您可以像这样向 MSBuild 命令行添加属性:

msbuild /p:VersionStamp=11.2.0.4789

注意:我假设您将以某种方式参数化 Jenkins 构建或在前面的构建步骤中生成数字。这是一个模拟:

echo 11.2.0.4789 >version.txt
set /p version=reading from pipe <version.txt
msbuild /p:VersionStamp=%version%

现在,工作是让每个项目都使用它。这取决于项目类型以及您希望 VersionStamp 出现的位置。

对于 csproj,您可能希望将其用作 AssemblyVersion。最简单的方法就是将属性单独移动到一个cs文件中,每次都重写。我会在 AssemblyInfo.cs 中留下评论,作为它现在来自何处的线索。您可以在项目中动态或永久地包含 cs 文件。我更喜欢动态,因为它实际上是构建的中间文件。因此,在您的 .csproj 中,在文本编辑器中添加以下内容(例如 Visual Studio。卸载和编辑项目):

  <Target Name="BeforeBuild">
    <PropertyGroup>
      <AssemblyVersionPath>$(IntermediateOutputDir)AssemblyVersion.cs</AssemblyVersionPath>
    </PropertyGroup>
    <ItemGroup>
      <Compile Include="$(AssemblyVersionPath)" />
    </ItemGroup>
    <WriteLinesToFile
      File='$(AssemblyVersionPath)' 
      Overwrite="true"
      Condition="'$(ProductVersion)' != ''"
      Lines='using System.Reflection%3b;&#x0a;[assembly: AssemblyVersion("$(VersionStamp)")]' />
  </Target>

这已经足够了,但更彻底的解决方案包括将文件添加到列表中,以便与其他文件一起清理,并且仅在版本更改时才写入文件以防止不必要的重建等。

对其他项目类型使用类似的技术。

【讨论】:

  • 完美运行!只是稍微修改了条件,因为我的 CI 在不同的配置下构建文件。谢谢!
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2017-11-11
  • 2012-07-26
相关资源
最近更新 更多