这是我的情况:
我有包含 X 项目的 VS2010 解决方案。
可以从所有已编译的工件创建 msi 的 Wix 项目。
我已经构建了机器\ Jenkins,它首先编译(MSBuild .Net 4)所有解决方案,然后编译 wix 以将其打包到 msi。
什么\如何向所有工件\dll注入产品的编号(例如 11.2.0.4789) - 尽可能简单?
编译解决方案时是否可以传递命令行参数?
这是我的情况:
我有包含 X 项目的 VS2010 解决方案。
可以从所有已编译的工件创建 msi 的 Wix 项目。
我已经构建了机器\ Jenkins,它首先编译(MSBuild .Net 4)所有解决方案,然后编译 wix 以将其打包到 msi。
什么\如何向所有工件\dll注入产品的编号(例如 11.2.0.4789) - 尽可能简单?
编译解决方案时是否可以传递命令行参数?
有一些工具,例如 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;
[assembly: AssemblyVersion("$(VersionStamp)")]' />
</Target>
这已经足够了,但更彻底的解决方案包括将文件添加到列表中,以便与其他文件一起清理,并且仅在版本更改时才写入文件以防止不必要的重建等。
对其他项目类型使用类似的技术。