首页 > 解决方案 > 如何扫描您的代码以查找弃用或更糟的情况

问题描述

我们有这个“旧”模块 (A),它仍然使用 Promise.defer() 并使用 node v6 构建。该模块由另一个模块 (B) 使用,该模块甚至被使用 node v8 构建的另一个模块 (C) 使用。

只有在某些代码路径中才会真正调用 defer,所以这确实是一个棘手的运行时问题。

理想情况下,npm install 会通知我我们正在使用过时的代码(来自模块 C 或 B),但显然它不是那样工作的。可以在 package.json(在模块 A 中)中指定引擎应该是 node v6 并发布新版本,但这对于使用旧版本的当前模块(B 和 C)没有帮助。

有没有办法递归扫描这种东西?是的,我可以执行 npm install,然后为这个特定的 Promise.defer 事情做一些递归 grep,但我想知道是否有任何通用工具可用于已弃用或过时的代码。我尝试谷歌搜索无济于事。

编辑:

使用 npm-check(建议在下面和评论中),我得到一份关于哪些包有更新、未使用等的报告。有点类似于depcheck,但 npm-check 看起来更高级。

他们都无法检测到与节点 8 捆绑的 V8 (v5.4) 未附带 Promise.defer (此提交取消了该功能)。

标签: node.js

解决方案


你可以去npm-outdated

这是由 npm-cli 提供的

npm outdated [[<@scope>/]<pkg> ...]

此命令将检查注册表以查看当前是否有任何(或特定)已安装的软件包已过时

在输出中:

  • Wanted 是满足 package.json 中指定的semver范围的包的最大版本。如果没有可用的 semver 范围(例如,您正在运行 npm outdated --global,或者 package.json 中不包含该包),那么 Want 会显示当前安装的版本。
  • latest是在注册表中标记为最新的包的版本。在没有特殊配置的情况下运行 npm publish 将使用最新的 dist-tag 发布包。这可能是也可能不是软件包的最高版本,或者是最近发布的软件包版本,这取决于软件包的开发人员如何管理最新的 dist-tag。
  • location是包在依赖树中的位置。请注意,npm outdated 默认深度为 0,因此除非您覆盖它,否则您将始终只看到已过时的顶级依赖项。包类型(使用 --long / -l 时)告诉你这个包是依赖还是 devDependency。未包含在 package.json 中的包始终标记为依赖项。
  • 红色表示有更新的版本符合您的 semver 要求,因此您应该立即更新。
  • 黄色表示有高于您的 semver 要求的较新版本(通常是新的主要版本或新的 0.x 次要版本),因此请谨慎操作。

一个例子

$ npm outdated
Package      Current   Wanted   Latest  Location
glob          5.0.15   5.0.15    6.0.1  test-outdated-output
nothingness    0.0.3      git      git  test-outdated-output
npm            3.5.1    3.5.2    3.5.1  test-outdated-output
local-dev      0.0.3   linked   linked  test-outdated-output
once           1.3.2    1.3.3    1.3.3  test-outdated-output

使用这些依赖项:

{
  "glob": "^5.0.15",
  "nothingness": "github:othiym23/nothingness#master",
  "npm": "^3.5.1",
  "once": "^1.3.1"
}

推荐阅读