将程序集版权信息作为参数传递给.NET Framework项目
我正在处理一个包含50多个C#项目的.NET Framework解决方案。我有一个GlobalAssemblyInfo.cs文件,其中AssemblyCopyright是硬编码的,大致像这样
[assembly: AssemblyCopyright("SOME_COPYRIGHT_2026")]
现在我想把版权字符串移动到Azure DevOps变量中,这样每个(CI构建、安装程序构建等)都会把这个变量作为版权字符串的真源。这个思路是在需要时只在一个地方修改,新的版权将被标准化并应用到我构建的所有内容。
但问题在于如何传递这个变量值。我已经更新了我的YAML文件,将CompanyCopyright变量传递给MSBuild任务。并且我百分之百确定它已经被正确传递。
task: MSBuild@1
displayName: Build solution MySolution.sln
inputs:
solution: MySolution.sln
msbuildArguments: /p:CompanyCopyright="$(CompanyCopyright)"
现在的问题是——是否可以从MSBuild参数中获取这个CompanyCopyright,并把它作为AssemblyCopyright应用,而不是在GlobalAssemblyInfo.cs中硬编码的字符串
顺便提醒一下,我处理的是.NET Framework风格的项目文件,而不是.NET SDK风格的。因此,像我在其中添加以下内容的Directory.Build.props文件的方法似乎不起作用:
<Project>
<PropertyGroup>
<AssemblyCopyright>
$(CompanyCopyright)
</AssemblyCopyright>
</PropertyGroup>
</Project>
解决方案
遗留风格的项目不支持 AssemblyInfo 生成,但.NET Framework项目可以是SDK风格的项目。
在SDK风格的项目中,用于版权的MSBuild属性是 Copyright(而不是 AssemblyCopyright)。请参阅“在项目文件中设置程序集属性” https://learn.microsoft.com/en-us/dotnet/standard/assembly/set-attributes-project-file。
<PropertyGroup>
<Copyright>$(CompanyCopyright)</Copyright>
</PropertyGroup>
这“50多个C#项目”可以从遗留风格转换为SDK风格。如果有从.NET Framework最终迁移到.NET的计划或路线图,这将是一项带来即时收益的工作量。
否则,程序集版权的生成可以自定义编写。
为该文件创建内容,并使用 WriteLinesToFile 任务来生成包含该内容的文件。
<PropertyGroup>
<Copyright>$(CompanyCopyright)</Copyright>
</PropertyGroup>
<Target Name="..." >
<ItemGroup>
<CopyrightFileContent Include="// Generated Copyright File" />
<CopyrightFileContent Include="[assembly: AssemblyCopyrightAttribute("$(CompanyCopyright)")]" />
</ItemGroup>
<WriteLinesToFile Lines="@(CopyrightFileContent, `$([System.Environment]::NewLine)`)" File="..." Overwrite="true" />
</Target>
请注意,关于文件名 GlobalAssemblyInfo.cs 和 AssemblyInfo.cs 没有什么特殊之处。生成的文件可以有任意名称。重要的是属性声明中 assembly: 的作用域。
自定义MSBuild代码可以在每个项目构建时把生成的文件包含在 Compile 项中。如果增量构建很重要,生成的文件应仅在该项目对其他更新的源文件进行构建时添加。没有一个可测试的属性,因此这可能有点棘手,但我认为这在StackOverflow上已经有解答。
代码不能有 AssemblyCopyrightAttribute 的重复实例,因此GlobalAssemblyInfo.cs文件中的那一行应该删除。