如何使用 npm babel 和 commandjs 将选项传递给脚本 [重复]

Posted

技术标签:

【中文标题】如何使用 npm babel 和 commandjs 将选项传递给脚本 [重复]【英文标题】:how to pass options to scripts using npm babel and commanderjs [duplicate] 【发布时间】:2019-02-15 00:29:31 【问题描述】:

有人能解释一下为什么我无法检索选项“-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 run 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】:

我看到了答案 [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"
  

它成功了!

谢谢

【讨论】:

以上是关于如何使用 npm babel 和 commandjs 将选项传递给脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 webpack 4 和 babel 7 导入 soap-npm 模块

babel的安装和使用方法

npm WARN babel-loader@6.2.8 需要 babel-core@^6.0.0 的对等点,但没有安装

如何使用 Babel 转换 scss 以获得反应包?

我自己的包中的npm包babel错误

npm+webpack+babel+react安装