本地安装的cli npm项目,执行简单

Locally-installed cli NPM project that is easy to execute

我正在构建一个 cli 节点模块。我希望人们能够 npm install 它并立即通过 npm my-project --arg=foo 这样的命令使用它。它适用于本地项目 CLI 作为开发工具使用,而不是全局安装。

似乎标准是在package.json中使用bin,但我不明白一些事情:

  1. 什么时候应该使用bin,什么时候应该使用scripts
  2. 如何运行包含项目中的命令? npm my-project 不做。

这是我现在在 package.json 中所做的事情:

{
  "name": "my-project",
  "bin": "./cli.js"
}

而且我可以 运行 在本地:

node cli.js --arg=foo

但是当我在其他地方 npm-install my-project 时,我不知道如何 运行 它放在 bin 中的脚本(npm run my-project 不起作用),或者如果我'我正确使用它。

先解释一下binscripts的区别:前者如果你想提供一个命令行工具就用,后者如果你想提供一个额外的命令就用至 npm(但有一些注意事项,请参见下文)。

根据你的情况,我想你想使用bin。但是,如果您的脚本名为 my-project,用户将不会使用 npm my-project --arg=foo,而是使用 my-project --arg=foo。为此,您的 package.json 将包含如下内容:

"bin" : "./bin/my-project"

在安装过程中,这会将 ./bin/my-project 复制到 "bin" 目录(在类 Unix OS 上通常是 /usr/local/bin)。在开发过程中,您可以将其称为 node bin/my-project,甚至可以只是 ./bin/my-project,前提是它具有正确的权限并且 "shebang".

编辑:所以我忘记了 npm 将使用包名,而不是 ./bin 中的文件名作为可执行文件名(如果 bin 是一个字符串)。如果您的包名为 my-project,并且您安装了该包(您需要在 npm 安装可执行文件之前使用 -g 标志),它将创建一个名为 my-project 的可执行文件,无论bin 属性 指向的位置。

换句话说:

package.json:
  "name" : "my-project"
  "bin"  : "./cli.js"

npm install -g:
   copies ./cli.js to /usr/local/bin/my-project and sets executable permissions

编辑结束

FWIW,将 CLI 工具存储在 ./bin 中是惯例,但不是强制性的。

scripts 指令可用于更多内部用途。例如,您可以将它用于 运行 测试套件、linters 或 pre/post 安装脚本。

最后,有各种模块可用于帮助命令行解析。我喜欢 docopt, but other often-used modules are commander or nomnom. You already mentioned yargs.