是否有一种方法可以覆盖来自AssemblyInfo.cs的属性(例如AssemblyVersionAttribute)?

5
我正在使用dotnet core。这是为CI过程而不是本地构建而设计的。我希望允许开发人员创建包含标题等信息的AssemblyInfo.cs文件,但是我希望我的构建过程控制程序集的版本。
目前,我使用“dotnet build ... / p:Version = 1.2.3.4”命令,但是只要存在AssemblyInfo.cs文件,即使该文件没有指定任何版本属性,该版本号也会被取代。
我唯一可以通过CLI控制版本的方法是删除AssemblyInfo.cs文件。是否有任何方法可以在不手动更改AssemblyInfo.cs文件的情况下完成此操作?

你正在使用哪个 CI 工具? - James Reed
1个回答

6
该工具生成一个包含程序集属性的定制化.cs文件。编译器只允许每个属性被定义一次。通常情况下,您会完全关闭自动程序集信息生成,但SDK使您能够单独控制每个属性的生成。
因此,如果您编辑csproj文件以包含以下属性组(位于<Project>元素内):
<PropertyGroup>
  <!-- true is the default here -->
  <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
  <GenerateAssemblyCopyrightAttribute>false</GenerateAssemblyCopyrightAttribute>
  <GenerateAssemblyDescriptionAttribute>false</GenerateAssemblyDescriptionAttribute>
  <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
  <GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
</PropertyGroup>

这些属性不会在编译过程中自动生成,您可以在自定义属性中定义它们。完整列表可在dotnet/sdk存储库中找到。


感谢@martin。我们已经采取了替换AssemblyInfo.cs并使用这些msbuild属性的路线。即使您以上述方式指定了AssemblyVersion,仍然可以从msbuild命令行覆盖它(当存在AssemblyInfo.cs时无法执行此操作)。 - Matt Cotton
1
是的,那可能是更好的方法。你甚至可以在解决方案级别上为所有项目设置Directory.Build.props文件中的值,这样你就不必更新所有项目了。 - Martin Ullrich
https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-example - Martin Ullrich
Generate... 属性的完整列表:https://github.com/dotnet/sdk/blob/main/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.GenerateAssemblyInfo.targets - JamesD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接