【问题标题】:Swallow / Ignore errors in Custom Build Steps in Visual Studio 2019在 Visual Studio 2019 中的自定义构建步骤中吞下/忽略错误
【发布时间】:2021-06-21 16:05:12
【问题描述】:

问:如何忽略 Visual Studio 自定义构建步骤中的错误并继续构建过程?

就我而言,我有一个 NodeJS 脚本,exec 是一个可执行文件,它可能存在也可能不存在,因为它将由第一次成功的构建运行构建。这是一个引导脚本,在该二进制文件交付之前对其进行伪装。

因此,那里会出现错误,所有错误都会被 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);
}

调查:我尝试和查看的东西

好奇的观察(提示答案)

无论我做什么,结果总是:

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

    这仅在对已编译的二进制文件进行核对后发生,即销毁 NodeJS 脚本正在寻找的 muToolExe 并尝试 exec

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

  • ❌错误很多,❌构建立即中止,❌不好❌。

    这里唯一的变量是您将在 Visual Studio Errors 选项卡中报告多少错误。 (当然,您也可以在 Output 选项卡中看到这些内容,但根据您刚刚所做和弄乱的内容,您会收到 1(一)错误或 2(二)错误。从不(0)零。

顺便说一句,您使用的是哪个版本的 DevStudio?

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

怀疑不过,所有 2019 版本都受此影响。我不想降级只是为了验证这一点,所以 YMMV。

【问题讨论】:

    标签: visual-studio


    【解决方案1】:

    答:Visual Studio 2019 “嗅探”您的 Output 寻找 errors 进行报告。 (或者看起来……)

    让这一切都消失并解决了我希望 DevStudio 完全忽略的那些讨厌的 error 报告的问题的发现是,也许 Visual Studio 以某种方式试图“解析”我的自定义构建步骤生成的标准错误/标准输出输出。

    所以我稍微调整了我的 Custom Build Step 命令脚本(参见上面的问题)。

    这是上面的原始部分:

    [...]
    } 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 输出并在输出到标准输出之前对其进行过滤,用良性“警告”替换其中的每个“错误”(出于诊断原因不想丢弃该输出!)

    ???!

    结论:确保您的自定义构建步骤从不说“error任何地方

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

    1>COMPILE FAILED : warning : Command failed: Z:\lib\tooling\qiqqa\MuPDF\platform\win32\bin\Debug-Unicode-32bit-x86\mutool.exe qjsc -v -c -o Z:\lib\tooling\qiqqa\MuPDF\platform\win32\..\..\scripts\libQuickJS\qjsrepl.c Z:\lib\tooling\qiqqa\MuPDF\platform\win32\..\..\scripts\libQuickJS\../../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 又是一个快乐的露营者,成功完成构建,终于允许项目中的这个引导机制按预期工作:在清理后第一次运行时伪造它,然后运行 ​​(以前构建的)可执行文件以生成生成的内容。

    顺便说一句,.replace(/Error/ig, 'Warning') 现在确实将execFileSync 故障显示为警告 项!这告诉我 DevStud 确实在寻找我的整个Output 以寻找错误报告和中止。虽然还没有在任何地方找到该信息,所以如果你们都可以指出我的参考资料,我会很高兴!

    YMMV & Sayonara

    虽然上述问题中引用的 SO 链接/解决方案可能仍然适用于 Pre/Post 构建步骤,但它们肯定不适用于自定义构建步骤。

    希望这对和我一样踏入同一个沥青坑的人有所帮助。我选择了自定义构建步骤,因为它们包括 InputOutput 文件列表,因此应该作为构建依赖链的一个不错的部分(对比 Pre/Post-Build Steps),但随后信息变得有点薄地...

    享受。这花费了太多时间来挖掘,所以让我们向前支付,并希望 Google/Bing/Duck 能帮助你们所有人(还有我,下次我遇到这个并且?忘记了具体如何......)。

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2011-04-10
      • 2021-04-16
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多