0

这是我的情况:

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

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

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

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

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

4

1 回答 1

5

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

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

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

于 2013-05-27T14:44:12.427 回答