我正在为一个 Node.js 项目设置测试。测试包括与应该从本地http-server
提供的静态内容(图像(进行交互。
当测试完成时 - 无论是成功还是失败 - 我想结束服务器进程并使用正确的代码退出。我在 npm 脚本中想出的内容如下:
"server": "http-server testdata -p 9876 -s",
"testcmd": "...",
"test": "npm run server & npm run testcmd && kill $(lsof -t -i:9876) || (kill $(lsof -t -i:9876) && exit 1)",
哪个"有效",但有两个问题:
- 它重复代码,因为我不知道如何在任何情况下运行事物,而不是定义
||
和&&
情况 testcmd
的任何非零退出代码将始终转换为1
退出代码 - 理想情况下,我想传播确切的退出代码
我试着阅读这篇文章,发现人们在谈论陷阱,但无法让它起作用。
简化此控制流方案的好方法是什么?
你的两个问题是相互关联的:如果你的命令被更好地考虑,你会更容易实现你所追求的目标。
由于您不想设置陷阱(对于此任务,我不怪您(,因此您需要做的是捕获testcmd
的退出状态,以便稍后可以重申它。 完成此操作后,您可以无条件地运行清理,因此不会重复。 例如:
npm run server & (npm run testcmd; status=$?; kill $(lsof -t -i:9876); exit $status)
也许特殊$?
参数(可扩展到最近执行的 [部分] 管道的退出状态(是您缺少的部分。