如果我正在开发npm包foo
并且我希望它作为命令行应用程序全局安装,我可以通过添加到我的package.json来实现:
"bin": {
"foo": "./bin/foo.js"
}
通过npm全局安装我的软件包的人将在其全局npm前缀目录中添加相应的批处理文件和shell脚本。但是,假设我希望能够从shell启动我的包(或者,在Windows的情况下,命令提示符)。我可以通过在我的一个PATH目录中的某处创建一个批处理文件/ shell脚本来直接运行我的包,例如@node C:\my\package\directory\bin\foo %*
。
这是一个相当简单明了的解决方案,但我觉得npm link
更适合,因为它感觉不那么黑,而且理论上设计用来做这件事。我在我的包目录中运行npm link
,然后通过从命令行运行foo
来测试它。但是,不是执行我的脚本,foo.js
实际上是在我的默认编辑器中打开的。调查前缀目录,结果证明npm创建的foo.cmd
文件(foo
shell脚本的内容类似)包含:
"%~dp0\node_modules\foo\bin\foo.js" %*
与npm install -g
创建的批处理文件进行比较:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\npm\bin\npm-cli.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\node_modules\npm\bin\npm-cli.js" %*
)
为什么npm link
生成启动包文件的脚本文件,而不是以bin文件作为参数启动节点?我该如何解决这个问题?
答案 0 :(得分:6)
解决方案是在#!/usr/bin/env node
脚本的开头添加bin
。我不知道为什么。我通过将我的脚本与其他有效的脚本进行比较来发现。
答案 1 :(得分:0)
您正在运行什么版本的npm
?最新版本是2.6.0;最近npm已经有很多改进 - 特别是在安装期间的冲突和竞争条件方面。你能尝试更新你的npm安装吗?
要在Windows上更新npm,请按照此处的说明操作:https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows