npm скрипт передает параметры/аргументы сценарию узла с использованием yargs

Можно ли запросить извлечение ключа из yargs при использовании в качестве аргумента сценария npm?

Типы пользователей в терминале OSX:

npm run scaffold --name=blah

который выполняется в package.json:

"scaffold" : "node ./scaffold/index.js -- "

Это приводит к

const yargs = require('yargs').argv

if (yargs) {
  console.log(yargs);
  console.log(yargs.name);
  process.exit(1)
}
...
result:
{ _: [], '$0': 'scaffold/index.js' }
undefined

Это работает только в том случае, если я жестко "scaffold": "node scaffold/index.js --name=blah" в package.json "scaffold": "node scaffold/index.js --name=blah", но мне нужно, чтобы это настраивалось.

Как я уже сказал, я использую args, поскольку он, как представляется, упрощает извлечение ключей по имени (в отличие от массива). Открыта для предложений.

Что мне не хватает?

update 11-07-2017 Связано: Отправка аргументов командной строки в сценарий npm

Тем не менее, прохождение в командной строке 1: npm run scaffold name=hello OR 2: npm run scaffold --name=hello дает:

1: { _: [], '$0': 'scaffold/index.js' }
2: { _: [ 'name=hello' ], '$0': 'scaffold/index.js' }

Все еще не видно способа получить свойство yargs.name. Все еще не определено.


Обновление 13-07-2017

На данный момент я сдался. Это просто кажется невозможным. Я запускаю сценарий вручную в терминале. Например

node ./scaffold/index.js --name=blah 

На следующем рисунке показано выполнение сценария узла напрямую, в отличие от запуска сценариев npm. Я добавил https://www.npmjs.com/package/nopt узел, чтобы узнать, помогает ли он (это не так). process.argv.name по-прежнему не определено при запуске через скрипты npm.

enter image description here


Обновление 18-07-2017

Добавлен пример github: https://github.com/sidouglas/stackoverflow-node-arguments


Обновление 24-07-2017

Добавление переменных перед началом работы команды myvar="hello npm run scaffold в отличие от npm run scaffold myvar="hello world"

Ответы

Ответ 1

Я не уверен, что это важно, когда переменные добавляются в командной строке, и если это вас не касается, то это работает:

//package.json
{
  "name": "npm-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {},
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC"
}    

Ваш JS файл:

//index.js
console.log('myvar', process.env.myvar);    

И ваша команда командной строки:

myvar="hello world" npm run start    

Поэтому, в конце концов, просто префикс вашей команды npm script с вашим списком аргументов.

Ответ 2

Начиная с [email protected], вы можете использовать собственные аргументы при выполнении скриптов. Специальный параметр - используется getopt для разграничения конца опций. npm передаст все аргументы после - непосредственно к вашему скрипту:

npm run test -- --grep="pattern"

https://docs.npmjs.com/cli/run-script