В узле 14 у меня был следующий скрипт
scripts: {
"test": "node test.js",
}
Затем я запустил его с помощью следующей команды npm run test -- --value '10'
это дало результат
node test.js "--value" "10"
Но когда я переключаюсь на узел 16, все аргументы, начинающиеся с --, удаляются.
Итак, когда я запускаю npm run test -- --value '10'
, это дает результат
node test.js "10"
Куда делось "--value"?
@CherryDT мы используем yargs для анализа параметров, я работаю в Windows и использую powershell, но я не думаю, что это причина, но если я использую console.info(process.argv)
, я получаю следующее ['C:\\Program Files\\nodejs\\node.exe', 'C:\\projects\\test\\test.js', '10']
Сначала я тестировал Linux, но теперь я также протестировал Windows (и cmd, и powershell), и я все еще получаю --value
. Каковы ваши точные версии node и npm?
узел v16.15.0 и npm 8.10.0
Это также происходит, когда вы запускаете node test.js --value 10
напрямую или только через npm
?
Кажется, это проблема с npm, у меня была другая машина на npm 8.1.2
, где она работала правильно, но когда я обновился до npm 8.10.0
, она перестала работать
Это очень странно. Я пробовал с теми же версиями сейчас, и я не могу воспроизвести эту проблему.
Давайте продолжить обсуждение в чате.
Я не уверен на 100% в первопричине, но теперь я могу объяснить полукоренные причины и способы их решения.
Оказывается, на моей машине есть только файл npm.cmd
в C:\Program Files\nodejs
, а на вашей тоже есть файл npm.ps1
. Похоже, что этот файл создается только в некоторых путях установки/обновления, и обновление вашего узла, по-видимому, вызывает создание этого файла.
Это означает, что когда вы запускаете npm
в PowerShell, он вызывает ExternalScript
, а не Application
. По этой причине к вызову применяется семантика вызова командлетов, а не семантика вызова собственных команд/приложений.
Эта семантика включает использование --
для остановки анализа дальнейших аргументов. Это означает, что в этом случае PowerShell будет потреблять токен --
, поэтому он никогда не дойдет до npm! И, в свою очередь, npm, который сейчас вызывается с npm run test --value 10
без --
, проглотит --value
, потому что он считается аргументом для npm, а не для скрипта, который вы хотите вызвать.
Цитата из документы:
The end-of-parameters token (
--
)The end-of-parameters token (
--
) indicates that all arguments following it are to be passed in their actual form as though double quotes were placed around them. For example, using--
you can output the string-InputObject
without using quotes or having it interpreted as a parameter
Здесь не указано, что это применимо только к командлетам и внешним сценариям, но мое тестирование показало, что это так.
Я могу придумать четыре возможных решения:
npm
на npm.cmd
вместо npm.ps1
: Set-Alias -Name npm -Value npm.cmd
npm.ps1
, чтобы убедиться, что PowerShell вместо этого использует npm.cmd
--
впереди, который используется PowerShell, чтобы следующий--
мог использоваться npm: npm run test -- -- --value 10
или npm -- run test -- --value 10
--
: npm run test '--' --value 10
Как выглядит ваш
test.js
? Если я создам файл сconsole.info(process.argv)
и запущу ваш пример, я получу ожидаемый результат[ '/usr/local/bin/node', '/tmp/test.js', '--value', '10' ]
.