Присвойте значение случайного числа (UUID) переменной среды в скрипте npm - PullRequest
0 голосов
/ 27 февраля 2019

Я бы хотел добавить аргумент UUID при вызове моего скрипта npm.Каждый раз, когда вызывается скрипт, я бы хотел сгенерировать новый номер.Это должно выглядеть так:

"build": "cross-env UUID=unique_number ng build"

Единственное, что мне нужно, это генерировать unique_number здесь.Я пытался использовать пакет uuid, но я не знаю, как запустить его в сценарии и передать число в качестве аргумента.

1 Ответ

0 голосов
/ 28 февраля 2019

tl; dr Поскольку ваш вопрос показывает использование cross-var Я предположил, что требуется кроссплатформенное решение.В этом случае см. Решение A .Однако, если мое предположение неверно, обратитесь либо к Solution B , либо к C .


Решение A: Кроссплатформенность (Windows / Linux / macOS ...)

Для кроссплатформенного решения (т. Е. Успешно работающего в Windows, Linux и macOS ...) вам потребуется использовать nodejs для выполнения ваших требований.Есть несколько различных подходов к этому, как описано в следующих двух подразделах:

  • Использование внешнего файла nodejs (.js)
  • Вставка вашего JavaScript в пакет.json.

Примечание оба подхода практически одинаковы

Использование файла внешнего nodejs (.js)

  1. Создать служебный скрипт 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]} );
    
  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 .

  1. В разделе 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 .См. ответ для дальнейшего объяснения.

...