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
文件夹,以便可以找到二进制文件。
最好的魔术:)
我希望我能帮助一些遇到同样问题的人:)