在Visual Studio 2019中,Swallow/Ignore自定义构建步骤中的错误



Q:如何忽略Visual Studio自定义构建步骤中的错误;是否继续构建过程

在我的例子中,我有一个NodeJS脚本,exec是一个可执行文件,它可能存在,也可能还不存在,因为它将由第一次成功的Build运行构建。这是一个引导程序脚本,在二进制文件交付之前一直在伪造它。

因此,预计会出现错误,所有这些错误都会被NodeJS脚本捕获并通过"伪造"进行处理。

问题是,当Visual Studio 2019在记录exec(或者更确切地说:process.execFileSync)输出时发现其报告的任何错误时,它会在运行此脚本后中止构建过程。我是登录到stderr还是stdout似乎无关紧要。

不太相关,但对于好奇的人来说:这是NodeJS脚本。粗糙&准备好了

注意:为了简洁起见,不重要的部分被剪掉:[...]。完整的脚本位于@@@@

[...]
if (fs.existsSync(replCfile)) {
fs.unlinkSync(replCfile);
}
[...]
try {
if (fs.existsSync(mutoolExe)) {
const stdout = execFileSync(mutoolExe, ['qjsc', '-v', '-c', '-o', replCfile, replJSfile]);
console.log(stdout);
if (fs.existsSync(replCfile)) {
console.log("Successfully generated the repl C source file from repl.js");
}
else { 
bootstrap();
}
}
else {
bootstrap();
}
} catch (ex) {
// Note this bit; it'll show up in the answer again!
console.log("COMPILE FAILED:", ex);
bootstrap(true);
}
[...]
function bootstrap(forced) {
if (forced) {
forced = "FORCED";
}
if (!fs.existsSync(replCfile) || forced) {
console.log(`BOOSTRAPPING ${ forced }: faking an empty repl C source file`);
fs.writeFileSync(replCfile, `
[...]
`, 'utf8');
}
[...]
process.exit(0);
}

调查:我尝试的东西&看

  • 在Visual Studio 2010的预构建步骤中吞噬错误——没有骰子。

    • set ERRORLEVEL=0:无法交付。没有效果
    • EXIT 0:同上。没有效果
    • EXIT /B 0:无效。(另请参阅内部cmd.exe命令设置的ERRORLEVEL值是什么?https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-ignore-errors-in-tasks?view=vs-2019为什么:如果我读对了,/B会让退出代码通过。)
    • ... ContinueOnError="true"修补到.vcxproj文件的任何位置:禁飞区!更糟糕的是:现在你的项目根本无法加载

    很明显,MS觉得构建前/构建后步骤和自定义构建步骤之间有很大区别?不管怎样,我们看得更远。。。

  • 在Visual Studio 2010后期构建和预构建事件中使用robocopy

    我想:";见鬼,我在构建中使用了机器人复制,让我们看看吧&";。没有骰子。相同的解决方案,没有工作。

  • 如何抑制Visual Studio 2017(C#)中的初始生成后事件错误?

    这是最近的事!但是

    我在.vcxproj中没有这样的<Target>。(C#与C/C++项目文件的XML差异。这开始让人恼火。

    Microsoft文档怎么样?

  • https://learn.microsoft.com/en-us/cpp/build/troubleshooting-build-customizations?view=msvc-160。。。以及周围环境。没什么用。故障排除就到此为止。

  • 还花了几分钟绝望地浏览了微软DevStudio论坛,但像往常一样,如果你想找到有用的东西,就忘了整个舞台,直接去SO。叹气

  • 很多不值得一提

好奇的观察(答案提示)

无论我做什么,它总是以以下方式结束:

  • ✅没有任何错误,✅快乐建造,我们很好✅.

    这种情况只有在对编译的二进制文件进行核处理之后才会发生,即销毁NodeJS脚本正在查找的muToolExe并尝试exec

    或者当我取出execFileSync调用,从而破坏引导程序脚本时。

  • ❌错误太多,❌生成立即中止,❌不好❌.

    这里唯一的变量是Visual StudioErrors选项卡中报告的错误数量。(当然,你也可以在Output选项卡中看到这些错误,但根据你刚刚做了什么和做了什么,你会得到1(一)个错误或2(两)个错误。)。从不(0)为零。

BTW,您使用的是DevStudio的哪个版本

v16.10.2-这是撰写本文时DevStud2019的最新更新。

不过,我怀疑2019年的所有版本都受到了这种影响。我不想仅仅为了验证这一点而降级,所以YMMV。

A:Visual Studio 2019"嗅";您的Output正在查找要报告的error。(或者看起来是这样…)

这一切都消失了,并解决了我对那些讨厌的error报告的问题,我希望DevStudio完全忽略,这是因为Visual Studio可能正在以某种方式"解析"我的自定义构建步骤生成的stderr/stdout输出。

所以我去调整了一下自定义构建步骤命令脚本(见上面的问题)。

这是上面的原始部分:

[...]
} catch (ex) {
// Note this bit; it'll show up in the answer again!
console.log("COMPILE FAILED:", ex);
bootstrap(true);
}
[...]

下面是它现在的样子,*POOF*我所有的麻烦都过去了:

[...]
} catch (ex) {
//console.log("COMPILE FAILED:", ex);
let errmsg = `COMPILE FAILED: ${ex}`;
console.log(errmsg.replace(/Error/ig, 'Warning'));
bootstrap(true);
}
[...]

这样做的目的是在execFileSync输出输出到stdout之前对其进行过滤,用良性的"警告"替换其中的每个"错误"(出于诊断原因不想丢弃该输出!)

结论:确保您的自定义构建步骤永远不要说"CCD_ 22">任何地方

这就是.replace(/Error/ig, 'Warning')对我的场景所做的。我的输出目前看起来像这样:

1>COMPILE FAILED : warning : Command failed: Z:libtoolingqiqqaMuPDFplatformwin32binDebug-Unicode-32bit-x86mutool.exe qjsc -v -c -o Z:libtoolingqiqqaMuPDFplatformwin32....scriptslibQuickJSqjsrepl.c Z:libtoolingqiqqaMuPDFplatformwin32....scriptslibQuickJS../../thirdparty/owemdjee/QuickJS/repl.js
1>BOOSTRAPPING FORCED: faking an empty repl C source file
1>BOOSTRAPPING FORCED: faking an empty calc C source file

Visual Studio 2019又是一个快乐的露营者,成功地完成了Builds,最终允许该项目中的引导机制按预期工作:在清理后的第一次运行时伪造它,然后运行(以前构建的)可执行文件来生成生成的内容。

BTW,.replace(/Error/ig, 'Warning')现在确实有execFileSync故障显示为警告项!这告诉我DevStud确实在调查我的整个Output,寻找要报告和中止的错误。但在任何地方都没有找到这些信息,所以如果你们能给我指一下这方面的参考资料,我会很高兴的!

YMMV&萨约纳拉

虽然上面MAY问题中引用的SO链接/解决方案仍然适用于构建前/构建后步骤,但它们肯定不适用于自定义构建步骤。

希望这能帮助任何和我一样踏入同一个柏油路的人。我选择了自定义构建步骤,因为这些步骤包括InputOutput文件列表,因此应该作为构建依赖链的一个不错的部分(对比构建前/构建后步骤),但后来信息变得有点单薄。。。

享受吧。这花费了太多的时间来挖掘,所以让我们向前支付,并希望谷歌/必应/鸭子能帮助你们(还有我,下次我遇到这个问题时,忘记了如何…)

最新更新