пряжа / нпм: выполнение в зависимости от заданной переменной - PullRequest
0 голосов
/ 10 октября 2018

Я в основном взял этот рецепт bash для запуска различных команд в зависимости от того, вызван ли скрипт package.json с параметром или без параметра ...

"scripts": {
    "paramtest": "if [ -z $1 ]; then echo \"var is unset\"; else echo \"var is set to {$1}\"; fi",
    ...

Вызовбез параметра работает должным образом:

$>yarn paramtest
var is unset
$>npm run paramtest
var is unset
$>

При вызове с параметром выдает ошибку:

$>yarn run paramtest foo
/bin/sh: 1: Syntax error: word unexpected
error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
$>npm run paramtest -- foo

> photocmd@0.0.7 paramtest /depot/own/photocmd

sh: 1: Syntax error: word unexpected
...

Что не так?

1 Ответ

0 голосов
/ 10 октября 2018

Согласно этому ответу и этому комментарию, yarn run поддерживает только передачу аргументов в конец скрипта, а не в середину.Это поведение аналогично npm run.

Чтобы обойти это ограничение, вам необходимо поместить текущую условную логику в тело bash-функции .Например:

"scripts": {
  "paramtest": "func () { if [ -z \"$1\" ]; then echo \"var is unset\"; else echo \"var is set to ${1}\"; fi ;}; func",
...

Теперь, когда вы передаете аргумент скрипту через CLI, он получает:

  1. Добавляется в конец скрипта paramtest, т.е. послеfunc invocation.
  2. Впоследствии передается в качестве аргумента самой функции func.
  3. В теле функции func на первый параметр ссылаются с помощью $1 вtest и ${1} в строке echo.

Примечание: $1 в тесте заключено в двойные кавычки с пробелом в json, т.е. \"$1\"

Запуск сценария:

При передаче аргумента в ваш скрипт через CLI было бы безопаснее также включить -- между именем скрипта (т.е. paramtest) и аргументом (foo).Например:

yarn run paramtest -- foo
                   ^^

Потому что, если ваш аргумент начинается с дефиса (как показано в следующей команде), он будет интерпретирован как опция:

yarn run paramtest -foo
                   ^

и ваш скрипт напечатает:

var is unset

Однако при добавлении --, как показано в следующем примере;

yarn run paramtest -- -foo
                   ^^ ^

правильно печатает:

var is set to -foo

...