Вот как я традиционно запускал скрипты node / npm в моем файле package.json:
"scripts": { "testRun": "node ./runtest.js && node ./runreports.js",
Запуск npm run testRun
или yarn testRun
запустит сценарий runtest.js, за которым следует сценарий runreport.js, но есть одна загвоздка: &&
часть этой формулировки на самом деле является логическим логическим И. Это означает, что если первый скрипт возвращает код ошибки, например Exit code (1)
, то результаты этого скрипта будут оцениваться как false,
, и в этом случае логическое И гарантирует, что второй скрипт вообще не запустится.
Итак, я попытался изменить его с логического И на логическое ИЛИ, например:
"scripts": { "testRun": "node ./runtest.js || node ./runreports.js",
Теперь мой второй сценарий запускается при ошибке первого, но он только запускается, если это так. Если первый скрипт не возвращает ошибку, то второй сейчас не запускается; не так много улучшений!
Погугливал, кажется, что точка с запятой - это правильный синтаксис для запуска второго скрипта независимо от того, что делает первый, например:
"scripts”": { "testRun": "node ./runtest.js; node ./runreports.js",
Большой! Или это так, если вы используете ОС в стиле unix, например Mac OS X или Linux. К сожалению, я использовал Windows из-за того, что совершил ужасные грехи в прошлой жизни. К сожалению, синтаксис с точкой с запятой просто не работает в Windows, потому что это, ну… Windows. (Примечание: я использовал оболочку Git Bash в Windows 7. Я понимаю, что в Windows 10 есть какая-то надлежащая оболочка bash, поэтому, возможно, синтаксис с точкой с запятой там работает.)
Я подумал об этом еще немного, и мне пришло в голову, что, поскольку это проблема булевой логики, должно быть какое-то решение булевой логики. Действительно, было!
Теперь в логической логике something OR true
всегда приводит к true
, например:
true OR true = true true OR false = true false OR true = true
Применяя эту логику к моему сценарию package.json, я придумал следующее:
"scripts": { testRun: "(node ./runtest.js || true) && node ./runreports.js",
Если заключить первый вызов сценария в скобки и логическое ИЛИ с true
, результат этого раздела в квадратных скобках должен всегда быть true
. Теперь мой скрипт runreports.js будет работать независимо от того, что делает скрипт runtest.js.
Дополнительная информация
Https://github.com/npm/npm/issues/4040
(Включает мой комментарий, предлагающий решение выше. Как ни странно, до сих пор никто не признал мою гениальность, но это, конечно, только вопрос времени 😉.)