package.json的npm全局安装不链接二进制文件

package.json的npm全局安装不链接二进制文件,npm,Npm,我的设置如下所示: 带有web项目的流浪机器 需要全球可用的bower安装 下面是package.json: { “姓名”:“加达达”, “版本”:“1.0.0”, “main”:“index.js”, “脚本”:{ “测试”:“echo\”错误:未指定测试\“&退出1” }, “作者”:“我”, “依赖项”:{ “鲍尔”:“最新”, }, “依赖性”:{ } } 由于无法在web目录中正确安装这些模块,因为同步文件夹和npm存在已知问题,所以我希望全局安装它们。 不会造成任何伤害,因为它

我的设置如下所示:

  • 带有web项目的流浪机器
  • 需要全球可用的
    bower
    安装
  • 下面是package.json:
{
“姓名”:“加达达”,
“版本”:“1.0.0”,
“main”:“index.js”,
“脚本”:{
“测试”:“echo\”错误:未指定测试\“&退出1”
},
“作者”:“我”,
“依赖项”:{
“鲍尔”:“最新”,
},
“依赖性”:{
}
}
由于无法在web目录中正确安装这些模块,因为同步文件夹和npm存在已知问题,所以我希望全局安装它们。 不会造成任何伤害,因为它是一个专用的虚拟机,只用于一个web应用程序

因此,我:

sudo npm安装-g

之后,我尝试使用
bower
,它不起作用,因为它在npm安装期间没有链接

当我这样做的时候,它工作得很好
sudo npm安装-gbower@latest


我做错了什么?

如果您的意思是试图使用
npm install-g
package.json
中全局安装依赖项,那么它就不是这样工作的
package.json
专门用于定义本地安装的包。它是可以随项目一起运行的所需模块的清单,允许项目总规模在运输过程中更小(即,您不必在回购协议中包含
节点模块

-g
标志用于单独安装的全局软件包,通常用于命令行实用程序等。如果项目中的每个模块都是在全球范围内安装的,那么您的情况不会有任何严重问题,但在其他情况下,这种情况将是一件坏事

所以你没有做错任何事,只是npm的安装方式不同而已


但是,您可以使用npm脚本定义安装前或安装后步骤,该步骤基本上运行
-g
安装。这是额外的工作,但是如果你拥有这个项目,并且你要做很多……这可能是一个很好的自动化方法。

好的,我发现,npm不是那样工作的。不能从package.json全局安装依赖项命令行工具。 谢谢你指出这一点,@Matthew Bakaitis

我昨天翻阅了npm代码,找到了一段解释这种行为的代码:

var linkStuff=build.linkStuff=function(打包、文件夹、全局、didRB、cb){
//允许选择退出链接二进制文件。
if(npm.config.get('bin-links')==false)返回cb()
//如果它是全局的,并且文件夹位于{prefix}/node_模块中,
//然后,bin位于{prefix}/bin中
//否则,则存储箱位于文件夹/。/.bin中
var parent=pkg.name&&pkg.name[0]='@'?path.dirname(path.dirname(文件夹)):path.dirname(文件夹)
var gnm=global&&npm.globalDir
var gtop=parent==gnm
log.info('linkStuff',packageId(包装))
log.silly('linkStuff',packageId(pkg),'has',parent,'as其父节点_modules')
if(global)log.silly('linkStuff',packageId(pkg),'是全局安装的一部分')
if(gnm)log.silly('linkStuff',packageId(pkg),'安装到全局节点_modules')
if(gtop)log.silly('linkStuff',packageId(pkg),'已安装到顶级全局节点_模块')
shouldWarn(包、文件夹、全局、函数(){
异步映射(
[linkBins、linkMans、!didRB和重建绑定],
功能(fn、cb){
如果(!fn)返回cb()
log.verbose(fn.name,packageId(pkg))
fn(包装、文件夹、父级、gtop、cb)
},
cb
)
})
}
如图所示:

正如您在这里看到的,关于父变量的注释清楚地指出,只有安装在“根”节点模块文件夹中的软件包才会全局链接,而所有其他软件包都会链接到软件包文件夹的
.bin

为了澄清这种行为,我将给你们举个简单的例子。 因此,我运行
npm安装-g
后的结构是:

/usr/lib/node_modules
| --> npm
| --> gadada
如我们所见,npm创建了一个新的子文件夹调用
gadada
,这是我在json包中给出的名称。在那里,在
/usr/lib/node\u modules/gadada/.bin
中放置依赖项并创建链接。 这是因为在生成depdencies时,npm会检查它们拥有哪个父文件夹。如果它不是
/usr/lib/node_modules
,则不会全局链接

作为比较,me运行
npm安装-g的结果bower@latest
现在,将生成以下文件夹结构:

/usr/lib/node_modules
| --> npm
| --> gadada
| --> bower
安装时,npm将实现
bower
的父文件夹是
/usr/lib/node_modules
和全局链接

这就是它背后的全部伏都教。 我还没有找到任何网站解释这种特殊的行为,但我想这是为了防止依赖性干扰二进制文件的全局安装

仅作澄清:节点模块的全局文件夹可能有所不同。
/usr/
只是我的前缀

我试图用脚本来解决这个问题。我找到了一本关于它的很棒的教程,但由于私人浏览而丢失了:/

我建议在
包.json的
脚本部分包含所需的命令,如下所示:

{
“姓名”:“加达达”,
“版本”:“1.0.0”,
“main”:“index.js”,
“脚本”:{
“测试”:“echo\”错误:未指定测试\“&退出1”,
“凉亭”:“凉亭”
},
“作者”:“我”,
“依赖项”:{
“鲍尔”:“最新”,
},
“依赖性”:{
}
}
在你尖叫之前:Nooo,到底管他的路是什么? 当您使用
npm run bower
从脚本运行命令时,npm包括$PATH的
.bin
文件夹,以便可以找到二进制文件。 最好的魔术:)

我希望我能帮助一些遇到同样问题的人:)