使用 npm-check-updates 更新全局依赖提示 No dependencies

今天想起自己一直依赖没有更新全局依赖,就直接在 bash 里边输入 ncu -g 居然提示 No dependencies.
我就纳闷了,打错命令了吗,为啥提示没有依赖?
项目内依赖检查更新是没问题的,但是检测全局依赖就显示没有依赖,换了几个终端还是这个问题。
我怀疑是我全局以来的路径设置错了(我是使用 npm 来安装全局依赖,yarn 安装项目依赖)
查看了 npm 的全局依赖路径发现没错啊。

然后去到了 npm-check-updates 的 Github 上找 Issues 看,是不是有解决办法了,
但是相关的问题都被关闭了,然后提到的 Issue 里边答的也不一样,

最后在 Issue#146 上边看到了一个回答的思路,所以我就自己去查看源码了。

然后找到了一个问题所在 libs/package-managers/npm.js 中,有一个 defaultPrefix 函数,其中返回了全局依赖的路径,最后返回的数据是错误的。

function defaultPrefix(options) {
  if (options.prefix) {
    return Promise.resolve(options.prefix);
  }

  const cmd = process.platform === "win32" ? "npm.cmd" : "npm";
  return spawn(cmd, ["config", "get", "prefix"]).then(prefix => {
    // FIX: for ncu -g doesn't work on homebrew or windows #146
    // https://github.com/tjunnone/npm-check-updates/issues/146
    return options.global && prefix.match("Cellar")
      ? "/usr/local"
      : // Workaround: get prefix on windows for global packages
      // Only needed when using npm api directly
      process.platform === "win32" && options.global && !process.env.prefix
      ? `${process.env.AppData}\\npm`
      : null;
  });
}

这个函数查询了一个 prefix 的环境变量,但是在项目的 README 中并没有提到,可能是因为我修改全局依赖的安装目录的时候没有正确的在环境变量中添加新的全局依赖路径,所以他直接获取了默认的 AppData 地址。

解决方法

  • 1.在系统的环境变量中添加名为 prefix 值为你的自定义全局路径即可。(PS.记得重启电脑)
  • 2.修改 npm.js 的 169 行,把 process.env 替换为 npmConfig 也可以,就不需要重启电脑了…

以上