Node.js – 在本地安装模块时是否需要package.json依赖项?
我知道在package.json
中做这样的事情:
.... ... "dependencies" : { "some-node-module" : "*" }
是一个坏主意,因为你基本上告诉节点总是将这个模块更新到最新版本,即使你的代码可能无法处理除了当前模块以外的任何其他版本。
所以我应该做这样的事情:
.... ... "dependencies" : { "some-node-module" : "3.4.1" }
这基本上告诉节点总是使用我的代码的模块版本。
题
我有一个我第一次在本地testing的应用程序。 该应用程序现在已经build成,并使用package.json dependencies
, npm
已经在我的应用程序的根文件夹下本地 安装了所有适当的节点模块 (而不是全局的,在一些模糊的文件夹中,我没有立即访问和哪些是不相关的这个应用程序 – 我只是不喜欢全局安装的节点模块 – 我觉得他们..“抽象”)。
鉴于所有节点模块现在已经安装在本地,而不是我的package.json中的节点模块依赖项部分现在是多余的?
我的意思是,如果发生什么事情,并且npm不可用,或者找不到特定版本的模块?
是不是最好独立于dynamic节点模块安装,并且只需要在本地安装一切,而不必使用package.json依赖项?
npm安装和更新
“你基本上是告诉节点总是把这个模块更新到最新版本”
包不会自动更新。 "*"
唯一的问题就是当你第一次通过npm install来安装项目时,或者当你通过npm update手动运行更新的时候 。
我个人更喜欢select一个特定版本的模块,而不是使用任何通配符,但即使如此,还是有一些陷阱…这就是为什么npm shrinkwrap
存在。
npm收缩包装
下一个问题:
基本上告诉节点总是使用我的代码周围的模块版本
Sorta真的。 假设你使用你最喜欢的模块的版本1.2.3
和package.json
反映,但在模块本身是一个package.json
依赖另一个模块,并使用"*"
…所以当你安装,新的内部依赖和通配符可以打破你认为被“locking”的模块。
看到这个问题? 硬编码顶级版本的版本控制,但不强制执行下面的任何东西…如果你依赖的模块作者(或者他们依赖的模块)使用通配符,你不能100%确定的东西COPACETIC。
要严格执行一个版本,你需要使用npm shrinkwrap 。 (链接到文档提供了更多的背景,这是很好理解,如果你的项目使用超过几个非常简单的模块。)
现在…你的问题。
你说:
我的意思是,如果发生什么事情,并且npm不可用,或者找不到特定版本的模块?
基于这个答案的前两部分,现在应该清楚的是,在package.json
显式列出依赖项并不会造成什么package.json
因为每次运行应用程序时,节点都不会检查事物。 当特定的动作(安装,更新等)被调用时, npm
使用package.json
,但即使如此,它也是一个手动触发器。
虽然情况有所不同,但我可以想象,在package.json
中省略依赖关系是个好主意。 如果你不得不重build项目,你会遇到麻烦。 如果项目如此好,你想分享它,你会遇到麻烦。 哎呀,如果这是工作的东西,你想度假,需要安装在另一台机器…你会遇到麻烦。
因此,考虑到在初始安装之后,依赖关系没有负面影响…使用 – 保存或添加依赖到您的package.json
。 你未来的自我会感谢你。 🙂