如何在某个日期之前安装节点包及其依赖项?

How to install node packages and their dependencies before some date?

是否有可能安装节点包(无论是 npm 还是 yarn)以及它们在某个日期之前发布的依赖项?看起来技术上是可行的,因为所有版本都有相应的发布日期,但我没有看到任何具体的方法。

有时,无法获得与发布日期要求对应的软件包集。在这种情况下,我们可以得到我们能得到的最早的版本。

真是奇怪的要求,无论如何...

为此,您需要编写一个程序来编写 package.json(或至少其 dependencies 字段)。

假设您有一个包(我们称之为 my-package),它具有三个依赖项:package-1package-2package-3.

首先,您需要一个函数(我们称它为 getPackageVersionByDate)来获取在给定日期之前发布的软件包的最新版本。使用命令

npm view rotating-file-stream time --json

你可以获得所有需要的数据来编写它的主体(我把这个简单无聊的任务留给你)。

遍历你的包的依赖你可以得到你需要的版本并使用它们你可以修改你的 package.json 文件的 dependencies 文件。

这还不是全部!

在您的请求中,您还要求 在给定日期之前的依赖关系;关于这个问题,我们聊一会儿。如果一个包有固定版本的依赖项,我们可以合理地确定依赖项比需要它的包更早部署。但并不是所有的包都使用固定版本作为它们的依赖项。查看 npm documentation 我们可以看到包可以使用多种语法来指定它们的依赖项的版本范围,并且它可能会发生而不是解析它们,结果是发布的版本晚于您的特定日期。

所以你需要另一个函数(让我们称它为getPacakgeDependencies)来获取具有相关版本号或版本范围的包的所有依赖项。使用命令

npm view rotating-file-stream@3.0.0 dist.tarball --json

你可以获得 URL 下载特定版本的包,你可以解压和解压它,在它的 package.json 文件中你可以获得所有需要的数据来编写它的主体(我也把这个简单无聊的任务留给你了)。

对于固定版本的依赖,没有问题;对于那些有版本范围的版本,您需要增强 getPackageVersionByDate 功能才能过滤符合给定范围的版本。

举几个例子来更好地解释问题。

示例 1:假设您的阈值日期是 2021-01-23 AND package-1 有以下 dependencies 在其 package.json 文件中:

  "dependencies": {
    "rotating-file-stream": "2.x"
  }

然后调用

getPackageVersionByDate("rotating-file-stream", "2021-01-23", "2.x");

返回值必须是2.1.3.

示例 2:假设您的阈值日期是 2021-01-23 AND package-1 有以下 dependencies 在其 package.json 文件中:

  "dependencies": {
    "rotating-file-stream": "<2.0.0"
  }

然后调用

getPackageVersionByDate("rotating-file-stream", "2021-01-23", "<2.0.0");

返回值必须是1.4.6.

我把增强 getPackageVersionByDate.

的任务留给了你。

现在您拥有编写最终 package.json 文件所需的一切,其中包含四个依赖项(package-1package-2package-3rotating-file-stream)和对于所有这些,固定版本号都符合所有要求:

  • 在阈值日期之前发布
  • 最终尊重另一个包所需的版本

最后,以递归方式组合 getPackageVersionByDategetPacakgeDependencies,您可以获得完整的依赖项列表及其固定版本。