Я создаю сценарий bash, который проходит через каждый из моих проектов и запускает npm run test, если сценарий test существует.
Я знаю, что если я займусь проектом и запущу npm run, он предоставит мне список доступных скриптов следующим образом:
Lifecycle scripts included in www:
start
node server.js
test
mocha --require @babel/register --require dotenv/config --watch-extensions js **/*.test.js
available via `npm run-script`:
dev
node -r dotenv/config server.js
dev:watch
nodemon -r dotenv/config server.js
build
next build
Однако я понятия не имею, как получить эту информацию, посмотреть, доступен ли test, а затем запустить его.
Вот мой текущий код:
#!/bin/bash
ROOT_PATH = "$(cd "$(dirname "$0")" && pwd)"
BASE_PATH = "${ROOT_PATH}/../.."
while read MYAPP; do # reads from a list of projects
PROJECT = "${MYAPP}"
FOLDER = "${BASE_PATH}/${PROJECT}"
cd "$FOLDER"
if [ check here if the command exists ]; then
npm run test
echo ""
fi
done < "${ROOT_PATH}/../assets/apps-manifest"





Обновлено: Как упоминалось Мари и Джеймсом, если вы хотите запустить команду только в том случае, если она существует, у npm есть опция для этого:
npm run test --if-present
Таким образом, у вас может быть общий сценарий, который работает с несколькими проектами (которые могут иметь или не иметь конкретную задачу) без риска получить ошибку.
Источник: https://docs.npmjs.com/cli/run-script
РЕДАКТИРОВАТЬ
Вы можете выполнить команду grep, чтобы проверить слово test:
npm run | grep -q test
это вернет истину, если результат в npm run содержит слово test
В вашем скрипте это будет выглядеть так:
#!/bin/bash
ROOT_PATH = "$(cd "$(dirname "$0")" && pwd)"
BASE_PATH = "${ROOT_PATH}/../.."
while read MYAPP; do # reads from a list of projects
PROJECT = "${MYAPP}"
FOLDER = "${BASE_PATH}/${PROJECT}"
cd "$FOLDER"
if npm run | grep -q test; then
npm run test
echo ""
fi
done < "${ROOT_PATH}/../assets/apps-manifest"
Было бы проблемой, если бы слово «тест» было в другом значении. Надеюсь, поможет
Я добавлю ваше предложение @MarieHoeger, что касается настоящего случая пользователя, это действительно лучшее решение, я все равно оставлю свое другое решение, потому что для точного описания вопроса (как проверить, существует ли сценарий npm?) Мое решение можно использовать в большем количестве случаев и может помочь другим пользователям.
Отлично, спасибо, @Denis! Я думаю, что моя формулировка была более резкой, чем я предполагал. Извинения!
Это только у меня или решение --if-present ... неверно? Отсутствие определения «тестового» сценария и последующий запуск npm test, npm run test, npm run-script test и т. д. Как с флагом --is-present, так и без него дает одинаковый результат: > echo 'Error: no test specified'Error: no test specified
Я проверил и получил то же поведение здесь ... но похоже, что это характерно для команды "test", для любой другой команды это работает. Я думаю, что есть какой-то тестовый сценарий по умолчанию, если вы его не определяете, поэтому он всегда присутствует (по крайней мере, для --if-present), но я не мог ничего в документации, подтверждающей это
Правильное решение - использовать флаг if-present:
npm run test --if-present
Почему это правильное решение? Что делает --if-present? Пожалуйста, расширите этот ответ.
Флаг --if-present будет запускать указанный сценарий, только если он определен.
Так что поясните это в своем ответе. Расширьте его, сделайте действительно отличный ответ.
Спасибо, @James !! Этот ответ меня спас :) Вот ссылка на документы npm: docs.npmjs.com/cli/run-script
Я бы хотел, чтобы это было применимо и к пряже
Если вам нужно запустить сценарий, если он существует, ИНАЧЕ, сделайте что-нибудь еще, это не обязательно «правильное решение».
К вашему сведению: ответ ниже (для использования
npm run test --if-present) - лучшее решение