msbuild - 在 MSBuild 中将程序集版本号指定为命令行参数

标签 msbuild versioning

我希望能够指定在构建期间生成的所有程序集的版本号作为 MSBuild 命令参数,如下所示:

MSBuild.exe /p:version=5.4.3.0 

我已经查看了AssemblyInfoTask,但在我看来,在这种情况下它并不是一个好的解决方案。

最佳答案

对于使用 dotnet.exe 构建的 SDK 样式项目,程序集版本属性为 generated automatically ,因此您可以立即使用 /p:Version=5.4.3.0

如果您使用旧的项目格式,则需要将以下 BeforeBuild 步骤添加到 .csproj 文件中。 无需使用额外的.targets和扩展包,因为MSBuild已经有一个不错的built-in task它完成了大部分工作:

<Target Name="BeforeBuild">
  <ItemGroup>
    <AssemblyAttributes Include="AssemblyVersion">
      <_Parameter1>$(Version)</_Parameter1>
    </AssemblyAttributes>
  </ItemGroup>
  <MakeDir Directories="$(IntermediateOutputPath)" />
  <WriteCodeFragment Language="C#"
                     OutputFile="$(IntermediateOutputPath)Version.cs"
                     AssemblyAttributes="@(AssemblyAttributes)" />
  <ItemGroup>
    <Compile Include="$(IntermediateOutputPath)Version.cs" />
  </ItemGroup>
</Target>

只需确保删除现有的 AssemblyVersion 属性,因为它现在将在构建过程中生成。

2020 年 7 月 29 日更新: Michael Parker指出,如果您使用此方法并从 Visual Studio 进行构建,您最终会在 Version.cs 文件中得到一个空版本。为了克服这个问题,我建议在 .csprojDirectory.Build.props 文件中定义默认版本值,如下所示:

<PropertyGroup>
  ...
  <Version Condition="'$(Version)' == ''">1.0.0.0</Version>
</PropertyGroup>

如果未在命令行中指定版本,这会将其设置为 1.0.0.0

关于msbuild - 在 MSBuild 中将程序集版本号指定为命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8446693/

相关文章:

build - 将 TeamCity 与 MSBuild 和构建参数一起使用(未使用)

tfs - 如何对没有分支文件夹的 TFS Team 项目进行分支

operating-system - 您如何存储代码和文件以供跨机器使用

svn - 在 TeamCity 中获取子文件夹 svn 修订版

c# - 构建用于版本控制的 Web API 堆栈

c# - 设置 "Always copy to output directory"时,Content 和 None 有什么区别?

msbuild - 如何在 MSBuild 中创建新属性并在 WIX 中引用它

visual-studio - 如何让 Visual Studio 在构建时转换特定的 T4 模板?

visual-studio-2012 - (解决方案范围的前/后事件)MSBuild 目标在命令行中执行但不在 VS 中执行

python - 从 git 标签获取版本(通过 pbr)