Nodejs npm install 会安装全局已经安装好了的package吗?
Nodejs npm install 会安装全局已经安装好了的package吗?
最近在搭Angularjs tutorials的环境。 package.json里定义了依赖。 发现karma,Bower,http-server,Protractor这几个包加起来都超过90M了。 3G网络伤不起丫。。。 我想问下,如果我 -g 安装这几个包之后,再在项目里npm install,npm还会下载这些包吗?
Node.js NPM Install 会安装全局已经安装好的 Package 吗?
最近在搭建 AngularJS 教程的开发环境时,遇到了一些关于 NPM(Node Package Manager)安装包的问题。具体来说,我在 package.json
文件中定义了一些依赖项,比如 Karma、Bower、http-server 和 Protractor 等。
问题背景
这些依赖项加起来的大小超过了 90MB,这对于使用 3G 网络的开发者来说是一个不小的负担。因此,我考虑是否可以先将这些依赖项全局安装(使用 -g
选项),然后再在项目中运行 npm install
,以避免重复下载这些包。
解答
答案是 不会。即使你已经全局安装了某些包,当你在项目中运行 npm install
时,NPM 仍然会检查 package.json
文件中的依赖项,并根据需要重新安装这些包到项目的本地 node_modules
目录中。
这是因为每个项目的依赖关系可能有所不同,全局安装的包版本可能与项目所需版本不匹配。为了确保项目的可移植性和一致性,NPM 默认会优先使用项目本地的依赖项。
示例代码
假设你已经在全局环境中安装了 Karma:
npm install -g karma
然后,在你的项目目录中,你有如下的 package.json
文件:
{
"name": "my-angular-project",
"version": "1.0.0",
"dependencies": {
"karma": "^5.2.0",
"bower": "^1.8.8",
"http-server": "^0.12.1",
"protractor": "^7.0.0"
}
}
接下来,你可以运行:
cd my-angular-project
npm install
即使你之前已经全局安装了 karma
,npm install
仍然会在你的项目中安装 karma
的特定版本(例如 ^5.2.0
)到 node_modules
目录中。
总结
尽管你可以在全局环境中安装某些包,但为了确保项目的稳定性和一致性,最好还是让 npm install
命令来管理项目的依赖项。这样可以避免因版本不一致导致的潜在问题。
这个你试试不就知道啦?我猜测应该是会的!
全局安装一般是为命令行使用的,貌似项目中还不能使用,需要在项目中单独安装
看版本, 你 install -g (不 -g 也一样) 会在 cache 文件夹里面缓存一份, 如果版本一致就不需要重新download了.
当你使用 npm install
命令时,默认情况下它只会安装 package.json
文件中列出的依赖包。如果某些依赖包已经在全局安装(通过 -g
选项),那么在项目中运行 npm install
时,npm 不会重复安装这些全局已有的包。npm 会在本地项目目录下的 node_modules
目录中安装所有必要的依赖。
示例
假设你的 package.json
文件包含以下依赖:
{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"karma": "^6.3.4",
"bower": "^1.8.8",
"http-server": "^0.12.1",
"protractor": "^7.2.0"
}
}
情况一:全局未安装这些依赖
如果你没有全局安装上述任何依赖,直接运行 npm install
:
npm install
npm 会自动安装这些依赖到项目的 node_modules
目录中。
情况二:全局已安装这些依赖
如果你已经全局安装了这些依赖,例如:
npm install -g karma bower http-server protractor
然后在项目中运行 npm install
,npm 仍然会在项目的 node_modules
目录中安装这些依赖,以确保它们与项目的需求完全匹配。
解释
尽管全局安装了这些依赖,但为了确保项目的可移植性和一致性,npm 通常会在项目目录中重新安装这些依赖。这样可以避免因为全局安装的版本不一致而导致的问题。
希望这能帮助你理解在项目中使用 npm install
时 npm 的行为。