我正在构建一个 cli 节点模块。我希望人们能够npm install
它并立即使用它,例如 npm my-project --arg=foo
.它适用于本地项目 CLI 用作开发工具,而不是全局安装。
似乎标准是在package.json
中使用bin
,但我不明白一些事情:
- 我应该什么时候使用
bin
,什么时候应该使用scripts
? - 如何在包含项目中运行命令?
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
不起作用(,或者我是否正确使用它。
让我们首先解释一下bin
和scripts
之间的区别:如果要提供命令行工具,请使用前者,如果要提供额外的命令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
,但其他常用的模块是commander
或nomnom
。你已经提到yargs
.