【问题标题】:npm install fails with 'subset is not a function'npm install 失败并显示“子集不是函数”
【发布时间】:2021-04-26 01:26:50
【问题描述】:

我在Arch Linux x86_64 上有node v15.14.0npm 7.8.0(从该发行版的存储库安装)。

使用npm init 在空目录中启动项目,然后尝试使用npm i <blah> 安装某些东西总是以同样的方式失败。一个例子,在$HOME/tmp运行:

$ npm i btoa
npm ERR! subset is not a function

npm ERR! A complete log of this run can be found in:
npm ERR!     $HOME/.npm/_logs/2021-04-08T00_32_19_504Z-debug.log

该日志文件内容如下:

0 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'i', 'btoa' ]
1 info using npm@7.8.0
2 info using node@v15.14.0
3 timing npm:load:whichnode Completed in 0ms
4 timing config:load:defaults Completed in 1ms
5 timing config:load:file:/usr/lib/node_modules/npm/npmrc Completed in 0ms
6 timing config:load:builtin Completed in 0ms
7 timing config:load:cli Completed in 1ms
8 timing config:load:env Completed in 0ms
9 timing config:load:file:$HOME/tmp/.npmrc Completed in 0ms
10 timing config:load:project Completed in 1ms
11 timing config:load:file:$HOME/.npmrc Completed in 0ms
12 timing config:load:user Completed in 0ms
13 timing config:load:file:/usr/etc/npmrc Completed in 0ms
14 timing config:load:global Completed in 0ms
15 timing config:load:validate Completed in 0ms
16 timing config:load:setEnvs Completed in 1ms
17 timing config:load Completed in 5ms
18 timing npm:load:configload Completed in 5ms
19 timing npm:load:setTitle Completed in 0ms
20 timing npm:load:setupLog Completed in 1ms
21 timing npm:load:cleanupLog Completed in 1ms
22 timing npm:load:configScope Completed in 1ms
23 timing npm:load:projectScope Completed in 0ms
24 timing npm:load Completed in 9ms
25 timing config:load:flatten Completed in 2ms
26 timing arborist:ctor Completed in 0ms
27 timing arborist:ctor Completed in 0ms
28 timing idealTree:init Completed in 13ms
29 timing idealTree:userRequests Completed in 3ms
30 silly idealTree buildDeps
31 silly fetch manifest btoa@*
32 http fetch GET 304 https://registry.npmjs.org/btoa 193ms (from cache)
33 silly placeDep ROOT btoa@1.2.1 KEEP for: tmp@1.0.0 want: *
34 timing idealTree:#root Completed in 198ms
35 timing idealTree:buildDeps Completed in 199ms
36 timing idealTree:fixDepFlags Completed in 0ms
37 timing idealTree Completed in 217ms
38 timing reify:loadTrees Completed in 217ms
39 timing reify:diffTrees Completed in 0ms
40 silly reify moves {}
41 timing reify:retireShallow Completed in 0ms
42 timing reify:createSparse Completed in 0ms
43 timing reify:loadBundles Completed in 0ms
44 timing reify:unpack Completed in 0ms
45 timing reify:unretire Completed in 0ms
46 timing build:queue Completed in 0ms
47 timing build:deps Completed in 1ms
48 timing build Completed in 1ms
49 timing reify:build Completed in 1ms
50 timing reify:trash Completed in 0ms
51 timing command:install Completed in 230ms
52 verbose stack TypeError: subset is not a function
52 verbose stack     at Arborist.[saveIdealTree] (/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:956:37)
52 verbose stack     at /usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:138:39
52 verbose stack     at async Arborist.reify (/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:134:5)
52 verbose stack     at async Install.install (/usr/lib/node_modules/npm/lib/install.js:137:5)
53 verbose cwd $HOME/tmp
54 verbose Linux 5.10.25-1-lts
55 verbose argv "/usr/bin/node" "/usr/bin/npm" "i" "btoa"
56 verbose node v15.14.0
57 verbose npm  v7.8.0
58 error subset is not a function
59 verbose exit 1

所以你可以看到

  • 我的“全局”模块位于/usr/lib/node_modules(我可以使用sudo npm install -g 很好地安装);
  • subset 函数似乎在install 命令调用时弹出
/usr/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js

我已检查该文件是否定义了

const {subset} = require('semver')

我该如何解决这个问题?

编辑:

这是为了解决下面的评论:这个subset 问题发生不管我尝试安装什么。 btoa 只是一个例子。

【问题讨论】:

  • 为什么需要btoa 开头? Node 已经可以使用 Buffer 的 toString('base64') 将任何数据本地转换为 base64,并使用 Buffer.from(data, 'base64') 从 base64 转换?
  • 这只是一个例子。该问题与 any npm package 相同。
  • npm lsnpm ls -g 是否返回没有错误?
  • 还要注意 npm install -g 永远不需要 sudo(因为这将是一个疯狂的安全风险。NPM 安装可以并且已经知道运行任意代码可以做所有事情,从安装后门到运行rm -rf /)。如果npm i -g 没有它就不能工作,那就是出了很大的问题,可能是时候重新安装节点了...
  • npm ls -g 总是可以正常工作; npm lsextraneous modules 错误,除非我删除 $HOME/node_modules;如果我这样做,那很好。

标签: node.js npm


【解决方案1】:

对于那些错过papanito's评论的人

sudo npm i -g npm

在 Arch 上为我工作。

【讨论】:

    【解决方案2】:

    我能够通过将/usr/lib/node_modules/npm/node_modules/semver/ranges/subset.js 更改为空文件来复制您的问题。听起来您在安装 npm 时出了点问题,并且至少有一个依赖项 (semver) 没有完全安装。或者也许后来发生了一些事情,将文件覆盖为空文件。

    最好的办法是重新安装nodenpm。但是你可以尝试一些更窄的东西。你说npm install -g 正在工作。我觉得这很令人惊讶,但正因为如此,您可以尝试npm install -g npm 重新安装npm 本身。那应该可以解决问题。如果这不起作用,您可以尝试npm install --force -g npm

    但同样:最好的办法是重新安装 nodenpm

    【讨论】:

    • 这在多个级别上都失败了:npm install -g(有或没有--force总是给我在/usr/lib/node_modules下重命名文件的权限错误,因此我需要sudo ;通过发行版的包管理器重新安装npm 什么也没做; /usr/lib/node_modules/npm/node_modules/semver/ranges/subset.js 看起来不错..
    • 我最终放弃了我的包管理器的nodenpm:太头疼了。我去安装了canonical 版本,一切都很好(我可以npm install,也可以npm install -g 没有sudo)。我会接受这个答案;谢谢!
    • 帮助我的是sudo npm install -g npm。我尝试通过 pacman 卸载/重新安装 npm,但没有帮助。
    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2019-10-25
    • 2019-02-23
    • 2017-06-17
    相关资源
    最近更新 更多