class Program
{
static void Main(string[] args)
{
int unused = 3;
}
}
如果我加上:
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
添加到 *.csproj文件,那么每次我试图编译这个程序时,编译都会失败,因为未使用变量警告被提升为错误。这与在Visual Studio IDE中将“Project〉Properties”下的“Treat Warnings as errors”选项设置为“All”是一样的。
相反,如果我编译如下:
msbuild /warnaserror
第一次构建将失败,但仍会生成二进制文件,因此,后续的每个构建都将通过。
msbuild命令行参数和msbuild属性之间是否存在我不理解的区别?
另外,我假设msbuild命令行参数不是简单地传递给csc.exe,因为如果这样做:
csc.exe -warnaserror Program.cs
不生成可执行文件,生成总是失败。
1条答案
按热度按时间ie3xauqp1#
您是对的,msbuild命令行参数不是简单地传递给csc.exe,特别是/warnaserror。
虽然在msbuild和csc中没有找到描述
/warnaserror
关系的有效文档,但是msbuild选项中的warnaserror和csc选项中的warnaserror还是有区别的。在msbuild中:对它的描述是:当一个警告被视为错误时,目标将继续执行,就像它是一个警告一样,但是整个构建将失败。(我们可以通过msbuild /help看到)。
但在C#编译(csc)中:这句话是:任何通常报告为警告的消息都将报告为错误,并且生成过程将停止(不生成输出文件)。
当我们第一次构建项目时,如果我们使用msbuild /warnaserror,错误将被“CoreCompile”目标识别并显示,屏幕截图如下:x1c 0d1x是的,构建失败。但如上所述,目标将继续执行时
using /warnaserror in msbuild
,这导致输出.exe文件在obj文件夹,然后在bin文件夹。但是对于
/p:TreatWarningsAsErrors=true
,如果我们第一次使用它来构建,构建会像在msbuild中使用/warnaserror一样失败,但是difference is the message should be /target:exe /warnaserror+ /utf8output instead of /target:exe /utf8output.
这表明当
using /warnaserror in msbuild
时,它不作为/warnaserror in CSC
工作,而是作为/p:TreatWarningsAsErrors=true seems to work as calling the /warnaserror in CSC
工作。我认为这就是[/warnaserror in msbuild]和[/p:TreatWarningsAsErrors=true and csc -warnaserror]之间的区别。希望它能帮助您解决问题。
此外:如果你确实想把警告当作错误处理,并且不想输出它,我建议你使用/p:TreatWarningsAsErrors=true。如果由于某些特殊原因,你需要在把警告当作错误处理时输出,你可以选择/warnaserror。
期待您的回复。