CS8019 临时文件 MSBuild 服务器上的 Assemblyinfo 错误

CS8019 Error on Assemblyinfo on temp file MSBuild Server

我在构建服务器上遇到代码分析错误,错误是

...NETFramework,Version=v4.6.AssemblyAttributes.cs(3,1): error CS8019:Unnecessary using directive.

这是在 Visual Studio 创建的临时文件中。

在我的项目中,我勾选了“Suppress results from generated code (managed only)”。我还以为这样就够了。

但我仍然在服务器和本地收到错误 none。

有什么想法吗?

谷歌搜索 CS8019 AssemblyAttributes 得到了许多有趣的文章,例如 this blog post。引用:

Fortunately for us, MSBuild is flexible enough so we can work around it. The good design is to generate this file into the Intermediate directory (usually called obj), because this is where all transient and temporary files should go during a build process. We can either set this property in our project file:

<PropertyGroup>
    <TargetFrameworkMonikerAssemblyAttributesPath>$([System.IO.Path]::Combine('$(IntermediateOutputPath)','$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)'))</TargetFrameworkMonikerAssemblyAttributesPath>
</PropertyGroup>

Or if your build uses a common .props file, set this property there. This will ensure that your build doesn’t depend on the TEMP directory and is more isolated, repeatable and incremental.

Michal 的回答在这里只有部分帮助。是的,您可以重定向该文件的写入位置,但它仍然会违反 CS8019 规则。

您有两个选择:

  1. 同时将 <TargetFrameworkMonikerAssemblyAttributeText> 属性 设置为不违反规则的内容。例如:

    // &lt;autogenerated /&gt;
    [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(&quot;$(TargetFrameworkMoniker)&quot;, FrameworkDisplayName = &quot;$(TargetFrameworkMonikerDisplayName)&quot;)]
    
  2. 或者,将文件重定向到某个非临时位置。在我的例子中,我选择将它写入解决方案根目录,以便所有项目共享该文件。然后我手动编辑该文件以删除违规并将该文件与我的其余代码一起提交。如果文件已经存在,则该文件不会被覆盖,因此这通常是安全的。

  1. 仅设置 TargetFrameworkMonikerAssemblyAttributesPath 属性 不会删除警告。它会重新定位生成警告的文件,这将很有用。
  2. 设置 TargetFrameworkMonikerAssemblyAttributeText 属性 不起作用。看起来这个 属性 被生成这个文件的目标覆盖了。 (在 MSBuild 14.0 中,属性 被文件 Microsoft.CSharp.CurrentVersion.targets 中的目标 _SetTargetFrameworkMonikerAttribute 覆盖,随后在文件 GenerateTargetFrameworkMonikerAttribute 中的目标 GenerateTargetFrameworkMonikerAttribute 中被引用Microsoft.Common.CurrentVersion.targets.)
  3. (工作解决方案)TargetFrameworkMonikerAssemblyAttributesFileClean 设置为 false 将防止文件被覆盖如果它已经存在。因此,您可以让构建脚本生成它,手动修复 using ...; 行,保存它并看到它在重建时没有重新生成。此时,将文件放在非临时路径中是有意义的。

    将以下内容添加到 SharedBuildScript.msbuild.xml 文件并在各个项目文件中引用该文件可确保它们都引用同一个文件:

    <PropertyGroup>
        <TargetFrameworkMonikerAssemblyAttributesFileClean>False</TargetFrameworkMonikerAssemblyAttributesFileClean>
        <TargetFrameworkMonikerAssemblyAttributesPath>$(MSBuildThisFileDirectory)SharedAssemblyAttributes.cs</TargetFrameworkMonikerAssemblyAttributesPath>
    </PropertyGroup>