【问题标题】:CS8019 Error on Assemblyinfo on temp file MSBuild ServerCS8019 临时文件 MSBuild 服务器上的 Assemblyinfo 错误
【发布时间】:2015-10-16 15:43:06
【问题描述】:

我的构建服务器上出现代码分析错误,错误是

...NETFramework,Version=v4.6.AssemblyAttributes.cs(3,1): 错误 CS8019:Unnecessary using 指令。

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

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

但我仍然在服务器上收到错误,而在本地我没有收到任何错误。

有什么想法吗?

【问题讨论】:

标签: c# .net msbuild code-analysis fxcop


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

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

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

【讨论】:

  • 这似乎只适用于 .NET Framework。在以 .NET Standard 为目标时执行此操作似乎无法解决问题。
  • 很高兴知道这一点。不幸的是,我无法研究在这种情况下什么是有效的。如果您找到适用于 .NET Standard 的解决方案,我相信它会作为额外的答案而受到赞赏。 :-)
【解决方案2】:

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

幸运的是,MSBuild 足够灵活,因此我们可以解决它。好的设计是将此文件生成到中间目录(通常称为 obj)中,因为这是构建过程中所有临时文件和临时文件应该存放的地方。我们可以在我们的项目文件中设置这个属性:

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

或者,如果您的构建使用通用 .props 文件,请在此处设置此属性。这将确保您的构建不依赖于 TEMP 目录,并且更加独立、可重复和增量。

【讨论】:

    【解决方案3】:

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

    你有两个选择:

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

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

    【讨论】:

    • 由于这些都没有抑制警告,因此提供了另一种解决方案。
    • 如果我将临时文件重定向到固定位置,然后更新 .csproj 文件以针对新的 .net 框架,则不会重新生成临时文件。
    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    相关资源
    最近更新 更多