如何使用npm babel和commander.js将选项传递给脚本

时间:2018-09-10 14:27:44

标签: node.js npm babel

有人可以向我解释为什么我在检索选项“ -x”时遇到麻烦吗(见下文)?

我是否必须转义一些字符?

除此之外:

  • 这为什么起作用:node b.js parse url1 url2 url3 -x
  • 但这不是:npm run babel-node a.js parse url1 url2 url3 -x

这是我的package.json文件

{
  "name": "commander_test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "babel-node": "babel-node --presets=env",
    "a": "npm run babel-node a.js parse url1 url2 url3 -x",
    "b": "node b.js parse url1 url2 url3 -x ",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "commander": "^2.18.0"
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.3",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1"
  }
}

npm的结果运行一个:

> commander_test@1.0.0 a D:\repositories\node\commander
> npm run babel-node a.js parse url1 url2 url3 -x


> commander_test@1.0.0 babel-node D:\repositories\node\commander
> babel-node --presets=env "a.js" "parse" "url1" "url2" "url3"

[ 'node',
  'D:\\repositories\\node\\commander\\a.js',
  'parse',
  'url1',
  'url2',
  'url3' ]
parse : url1 => undefined
parse : url2 => undefined
parse : url3 => undefined
     

npm运行b的结果

> commander_test@1.0.0 b D:\repositories\node\commander
> node b.js parse url1 url2 url3 -x

[ 'C:\\Program Files\\nodejs\\node.exe',
  'D:\\repositories\\node\\commander\\b.js',
  'parse',
  'url1',
  'url2',
  'url3',
  '-x' ]
parse : url1 => true
parse : url2 => true
parse : url3 => true

两个文件a.js和b.js相同。 只是a.js使用es6模块和b.js Commonjs模块

    import  program  from "commander"  // a.js
    let program = require("commander") // b.js

//from here it's the exact same code
    console.log(process.argv)
    program
      .version('0.0.1')
      .command('parse <urls...> ')
      .option('-x, --opt',  'opt')
      .action( function (urls, cmd) {
        urls.forEach(url => {
            console.log(`parse : ${url} => ${cmd.opt}`)
          });

      })

program.parse(process.argv)

1 个答案:

答案 0 :(得分:0)

我看到了答案[https://github.com/babel/babel/issues/1730#issuecomment-111247861]

感谢Gajus,这是解决方案:他写道:

  

为了避免对那些偶然发现该线程的人造成混淆   未来,这是一个如何使用-:

的示例      

babel-node --a-./foo --b在这种情况下:

     

-a是传递给节点的选项(例如--debug或--throw-deprecation)。   --b是传递给脚本的选项,即在process.argv下可用。

根据此解决方案,我将脚本更改为:

 "scripts": {
    "a": "babel-node -- a.js  parse url1 url2 url3  -x",
    "b": "node b.js parse url1 url2 url3 -x ",
    "test": "echo \"Error: no test specified\" && exit 1"
  }

而且有效!!

谢谢