node.js:依赖项版本(moment-timezone)在运行时更改

时间:2018-05-17 07:08:21

标签: node.js momentjs node-modules yarnpkg moment-timezone

在最后一天,我研究了一个神秘的问题,其中moment-timezone特征在特定的,看似随意的情况下不起作用。 我发现我的moment-timezone库的运行时版本在某些时候从版本0.5.17更改为0.5.13。

在添加更多详细信息之前,node.js问题还是moment-timezone问题?

moment-timezone的具体问题我最终使用yarn selective-version-resolutions解决了问题,但如果这实际上是node.js问题,我认为需要采取更多极端措施( yarn install --flat?)。

我不知道哪个依赖项导致版本在运行时更改,但在添加yarn.lock部分之前,这是我resolutions文件中的相关部分:

moment-timezone@0.5.17:
  version "0.5.17"
  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.17.tgz#3c8fef32051d84c3af174d91dc52977dcb0ad7e5"
  dependencies:
    moment ">= 2.9.0"

moment-timezone@^0.5.0, moment-timezone@^0.5.4, moment-timezone@~0.5.5:
  version "0.5.13"
  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90"
  dependencies:
    moment ">= 2.9.0"

正如您所看到的,我的直接依赖是版本 0.5.17 ,但我的其他模块的依赖关系已经解析为版本 0.5.13 。但我不明白在某些时候我的依赖关系是如何解决 0.5.13

要查看moment-timezone版本,我只使用了moment.tz.version。这意味着在我的生产代码中,以下代码打印 0.5.17 ,直到某些时候突然打印 0.5.13

const moment = require('moment-timezone');
console.log(`moment.tz.version: ${moment.tz.version}`);

最后一个细节:当版本更改为 0.5.13 时发生的时刻 - 时区功能是moment.tz函数added in version 0.5.14上的可选标记,在此代码:

moment(utcDateTime, format).clone().tz(timezone, true)

任何人都可以解释这是怎么回事吗?我希望它是一个片刻时区的bug而不是node.js的bug ...

1 个答案:

答案 0 :(得分:0)

我今天遇到了同样的问题,几个小时后,我想我已经知道发生了什么事。如果检查一下矩时区代码,您会看到它在初始化时需要矩,并添加tz属性以及与时区有关的所有内容,最后返回修改后的矩实例:

因此,如果您的直接依赖关系和另一个模块中的依赖关系解析为相同的moment版本,则同一对象被修改两次,而最终的版本仅取决于您所需的顺序{{1 }}和具有moment-timezone作为依赖项的模块。

实际上,在moment-timezone代码中,您可以看到以下行已被注释掉:

moment-timezone

我不知道为什么开发人员将其注释掉,但是显然这是已知行为。