在构建过程中将DLL注入DLL

时间:2013-05-26 10:51:39

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

这是我的情况:

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

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

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

  4. 什么\如何注入所有工件\ dll 产品编号(例如11.2.0.4789) - 尽可能简单?

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

1 个答案:

答案 0 :(得分:3)

有一些工具,例如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>

这已经足够了,但更全面的解决方案包括将文件添加到列表中,以便使用其他文件进行清理,只有在版本发生变化时才编写文件以防止不必要的重建等。

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