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

如果我正在开发npm包foo并且希望将其作为命令行应用程序全局安装,那么只需将其添加到我的package.json即可:

 "bin": { "foo": "./bin/foo.js" } 

有人通过npm全局安装我的软件包,将有相应的batch file和shell脚本添加到他们的全局npm前缀目录中。 不过,假设我希望能够从shell启动我的包(或者在Windows的情况下,命令提示符)。 我可以通过在我的PATH目录之一中创build一个batch file/ shell脚本,直接运行我的软件包,例如@node C:\my\package\directory\bin\foo %*

这是一个相当简单明显的解决scheme,但我觉得npm link更适合,因为它感觉不那么乱,理论上是为了做这件事情而devise的。 我在我的软件包目录中运行npm link ,然后通过从命令行运行foo来testing它。 然而,不是执行我的脚本, foo.js实际上是在我的默认编辑器中打开的。 在前缀目录中调查,发现foo.cmd文件( foo shell脚本的内容类似)包含:

 "%~dp0\node_modules\foo\bin\foo.js" %* 

与由npm install -g创build的batch file比较:

 @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文件,而不是以bin文件作为参数启动节点呢? 我该如何解决这个问题?

解决方法是在bin脚本的开头添加#!/usr/bin/env node 。 我不知道为什么。 通过比较我的脚本和其他工作的人,我发现了这一点。

你运行的是什么版本的npm ? 最新版本是2.6.0,最近npm已经有了很多改进,特别是在安装过程中的冲突和竞争条件方面。 你可以尝试更新你的npm安装吗?

要更新Windows上的npm,请按照此处的说明进行操作: https : //github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows