为什么运行我的全局npm链接包只是打开bin文件?

时间:2015-02-25 18:36:12

标签: node.js npm

如果我正在开发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文件作为参数启动节点?我该如何解决这个问题?

2 个答案:

答案 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