1

我知道在做这样的事情package.json

....
...
"dependencies" : {
    "some-node-module" : "*"
}

这是一个坏主意,因为您基本上是在告诉节点始终将此模块更新到其最新版本,即使您的代码可能无法处理该特定模块的当前版本以外的任何其他版本。

所以我应该做这样的事情:

....
...
"dependencies" : {
    "some-node-module" : "3.4.1"
}

这基本上告诉节点始终使用我的代码构建的模块版本。

问题
我有一个应用程序,我首先在本地进行了测试。该应用程序现已构建,并使用package.json dependencies,npm在我的应用程序的根文件夹下本地安装了所有适当的节点模块(与全局相反,在一些我无法立即访问且与此应用程序无关的晦涩文件夹中- 我根本不喜欢节点模块的全局安装 - 我发现它们是..“抽象”)。

鉴于现在所有节点模块都安装在本地,我的 package.json 中的节点模块依赖项部分现在不是多余的吗?

我的意思是,如果发生某些事情并且 npm 不可用或找不到模块的特定版本怎么办?

最好独立于动态节点模块安装并且第一次在本地安装所有内容而不必使用 package.json 依赖项?

4

1 回答 1

1

npm 安装和更新

“您基本上是在告诉节点始终将此模块更新到其最新版本”

包不会自动更新。唯一"*"会出现问题的情况是当您第一次通过npm install 安装项目或通过npm update手动运行更新时。

我个人更喜欢选择一个特定版本的模块而不是使用任何通配符,但即使这样也有一些陷阱......这就是npm shrinkwrap存在的原因。

npm 收缩包装

下一个陷阱:

基本上告诉节点始终使用我的代码构建的模块版本

是真的。假设您使用1.2.3了您最喜欢的模块的版本并package.json反映了这一点,但模块本身package.json依赖于另一个模块并且使用了......"*"所以当您安装时,新的内部依赖项和通配符可能会破坏您认为的模块被“锁定”了。

看到问题了吗?对顶级版本的版本控制进行硬编码,但不强制执行以下任何操作……如果您依赖的模块作者(或他们依赖的模块)使用通配符,您不能 100% 确定事情会是醋酸乙酯。

要严格执行版本,您需要使用npm shrinkwrap。(那里的文档链接提供了更多背景信息,如果您的项目使用多个非常简单的模块,这很容易理解。)

现在......你的问题。

你说:

我的意思是,如果发生某些事情并且 npm 不可用或找不到模块的特定版本怎么办?

基于此答案的前两部分,现在应该清楚的是,在 中明确列出依赖项并没有什么坏处,package.json因为节点不会在每次应用程序运行时检查事物。 在调用特定操作(安装、更新等)时npm使用,但即便如此,它也是手动触发器。package.json

虽然情况各不相同,但我能想象在哪里省略依赖项package.json是个好主意。如果您最终不得不重建项目,您将遇到麻烦。如果项目太好了,你想分享它,你就有麻烦了。哎呀,如果这是为了工作而你想去度假并且需要将它安装在另一台机器上......你会遇到麻烦。

因此,鉴于在初始安装后,依赖项没有负面影响......使用--save或将依赖项添加到您的package.json. 你未来的自己会感谢你。:)

于 2015-08-31T14:12:27.550 回答