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

Hyd*_*mal 9 node.js npm

如果我正在开发npm包foo并且我希望它作为命令行应用程序全局安装,我可以通过添加到我的package.json来实现:

"bin": {
    "foo": "./bin/foo.js"
}
Run Code Online (Sandbox Code Playgroud)

通过npm全局安装我的软件包的人将在其全局npm前缀目录中添加相应的批处理文件和shell脚本.但是,假设我希望能够从shell启动我的包(或者,在Windows的情况下,命令提示符).我可以通过在我的一个PATH目录中的某处创建一个批处理文件/ shell脚本来直接运行我的包,例如@node C:\my\package\directory\bin\foo %*.

这是一个相当简单明显的解决方案,但我认为这npm link更适合,因为它感觉不那么黑,而且理论上设计用来做这件事.我npm link在我的包目录中运行,然后通过foo从命令行运行来测试它.但是,不是执行我的脚本,而是foo.js在我的默认编辑器中实际打开.调查前缀目录,结果是npm创建的foo.cmd文件(fooshell脚本的内容类似)包含:

"%~dp0\node_modules\foo\bin\foo.js"   %*
Run Code Online (Sandbox Code Playgroud)

与以下创建的批处理文件进行比较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" %*
)
Run Code Online (Sandbox Code Playgroud)

为什么npm link生成启动包的bin文件的脚本文件而不是以bin文件作为参数启动节点?我该如何解决这个问题?

Hug*_*ood 6

解决方案是#!/usr/bin/env nodebin脚本开头添加.我不知道为什么.我通过将我的脚本与其他有效的脚本进行比较发现了


Sam*_*kes 0

npm您运行的是哪个版本?最新的是 2.6.0;npm 最近有很多改进——特别是在安装过程中的冲突和竞争条件方面。您可以尝试更新您的 npm 安装吗?

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