如何扫描代码是否过时或更糟

时间:2018-06-29 07:41:40

标签: node.js

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

仅在某些代码路径中实际上会调用defer,因此这确实是一个棘手的运行时问题。

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

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

编辑:

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

他们两个都无法检测到与节点8捆绑在一起的V8(v5.4)没有附带Promise.defer(this commit取消了该功能)。

2 个答案:

答案 0 :(得分:0)

如评论中所述, npm-check 软件包是一个很好的解决方案。

安装完成后,只需键入npm-check即可查看已过期和可更新的内容。
有很多可用的功能,例如npm-check -u,它提供了一种交互式方法来更新每个软件包。

这是可用选项的完整列表...

Usage
  $ npm-check <path> <options>

Path
  Where to check. Defaults to current directory. Use -g for checking global modules.

Options
  -u, --update          Interactive update.
  -y, --update-all      Uninteractive update. Apply all updates without prompting.
  -g, --global          Look at global modules.
  -s, --skip-unused     Skip check for unused packages.
  -p, --production      Skip devDependencies.
  -d, --dev-only        Look at devDependencies only (skip dependencies).
  -i, --ignore          Ignore dependencies based on succeeding glob.
  -E, --save-exact      Save exact version (x.y.z) instead of caret (^x.y.z) in package.json.
  --specials            List of depcheck specials to include in check for unused dependencies.
  --no-color            Force or disable color output.
  --no-emoji            Remove emoji support. No emoji in default in CI environments.
  --debug               Show debug output. Throw in a gist when creating issues on github.

Examples
  $ npm-check           # See what can be updated, what isn't being used.
  $ npm-check ../foo    # Check another path.
  $ npm-check -gu       # Update globally installed modules by picking which ones to upgrade.

https://www.npmjs.com/package/npm-check


此外(由于我不确定100%是否确定您的要求)...

如果需要找出特定软件包的依赖性,可以使用npm la <package-name>npm ll <package-name>。 这将基于软件包的依赖关系提供一个logical dependency tree


当然,与任何折旧的支持一样,Promise.defer()只需手动更新为new Promise(resolve, reject)方法。

答案 1 :(得分:0)

您可以参加npm-outdated

由npm-cli提供

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

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

在输出中:

  • 需要是满足package.json中指定的semver范围的软件包的最高版本。如果没有可用的存储范围(例如,您正在运行的npm已过时--global,或者package.json中未包含该软件包),则想要显示当前安装的版本。
  • 最新是在注册表中标记为最新的软件包的版本。在没有特殊配置的情况下运行npm publish将发布带有最新dist标签的软件包。这可能是软件包的最高版本,也可能不是软件包的最新版本,这取决于软件包的开发人员如何管理最新的dist-tag。
  • 位置是程序包在依赖树中的位置。请注意,npm过时的默认深度为0,因此,除非您覆盖该深度,否则始终只会看到过时的顶级依赖项。 包类型(使用--long / -l时)告诉您该包是依赖项还是devDependency。 package.json中未包含的软件包始终标记为依赖项。
  • 红色表示有一个新版本符合您的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"
}