Передача значений из cmd в npm скрипт - PullRequest
2 голосов
/ 27 апреля 2020

Я искал несколько дней, но не нашел ответа, который помог бы решить мою проблему.

Я хочу запустить npm скрипт через cmd или Powershell в Windows и передать значения для переменных скрипта. Я хотел бы, чтобы нижеприведенный сценарий на package.json:

"scripts": {
    "happy-birthday": "echo Happy birthday $NAME and many returns!"
    }

Вывод:

С Днем Рождения, Дэнни и много возвращений!

С команда вроде:

npm run happy-birthday --NAME=Danny

Все, что я тестировал до сих пор, дает мне:

С Днем Рождения $ NAME и много возвращений!

Такое чувство, что npm не распознает это как переменную и печатает как строку. Я также протестировал% NAME%.

Npm версия - 6.12.1

1 Ответ

2 голосов
/ 27 апреля 2020

Вы не можете передавать аргументы в середину npm скриптов, аргументы могут передаваться только в их конец. См. Мой ответ здесь для дальнейшего объяснения.

В вашем примере рассмотрим следующее решение, которое будет успешно работать на всех платформах:

  1. В вашем пакет. json файл определяет ваш скрипт happy-birthday npm следующим образом:

    "scripts": {
      "happy-birthday": "node -e \"console.log('Happy birthday %s and many returns!', process.argv[1] || 'Jane')\""
    }
    
  2. Затем выполните следующую команду через cmd или Powershell (или любой другой инструмент командной строки).

    npm run happy-birthday -- Danny
    

    Это напечатает:

    С Днем Рождения, Дэнни и много возвращений!

    Примечание: Если вы просто выполните следующую команду, то есть без передачи аргумента:

    npm run happy-birthday
    

    Вместо этого будет напечатано имя по умолчанию:

    С Днем Рождения, Джейн и много возвращений!


Объяснение:

  • Сценарий npm использует параметр командной строки nodejs -e для оценки встроенного JavaScript следующим образом:

    console.log('Happy birthday %s and many returns!', process.argv[1] || 'Jane')
    
  • Переданные аргументы через CLI, например, Danny, считываются с использованием process.argv - посредством чего мы ссылаемся на элемент массива с индексом 1.

  • Логическое ИЛИ Оператор , т. Е. || используется для возврата Jane, когда аргумент не передается.


Редактировать: Вместо этого можно задавать переменные среды

В качестве альтернативы может потребоваться установка переменная окружения и ссылка на нее в вашем скрипте npm.

  1. В вашем скрипте npm определите свой скрипт happy-birthday npm следующим образом:

    "happy-birthday": "echo Happy birthday %NAME% and many returns!"
    

    Примечание %NAME% нотация используется Windows только для ссылки на переменную.

  2. Использование cmd

    При использовании cmd (то есть Командная строка ) вам нужно будет выполнить следующую команду:

    set NAME=Danny&& npm run happy-birthday
    

    Использование Powershell

    При использовании Powershell вместо этого вам нужно будет выполнить следующую команду:

    $env:NAME="Danny" ; npm run happy-birthday
    

Примечание: Оболочка по умолчанию, которую npm использует для сценариев npm, равна sh on * nix и cmd on windows. Поэтому вышеупомянутые методы, определенные в шагах 1 и 2, не будут работать на платформах * nix .

Если требуется межплатформенная поддержка, и вы хотите использовать этот подход для установки переменных среды и обращения к ним через сценарии npm, затем рассмотрите возможность использования пакета cross-env .

...