我的构建服务器上出现代码分析错误,错误是
... NETFramework,Version = v4.6.AssemblyAttributes.cs(3,1):错误CS8019:不必要的使用指令。
这是Visual Studio创建的Temp文件。
在我的项目中,我勾选了“Suppress results from generated code (managed only)”。我原以为这就足够了。
但是我仍然在服务器上得到错误,在本地我没有得到。
有什么想法吗?
答案 0 :(得分:8)
TargetFrameworkMonikerAssemblyAttributesPath
属性不会删除警告。它重新定位生成警告的文件,这将证明是有用的。TargetFrameworkMonikerAssemblyAttributeText
属性不起作用。该属性似乎被生成此文件的目标覆盖。 (在MSBuild 14.0中,该属性被文件Microsoft.CSharp.CurrentVersion.targets中的目标_SetTargetFrameworkMonikerAttribute
覆盖,稍后将在文件Microsoft.Common中的目标GenerateTargetFrameworkMonikerAttribute
中引用。 CurrentVersion.targets。) (工作解决方案)将 TargetFrameworkMonikerAssemblyAttributesFileClean
设置为false可防止文件被覆盖(如果已存在)。因此,您可以让构建脚本生成它,手动修复using ...;
行,保存它并在重建时看到它不会重新生成。此时,将文件放在非临时路径中是有道理的。
将以下内容添加到 SharedBuildScript.msbuild.xml 文件并在单个项目文件中引用该文件可确保它们都引用相同的单个文件:
<PropertyGroup>
<TargetFrameworkMonikerAssemblyAttributesFileClean>False</TargetFrameworkMonikerAssemblyAttributesFileClean>
<TargetFrameworkMonikerAssemblyAttributesPath>$(MSBuildThisFileDirectory)SharedAssemblyAttributes.cs</TargetFrameworkMonikerAssemblyAttributesPath>
</PropertyGroup>
答案 1 :(得分:6)
Google搜索 CS8019 AssemblyAttributes 会产生许多有趣的文章,例如this blog post。引用:
幸运的是,MSBuild非常灵活,因此我们可以解决它。好的设计是将此文件生成到Intermediate目录(通常称为obj),因为这是构建过程中所有临时文件和临时文件的所在位置。我们可以在项目文件中设置此属性:
<PropertyGroup>
<TargetFrameworkMonikerAssemblyAttributesPath>$([System.IO.Path]::Combine('$(IntermediateOutputPath)','$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)'))</TargetFrameworkMonikerAssemblyAttributesPath>
</PropertyGroup>
或者,如果您的构建使用公共.props文件,请在此处设置此属性。这将确保您的构建不依赖于TEMP目录,并且更加孤立,可重复和增量。
答案 2 :(得分:2)
Michal的答案在这方面只有部分帮助。是的,您可以重定向该文件的写入位置,但仍会违反CS8019
规则。
您有两种选择:
同时设置&lt; TargetFrameworkMonikerAssemblyAttributeText
&gt;属于不违反规则的财产。例如:
// <autogenerated />
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute("$(TargetFrameworkMoniker)", FrameworkDisplayName = "$(TargetFrameworkMonikerDisplayName)")]
或者,将文件重定向到某个地方而不是临时的。在我的情况下,我选择将其写入解决方案根目录,以便所有项目共享该文件。然后,我手动编辑该文件以删除违规,并将该文件与其余代码一起提交。如果该文件已经存在,则不会被覆盖,因此通常是安全的。