我开始学习React Native,而且我对npm包管理器还很陌生。我读到npm可以在本地或全局安装软件包,但我正在努力理解这意味着什么。我正在读这一页https://docs.npmjs.com/getting-started/installing-npm-packages-locally请有人向我解释一下这是什么意思。
如果你想使用Node.js的require之类的东西依赖于你自己模块中的包,那么你想在本地安装,这是npm安装的默认行为。另一方面,如果您想将它用作命令行工具,比如grunt CLI,那么您需要全局安装它。
由于我对npm、React Native、Node(从未使用过它)非常陌生,我对这句话中的第一句话感到困惑。"我自己的模块"是什么意思?
如果我想使用CRNA,我想,我必须在全球范围内安装它?
如果我要在本地或全球安装一个软件包,比如CRNA,我在哪里可以看到它安装在我的MacBook Pro上?
本地安装和全局安装的区别在于,本地安装将其放入项目的node_modules
目录(这就是所谓的"您自己的模块"),而全局安装将其置于系统目录(确切位置取决于您的操作系统,在OSX上应该是/usr/local/lib/node_modules
)。
基本上:
-
本地安装将安装的模块与您的项目联系起来:您计算机上的其他项目不会得到它,但如果您的项目被复制到另一台计算机上,模块也会安装在那里
-
全局安装将它与您的计算机绑定:您可以在所有您的项目在您的计算机上,但如果您的项目被复制到另一台计算机安装的模块将不在
是的,CRNA应该全局安装,因为它是一个通用工具,而不是项目的库依赖性。
全局安装软件包时,npm install -g <package name>
模块会放入{prefix}/lib/node_modules
中。
Locally-npm install <package name>
-将包丢弃在当前工作目录中。
如果你要在你的项目中使用require
模块,你必须在本地安装它。
如果你想从命令行运行,你需要全局安装它。
如果您需要更多详细的解释,请查看
由于我对npm、React Native、Node(从未使用过)非常陌生,所以我被这句话中的第一句话弄糊涂了。"我自己的模块"是什么意思?
如果您有package.json
文件,那么同一文件夹中的所有内容都将被视为"模块"。您可以通过执行npm install --save foo
(--save
选项将其添加到package.json
中的dependencies
下)来添加依赖项。
如果我想使用CRNA,我想我必须在全球范围内安装它?
不确定"CRNA"是什么。但一般规则是,大多数东西(库…)都安装在本地。这意味着它们被添加到您的package.json
中,并安装在node_modules
下的同一文件夹中。
只有当您想全局安装某些东西时(可以添加到package.json
,但没有安装在node_modules
下的同一文件夹中,但可能安装在您的主目录中),通过执行npm install --global bar
(--global
全局安装)。当工具(而不是库)是独立于项目的时候,因为您可以从任何地方访问它。比如创建react应用程序。
TLDR:
-
Local是安装在同一文件夹中的依赖项(库),(通常)作为依赖项添加到
package.json
中 -
全局是安装在用户主文件夹中的工具,(通常)不会作为依赖项添加到
package.json
中
让我们首先从nodejs如何查找包开始。
假设你有一些文件夹结构,比如-
root
-pixel
-project1
-project2
因此,如果您正在处理project1
,并且需要一些npm包,nodejs会尝试在当前目录中找到一个名为node_modules
的文件夹。如果失败,它将转到父级(像素文件夹)并尝试找到node_modules
,然后递归地转到根(全局)。
因此,如果有任何软件包是全局安装的,您不需要将其安装在当前的工作目录中。
那么,我们为什么不在全球范围内安装所有软件包呢?这不是节省了我们的硬盘内存吗?
是的,没错。但由于npm包每次都在更新和更改其版本,因此有必要在当前工作包中使用特定的包来避免串通。
那么,全球一揽子计划有多有用?最好安装一些cli包,直接从命令行(即webpack
)运行,以简化我们的任务。