抑制解决方案级别的警告。将解决方案级别的警告视为错误。

8

我正在尝试为我的团队设置全局规则。我们使用VS2012和TFS进行C#项目开发。我想抑制某些警告并将某些警告视为错误。我已经找到了在项目级别实现该功能的方法——项目属性->生成选项卡。

但是我们的解决方案中有100多个项目,我正在寻找一种更简单的方法来全局设置这些规则。


恐怕您需要为此编写一个宏,因为这些设置不会保存在解决方案中。 - rene
您可以在多个项目中使用相同的规则集文件 - 我假设您已经这样做了,只是想找到一种避免手动在每个项目中指定该文件的方法? - Matthew Watson
我刚开始深入研究这些东西。所以我必须说我不是很确定。我认为规则集是为了代码分析而定义的,与编译器警告不同。到目前为止,我还没有接触过规则集... - jumbo
2
是的,就像@MatthewWatson所说的那样,您可以通过<CodeAnalysisRuleSet>..\..\my_rules.ruleset</CodeAnalysisRuleSet>从多个**.csproj文件引用相同的规则集,例如在一个共同的上级目录中,但您必须分别在每个.csproj中包含它。顺便说一下,您还可以跳过整个规则集的事情,只需将(例如)[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.CodeAnalysis.CSharp.Features", "IDE0040")]放入AssemblyInfo.cs**中,但现在您没有分享太多内容,而且您仍然需要为每个项目执行此操作。 - Glenn Slayden
2个回答

7

一个解决方案只是项目的(相当愚蠢的)容器。如果你在文本编辑器中打开它,你很快就会看到你不能扩展它,只能添加项目/项。

你需要的是一个或多个通用的msbuild文件,指定所有编译器/链接器/任何工具所需的选项,并在每个项目中导入它。我们使用这种方法已经多年了,非常方便(虽然部分原因是我们还编写了一个小工具来生成项目文件,以自动导入全局属性,所以我们不必手动处理它们)。

或者,你可以添加一个机器范围的文件,在 $(MSBuildToolsPath)\Microsoft.CSharp.targets 中查找要放置这些文件的位置。我不会在这里复制/粘贴内容,但是第一行代码基本上检查是否有用户定义的文件在例如 $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore 中,如果有,则在所有通用msbuild内容之前导入它们。同样,Microsoft.CSharp.targets的结尾包含类似的逻辑,用于在导入所有通用msbuild内容之后导入文件。


所以我看到我必须编写一些脚本来更新所有项目文件(当前不考虑机器范围内的文件),我是对的吗? - jumbo
这似乎是唯一的方法(除了手动编辑所有文件); 但这应该不难:您只需要在现有的<Import Project="..\..\..\buildtools\propertysheets\C#\default.targets" />行之前插入一行像<Import Project=path\to\common\props/>这样的单行代码 - 我建议使用相对路径到common.props。 - stijn

4

从MSBuild 15(大约在2017年)开始,您可以在解决方案的顶层文件夹中使用Directory.Build.Props文件。语法与csproj、fsproj或vbproj文件相同,并且条目被视为注入到所有项目文件中。您需要重新启动Visual Studio才能应用更改。(感谢Jumbo!)

<Project>
  <PropertyGroup>
    <WarningsAsErrors>CS4014, CS1998</WarningsAsErrors>
  </PropertyGroup>
</Project>

1
哦,太棒了!这个可行。现在这就是答案。它确实完美地解决了我的问题。谢谢你。(注意:需要重新启动Visual Studio才能使其正常工作) - jumbo

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