如何用参数运行npm {bin:script.js}

我打算做一些类似于lodash自定义构build。 所以一般来说,我想让用户写下如下命令:

lodash category=collection,function 

哪个创build自定义模块只是我指定的类别

我阅读了几个教程如何用npm bin运行脚本。 为了以防万一我明白了错误,我写下了我的想法。

所以如果我有这个部分package.json

 "main": "bin/index.js", "bin": { "snippet": "bin/index.js" }, 

npm install -g控制台应该监听命令片段,当我写它时,它运行文件夹bin的脚本index.js

这部分看起来对我来说是正确的。 当我有我的index.js简单的东西,即console.log('It Works')

在标准的情况下,你想让用户传递参数给脚本。 所以我发现所有的参数应该是variablesprocess.argv

process.argv属性返回一个数组,其中包含启动Node.js进程时传递的命令行参数。 第一个元素是process.execPath。 第二个元素将成为正在执行的JavaScript文件的path。 其余的元素将是任何额外的命令行参数。

所以我只是console.log它并运行脚本。

  1. 如果我通过命令snippet -f -a运行脚本输出是: [ 'node', 'path/to/file' ]

  2. 如果我通过node bin/index.js -f -a运行脚本,输出是: [ 'node', 'path/to/file', '-f', '-a' ]

我不明白,它的脚本,但不同的输出。 不过,我尝试它看起来像当我通过bin命令调用脚本,它永远不会传递参数。

这里有谁有这方面的经验? 并告诉我我做错了什么?

或者另外还有一些其他方法如何做到这一点?

感谢您的任何build议。

但是现在我需要一个解决scheme,所以希望以后能帮到别人。

问题在哪里:

我注意到,我的Windows有默认程序来运行.js文件设置为NODE.js ,因为它的默认设置当然所有.js文件打开没有参数。

所以在我的情况下,每一个.js文件打开NODE无论如何,我试图改变它打开像PSPAD或类似的东西,但这个基本上是开放的编辑器,而不是执行文件。

我是如何解决它的:

  1. 而不是使用执行.js直接与我做我的./bin/index.js二进制文件(基本上删除.js后缀)
  2. index文件的顶部添加#!/usr/bin/env node
  3. 转到package.json并将./bin/index.js所有依赖项./bin/index.js./bin/index

Woala! 有用 :)

ps正如我在开始时提到的,我相信有一个选项可以用.js来运行,但是我无法find它。 所以请如果有人会发现让我知道。 谢谢