如何抑制特定的MSBuild警告

120
有没有办法在从命令行运行MSBuild时禁用特定的警告(例如MSB3253)?我的构建脚本以类似以下方式调用msbuild.exe:
msbuild.exe MySolution.sln /t:Rebuild /p:Configuration=Release

我发现可以通过在msbuild.exe中添加另一个参数来抑制C#警告(例如CS0618):

msbuild.exe MySolution.sln /t:Rebuild /p:Configuration=Release /p:NoWarn=0618

然而,这种方法并不适用于MSBuild警告。也许有另一个神奇的属性需要设置吗?
我正在使用.NET 3.5和VS2008。

4
对于寻找如何传递多个值到 /p:NoWarn 的谷歌用户:/p:NoWarn="0618;0414;0219" - Rohim Chou
(Windows Powershell)对于寻找如何将多个值传递给/p:NoWarn的谷歌用户:"/p:NoWarn=`"0618;0414;0219`"" - undefined
7个回答

83

我已经使用/p:WarningLevel=X成功地抑制了警告级别。

msbuild.exe MySolution.sln /t:Rebuild /p:WarningLevel=0 /p:Configuration=Release
                                      ^^^^^^^^^^^^^^^^^
Warning  
Level    Meaning
-------- -------------------------------------------
      0  Turns off emission of all warning messages.

      1  Displays severe warning messages

      2  Displays level 1 warnings plus certain, less-severe warnings, such
         as warnings about hiding class members

      3  Displays level 2 warnings plus certain, less-severe warnings, such 
         as warnings about expressions that always evaluate to true or false

      4  (the default) Displays all level 3 warnings plus informational warnings

4
如果您针对解决方案中的每个项目配置了警告级别大于0,则我认为这不起作用。 - si618
8
没错,这就像用胶带贴在仪表盘上来解决汽车引擎问题一样荒谬。 - cacau
1
刚刚尝试了一下使用MSBuild 15.4.8.50001,/p:WarningLevel=0并不能抑制MSBuild警告MSB3227。 - Thought
2
我尝试过了,这将抑制编译器警告(CS..),但不会抑制MSBuild警告(MSB...)。 - marsze
如果你真的需要的话,这是一个技巧,但你可以在想要抑制此警告的 csproj 旁边创建一个 Directory.Build.rsp 文件,并添加内容 "/WarnAsMessage:MSBXXXX"。 - mjsabby
这已经足够好了。 - Daniel Lidström

47

对于MSB3253,您可以在项目文件(*.csproj)中进行设置以解决此警告。

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <!-- some code goes here -->
    <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
        None
    </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
    <!-- some code goes here -->
  </PropertyGroup>

7
这个答案也涵盖了MSB3270。当您使用自定义程序集解析器来管理特定于平台的程序集加载时,这非常方便。 - MOverlund
18
在微软的某个地方有这些魔法设置的完整列表吗? - ATV
请您能否提供更多详细信息,应该在哪个文件中进行修改?这对于 MSB8012 有效吗? - Gayane
只是为了挖坟...我在解决方案资源管理器中右键单击我的*.csproj文件,点击“卸载项目”,右键单击“编辑”。然后将此“ResolveAssembly”部分复制到第一个属性组的末尾(通常在TargetFrameworkProfile标记之后),它就会停止发出警告。 - Steven Wood
3
有效指令:msbuild /p:ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch=None - Shaun Luttin

31

根据MSDN论坛主题,MSBuild警告无法被抑制。


28
注意:这个答案适用于MSBuild的错误(以“MSB”为前缀),正如问题所问。如果你是通过谷歌搜索到这里并且想要禁止编译器错误(例如“CS2008”),你可以像问题提出者一样执行以下操作:/p:nowarn=2008(去掉数字前面的“CS”)。 - Michael Haren
1
你知道这是否仍然是事实吗? - Martin Ba
MSDN文档关于/nowarn here。Msbuild将此变量传递给csc.exe作为其CoreCompile目标的一部分。 - Dav Evans
似乎没有一种方法可以同时抑制Roslyn编译器警告并在MS-Build中抑制它们。 '#pragma warning disable RCS1110 // Declare type inside namespace.' 去掉RCS会使编译器警告重新出现。 - user1431356

14

13

对于现在正在搜索此内容的人(像我一样):即将发布的MSBuild 15.0(我猜测将与Visual Studio 2017一起发布)将最终实现/NoWarn选项以抑制特定警告(以及/WarnAsError以将特定警告或所有警告视为错误)。


13

替代方案:将以下内容添加到.csproj文件中。

<PropertyGroup>
  <NoWarn>$(NoWarn);MSB3253</NoWarn>
</PropertyGroup>

1
适用于 MSB3270。 - Andrei Krasutski

-2
在此帖子发布时(2021年),Microsoft文档建议使用DisabledWarnings,这对我很有效。
<PropertyGroup>
    <DisabledWarnings>3568</DisabledWarnings>
</PropertyGroup>

请注意,“MS”前缀被省略。

1
正如您所引用的页面所示,该属性的名称是NoWarn,而不是DisabledWarnings。而且您确实需要使用MSB前缀。在您之前一年的这个答案中有正确的信息。 - Peter Duniho

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