tl; dr Поскольку ваш вопрос показывает использование cross-var
Я предположил, что требуется кроссплатформенное решение.В этом случае см. Решение A .Однако, если мое предположение неверно, обратитесь либо к Solution B , либо к C .
Решение A: Кроссплатформенность (Windows / Linux / macOS ...)
Для кроссплатформенного решения (т. Е. Успешно работающего в Windows, Linux и macOS ...) вам потребуется использовать nodejs для выполнения ваших требований.Есть несколько различных подходов к этому, как описано в следующих двух подразделах:
- Использование внешнего файла nodejs (.js)
- Вставка вашего JavaScript в пакет.json.
Примечание оба подхода практически одинаковы
Использование файла внешнего nodejs (.js)
Создать служебный скрипт nodejs.Давайте назовем файл run-ng-build.js и сохраним его в корневом каталоге вашего проекта, то есть в том же каталоге, где в данный момент находится package.json :
run-ng-build.js
const uuid = require('uuid/v1');
const execSync = require('child_process').execSync;
process.env.UUID = uuid();
execSync('ng build', { stdio: [0, 1, 2]} );
В разделе scripts
вашего package.json замените текущий сценарий build
следующим:
package.json
"scripts": {
"build": "node run-ng-build"
}
Объяснение:
- В run-ng-build.js нам требуется пакет uuid и встроенный nodejs
execSync()
. - Чтобы создать переменную среды с именем
UUID
, мы используем встроенную переменную nodejs process.env
и присваиваем значение uuid вызывая uuid()
. - Затем мы вызываем команду
ng build
, используя execSync
. - Опция
options.stdio
настраивает каналы между родительским идочерний процесс - [0, 1, 2]
эффективно наследует stdin
, stdout
и stderr
.
Включение вашего JavaScript в package.json .
Кроме того, вы можете встроить свой код nodejs / JavaScript в раздел scripts
вашего пакета .json .
В разделе scripts
вашего package.json замените текущий сценарий build
следующим:
package.json
"scripts": {
"build": "node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng build', { stdio: [0, 1, 2]} );\""
}
Объяснение:
- Это фактически то же самое, что и вышеупомянутое решение, в котором использовался отдельный файл
.js
, однако использование отдельного сценария / файла nodejs теперь избыточно. - Параметр командной строки nodejs
-e
используется для оценки встроенного JavaScript.
Важно Пакет cross-env является избыточным с использованием любого из двух вышеупомянутых решений.Чтобы удалить его, запустите: npm un -D cross-env
через CLI.
Решение B: * Только для платформ Nix (Linux / MacOS ...)
Только для платформ * nix становится оченьвкратце, вы можете просто определить свой build
скрипт в package.json следующим образом:
package.json
"scripts": {
"build": "cross-env UUID=$(uuid) ng build"
}
Используется функция Bash, известная как подстановка команд , то есть $(uuid)
.Однако, если * nix - единственная платформа, которую вам нужно поддерживать, то cross-env
действительно не требуется.Вместо этого используйте встроенную функцию export .Например:
package.json
"scripts": {
"build": "export UUID=$(uuid) && ng build"
}
Решение C: Только для Windows (cmd.exe)
В Windows (только), запущенной через командную строку или PowerShell, вы можете сделать следующее:
package.json
"scripts": {
"build": "FOR /F %U IN ('uuid') DO cross-env UUID=%~U node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng buuld', { stdio: [0, 1, 2] });\""
}
Thisаналогичен первому примеру, показанному в Решение B , однако подстановка команд достигается (очень) иначе в cmd.exe .См. ответ для дальнейшего объяснения.