Аргументы скриптов, начинающиеся с --, удаляются

В узле 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"?

Как выглядит ваш test.js? Если я создам файл с console.info(process.argv) и запущу ваш пример, я получу ожидаемый результат [ '/usr/local/bin/node', '/tmp/test.js', '--value', '10' ].

CherryDT 16.05.2022 15:12

@CherryDT мы используем yargs для анализа параметров, я работаю в Windows и использую powershell, но я не думаю, что это причина, но если я использую console.info(process.argv), я получаю следующее ['C:\\Program Files\\nodejs\\node.exe', 'C:\\projects\\test\\test.js', '10']

Peter 16.05.2022 15:16

Сначала я тестировал Linux, но теперь я также протестировал Windows (и cmd, и powershell), и я все еще получаю --value. Каковы ваши точные версии node и npm?

CherryDT 16.05.2022 15:18

узел v16.15.0 и npm 8.10.0

Peter 16.05.2022 15:20

Это также происходит, когда вы запускаете node test.js --value 10 напрямую или только через npm?

CherryDT 16.05.2022 15:20

Кажется, это проблема с npm, у меня была другая машина на npm 8.1.2, где она работала правильно, но когда я обновился до npm 8.10.0, она перестала работать

Peter 16.05.2022 15:24

Это очень странно. Я пробовал с теми же версиями сейчас, и я не могу воспроизвести эту проблему.

CherryDT 16.05.2022 15:25

Давайте продолжить обсуждение в чате.

CherryDT 16.05.2022 15:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен на 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

Другие вопросы по теме