Короткий ответ:
По сути, вам нужен npm-скрипт, подобный этому, где <arg-here>
предоставляется через CLI;
...
"scripts": {
"my-build": "npm run vumper <arg-here> && npm run format",
...
},
...
Однако, к сожалению, в npm нет встроенной функции для достижения этой цели.
Специальная опция npm --
(дополнительную информацию об этой опции см. в конце Решения 1 ниже) можно использовать только для передачи аргумента в END сценарий, но НЕ в СРЕДНИЙ. Итак, если бы ваши две команды были в противоположном порядке, параметр --
можно было бы использовать следующим образом:
...
"scripts": {
"my-build": "npm run format && npm run vumper --",
...
},
...
Чтобы преодолеть ограничение отсутствия встроенной функции для передачи аргумента в MIDDLE сценария, рассмотрите следующие решения:
Решение только для Bash см. в разделе Решение 1.
Если требуется межплатформенная поддержка, следуйте решению, описанному в разделе Решение 2.
Решение 1. Bash (MacOS/Linux/и т. д.):
Настройте сценарий my-build
в разделе scripts
файла package.json для вызова Bash функция оболочки, как показано ниже:
package.json
...
"scripts": {
"my-build": "func() { npm run vumper \"$1\" && npm run format; }; func",
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -width=80 --write package.json"
},
...
Пояснение:
Функция Bash с именем func
делает следующее:
- Сначала работает
npm run vumper <arg>
. При этом <arg>
будет аргументом оболочки, передаваемым через CLI. В сценарии на него ссылается $1
(т. е. первый позиционный параметр/аргумент).
- Впоследствии он запускает сценарий с именем
format
с помощью команды npm run format
.
Эти две команды npm run
объединены в цепочку с помощью оператора &&
, поэтому вторая команда npm run format
запустится только в том случае, если начальная команда npm run vumper <arg>
завершится успешно (т. е. вернет код выхода 0
).
Запуск сценария my-build
:
Чтобы вызвать my-build
через интерфейс командной строки, вам нужно запустить:
npm run my-build -- dv
Примечание:
В этом случае конечная часть dv
является аргументом, который будет передан вашему сценарию vumper
.
- #P16# <блочная цитата> #P17# блочная цитата>
Решение 2. Кроссплатформенность.
Для кроссплатформенного решения (которое успешно работает с Bash, командной строкой Windows/cmd.exe, PowerShell и т. д.) вам потребуется использовать вспомогательный скрипт nodejs следующим образом.
run.js
Давайте назовем скрипт nodejs run.js и сохраним его в корневом каталоге проекта на том же уровне, что и package.json.
const execSync = require('child_process').execSync;
const arg = process.argv[2] || 'dv'; // Default value `dv` if no args provided via CLI.
execSync('npm run vumper ' + arg, {stdio:[0, 1, 2]});
execSync('npm run format', {stdio:[0, 1, 2]});
package.json
Настройте свой скрипт my-build
для вызова run.js следующим образом:
...
"scripts": {
"my-build": "node run",
"vumper": "node node_modules/vumper/index.js",
"format": "prettier --single-quote -width=80 --write package.json"
},
...
Запуск скрипта my-build
:
Согласно Решению 1, чтобы вызвать my-build
через интерфейс командной строки, вам нужно выполнить:
npm run my-build -- dv
Пояснение:
run.js использует process.argv
для получения аргумент, передаваемый через интерфейс командной строки (например, dv
). Если при запуске npm run my-build
аргумент не указан, значение по умолчанию (то есть dv
) передается в vumper
npm-скрипт.
run.js также использует child_process.execSync(...)
для shell- out/вызвать две команды npm run
.
person
RobC
schedule
18.07.2018