如何使用MSBuild命令忽略编译错误实现项目成功构建?
尝试使用如下MSBuild命令配置忽略错误信息完成构建,但命令未生效:
msbuild /property:ContinueOnError=true E:...../xxx.sln
执行命令后出现如下错误提示:
GRGVTMWorkflowImp.cs(52,10): error CS0246: The type or namespace name 'GrgCreateFunctionAttribute' could not be found (are you missing a using directive or an assembly reference?) [E:\Fortify_Scan\src\AP1\VTM\20220607\20220601\GRGVTMBusinessService\GRGVTMWorkflow\GRGVTMWorkflow.csproj]
GRGVTMWorkflowImp.cs(36,6): error CS0246: The type or namespace name 'GrgComponent' could not be found (are you missing a using directive or an assembly reference?)
已知晓上述错误的具体含义,仍希望跳过这些错误完成项目构建,咨询是否可以通过MSBuild命令参数或其他方式实现该需求。
原命令不生效的原因
全局传入的ContinueOnError属性仅作用于MSBuild的任务调度逻辑,C#编译器(csc)抛出的CS0246这类编译级错误,默认会直接终止编译任务执行,不会读取全局的ContinueOnError配置,因此参数不会生效。
可行实现方案
方案1:指定编译器跳过对应编号的错误(推荐)
直接给C#编译器传递参数,忽略指定编号的编译错误,不会影响其他构建步骤的错误校验,适合绝大多数场景。对于遇到的CS0246错误,执行如下命令即可:
msbuild E:\your-path\xxx.sln /p:CompilerOptions="/nowarn:0246"
如果需要忽略多个编译错误,用逗号分隔错误编号即可,例如/nowarn:0246,0168,1002。
注意:该方式仅跳过错误提示让构建流程继续,如果缺失的类型是后续编译逻辑必须依赖的,最终可能无法生成可正常运行的程序集,非常适合路径中提到的Fortify静态扫描这类不需要完整可用产物的场景。
方案2:强制所有构建任务忽略错误继续执行
如果需要跳过所有类型的构建错误(包括编译错误、资源拷贝错误、依赖加载错误等),可以通过自定义全局任务配置实现,在构建命令中追加参数,强制所有任务遇到错误时仅输出警告不终止:
- 先在sln同级目录新建一个名为
forcecontinue.targets的文件,内容如下:<Project> <Target Name="OverrideContinueOnError" BeforeTargets="Build"> <PropertyGroup> <ContinueOnError>WarnAndContinue</ContinueOnError> </PropertyGroup> </Target> </Project> - 执行构建命令时引入该target文件:
msbuild E:\your-path\xxx.sln /p:CustomBeforeMicrosoftCommonTargets=forcecontinue.targets
该方式容错率最高,但可能生成完全不可用的构建产物,仅建议在极端场景下使用。
方案3:适配Fortify扫描的优化方案
从给出的路径判断,构建目的是做Fortify静态代码扫描,这类场景不需要完成完整的项目编译,只需要让Fortify识别到代码结构和编译依赖即可,可以直接在Fortify的扫描命令中添加跳过编译错误的参数,不需要强制MSBuild构建成功,扫描效率更高:
sourceanalyzer -b 你的构建ID -Dcom.fortify.sca.SuppressErrors=true msbuild E:\your-path\xxx.sln
内容的提问来源于stack exchange,提问作者Ken Hsieh

