本地安装的 cli NPM 项目,易于执行



我正在构建一个 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.但是,用户不使用npm my-project --arg=foo,他们将使用my-project --arg=foo,前提是您的脚本称为my-project。为此,您的package.json将包含如下内容:

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

在安装过程中,这会将./bin/my-project复制到"bin"目录(通常在类Unix操作系统上/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指令可用于更多内部目的。例如,您可以使用它来运行测试套件、linter 或安装前/安装后脚本。

最后,有各种模块可以帮助命令行解析。我喜欢docopt,但其他常用的模块是commandernomnom。你已经提到yargs.