如果“测试”脚本失败,纱线“后测”脚本将不起作用

Posted

技术标签:

【中文标题】如果“测试”脚本失败,纱线“后测”脚本将不起作用【英文标题】:Yarn "posttest" script does not work if "test" script fails 【发布时间】:2020-11-07 21:48:24 【问题描述】:

好吧,我的package.json 中有这些脚本,用于在 NodeJS 中测试一些代码。

"scripts": 
    "pretest": "env NODE_ENV=test sequelize db:migrate",
    "test": "jest",
    "posttest": "env NODE_ENV=test sequelize db:migrate:undo:all"

当测试通过时,“posttest”运行,但当测试失败时,我收到一个

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

在 VS 代码中。关于这个问题的链接上没有任何有用的信息,互联网上也没有。

所以我找到了这个关于 NPM 的链接:

https://github.com/npm/npm/issues/5493

那家伙说:

在绝大多数情况下,用户会感到不愉快 如果在测试失败后运行后测(你不希望你的 正在清理测试环境或发布新版本,如果 例如,测试失败)。因此,这种行为不是 会改变。放置类似 "test":"npm run-script 测试失败 || npm run-script 强制清理”进入你的 package.json 会给你你想要的。

这并没有解决我的问题。经过更多研究,我发现了这一点:

npm posttest doesn't trigger if npm test fails

这些解决方案也对我不起作用。

那么,即使测试失败,我该如何运行“posttest”脚本呢?

【问题讨论】:

这些解决方案到底有什么不适合的?这个应该适用于你的情况并且可行,***.com/a/52073818/3731501。 您的意思是npm-run-all 应该可以工作吗?因为它没有。我尝试了所有我能想到的可能性,但都没有奏效。 --continue-on-error 是 NPM 的一个参数并且也适用于 Yarn 吗? 是的。 --continue-on-error 在这种情况下是必不可少的。它是 npm-run-all arg,而不是 NPM。 npm-run-all 也支持 Yarn。 好吧,我以为npm-run-all 是npm 的原生arg,但它是一个包。根据此页面npmjs.com/package/npm-run-all 有参数npm-run-allrun-s,所以我尝试了"test": "npm-run-all jest posttest --continue-on-error""test": "run-s jest posttest --continue-on-error",在这两个中我都得到了ERROR: Task not found: "jest" error Command failed with exit code 1. 你有什么想法吗? 【参考方案1】:

嗯,通过上面的对话,我得到了这个解决方案:

这是我在package.json中的脚本:

"scripts": 
    "dev": "nodemon src/server.js",
    "pretest": "env NODE_ENV=test sequelize db:migrate",
    "run-tests": "jest",
    "run-after-tests": "env NODE_ENV=test sequelize db:migrate:undo:all",
    "test": "npm-run-all run-tests run-after-tests --continue-on-error"
,

我安装了npm-run-all 包,即使测试失败,它也会运行run-after-test 脚本。现在我得到了错误

error Command failed with exit code 1.

来自test 脚本,并且

ERROR: "test" exited with 1.
error Command failed with exit code 1.

来自run-after-test,但最终我的问题得到了解决。如果有人在脚本末尾有没有错误的更好解决方案,请与我们分享。

【讨论】:

应该是相反的,自定义run-tests 脚本用于jest 和内置test 用于npm-run-all。否则pretest 不会自动匹配清理。使用 npm-run-all 执行此操作的目的是在失败时能够得到错误,否则可以使用 shell ;。但它不应该一直以错误退出,这意味着 Jest 或清理失败。你可以单独调试它们,但它似乎是在开玩笑。 我将需要更多时间来理解正确的方法,但如果你能修复代码,请随意。 应该是"run-tests": "jest", "run-after-test": "env NODE_ENV=test sequelize db:migrate:undo:all", "test": "npm-run-all run-tests run-after-test --continue-on-error" 纱线有替代品吗?谢谢! 稍后编辑:没关系。似乎 yarn-run-all 存在,但在 package.json 脚本中,您使用 npm-run-all 运行它。真的很奇怪的互动,但它的工作。

以上是关于如果“测试”脚本失败,纱线“后测”脚本将不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果文本是在 textarea 中生成的,则 Javascript 字数统计功能不起作用

jQuery插件不起作用……“类型错误:'undefined'不是一个函数”

纱线全局命令不起作用

Pig 脚本:STORE 命令不起作用

Google Apps 脚本 - 工作表 - 菜单触发器不起作用

相对路径在 cron PHP 脚本中不起作用