如何确定旧 npm 包版本的依赖关系

Posted

技术标签:

【中文标题】如何确定旧 npm 包版本的依赖关系【英文标题】:How to determine the dependencies of older npm package versions 【发布时间】:2020-01-25 23:09:22 【问题描述】:

在我看来,npm 站点上的依赖链接仅适用于当前/最新版本。

除了下载并检查 package.json 文件之外,是否还有一些我不知道的关于如何确定包的依赖版本的信息?

我觉得我在浪费 HOURS 做一些我认为更容易做的事情。

【问题讨论】:

【参考方案1】:

“在我看来,npm 站点上的依赖链接只适用于当前/最新版本。”

是的,这是正确的,www.npmjs.com显示最新版本包的依赖项。

这里有几种方法可以通过编程和非编程方式发现您想要的内容。

以编程方式:

    使用npm view 命令,语法如下;

    npm view <pkg_name> versions --json
    

    获取 npm 注册表中给定包的所有可用版本列表。

    注意:上面的&lt;pkg_name&gt;部分应该替换为真正的包名。

    例如;运行以下命令让我们说eslint 包:

    npm view eslint versions --json
    

    将以下内容打印到控制台:

    [
      "0.0.4",
      "0.0.5",
      "0.0.6",
      "0.0.7",
      "0.1.0-dev",
      "0.1.0",
      "0.1.1",
      "0.1.2",
      ...
    ]
    

    现在我们知道有哪些版本可用,假设我们要列出eslint 版本0.1.2依赖项,我们可以运行以下命令:

    npm show eslint@0.1.2 dependencies --json
    

    这将打印:

    
      "optimist": "*",
      "estraverse": "~1.3.0",
      "esprima": "*",
      "escope": "1.0.0"
    
    

    同样,我们可以通过运行以下命令来发现eslint 版本0.1.2devDependencies

    npm show eslint@0.1.2 devDependencies --json
    

    这将产生如下内容:

    
      "vows": "~0.7.0",
      "sinon": "*",
      "commonjs-everywhere": "~0.9.0",
      "mocha": "~1.13.0",
      "chai": "~1.8.1",
      "grunt": "~0.4.1",
      ...
    
    

    如果您事先知道一个包具有特定的依赖关系。

    例如;在运行上述命令后,我们现在知道eslint 版本0.1.2 已将escope 列为依赖项。

    所以,如果我们想知道eslint版本0.1.2需要的escope的版本,我们可以运行以下命令:

    npm show eslint@0.1.2 dependencies.escope
                                      ^
    

    注意:包名后跟点(.),即.escope

    这将打印以下内容:

    1.0.0


非程序化方式

当您有可用的 CLI 工具时,我想不出您为什么要执行以下非编程方式而不是上述编程方式的原因。但是,如果您更喜欢手动任务,那么就去...

注意:YMMV 使用以下手动步骤,因为它取决于包的管理/维护方式。

通常,npm 包的源代码将托管在 GitHub 上,因此您可以执行以下手动步骤。这将避免您必须下载包来检查 package.json 文件。

为此,我们将针对 eslint 包进行演示:

    访问npmjs.com 并在“搜索包” 输入字段中输入包的名称。我们将输入eslint 并按回车键。

    接下来点击包列表中的eslint,会跳转到this page。

    单击 github 链接,该链接通常显示在网页的右侧,如下所示:

    这会将您带到eslint 存储库,即this one

    在 Github 页面上单击 “分支” 按钮 - 该按钮显示在源代码文件列表上方,如下所示:

    在随后出现的弹出式面板中单击“标签”按钮,然后从列表中找到并单击要发现其依赖项的版本标签. (注意:这些标签名称通常对应于发布/发布到 npm 的版本)

    然后,这将在浏览器中加载该特定版本/版本的源代码文件。

    从文件列表中找到 package.json 文件并单击它。这将在浏览器中加载 package.json 的内容,您可以在浏览器中读取它并确定其依赖关系。


可视化依赖树

我有时会使用这个在线工具 https://npm.anvaka.com,它可以帮助您可视化给定包的完整依赖关系树/图表 - 但它仅适用于最新版本的包。

Here 是最新版本 eslint 的完整依赖树/图(很多层级)。

【讨论】:

所有npm view 命令(或它的别名npm show)也可以与scoped packages 一起成功工作。例如:npm show @babel/core@7.4.0 dependencies 以及第 3 点; npm show @babel/core@7.4.0 dependencies.@babel/helpers

以上是关于如何确定旧 npm 包版本的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖嵌套的 NPM 依赖版本?

Gradle 查看包的依赖关系

如何找到具有特定依赖关系的 NPM 模块版本 - 例如,哪个版本的 webpack-cli 与 webpack@4.46.0 一起使用?

更新旧应用程序导致此错误 => 无法确定任务 ':app:compileDebugJavaWithJavac' 的依赖关系

全局安装具有对等依赖关系的 npm 包(package.json 中未提及)

快速解决NPM报错:peerDependencies WARNING