npm如何处理锁定文件

时间:2017-03-30 04:45:09

标签: node.js npm npm-install post-install

所以我在一个脚本中运行npm install xyz,该脚本由另一个npm模块的postinstall npm钩子调用。 (我们没有理解为什么请这样做,但它与npm不支持的可选依赖项有关)

npm install moduleA
  -> installing moduleA
    -> running postinstall hook (my script)
      -> my script runs npm install xyz

当我自己运行脚本时,npm安装运行速度相当快,但是当我在postinstall钩子中安装模块时,脚本会在锁定文件上等待至少1分钟。 (或者我假设)

当我在npm中启用详细loglevel时,我得到如下输出:

[a lot more lines above]
npm verb addNamed "latest" is being treated as a dist-tag for invert-kv
npm info addNameTag [ 'invert-kv', 'latest' ]
npm verb addNameTag registry:https://registry.npmjs.org/invert-kv already in flight; waiting
npm verb addNamed "1.0.0" is a plain semver version for invert-kv
npm verb afterAdd /Users/path/.npm/invert-kv/1.0.0/package/package.json not in flight; writing
npm verb correctMkdir /Users/path/.npm correctMkdir not in flight; initializing
npm verb afterAdd /Users/path/.npm/invert-kv/1.0.0/package/package.json written
npm verb cache add spec camelcase@^3.0.0
npm verb addNamed ">=3.0.0 <4.0.0" is a valid semver range for camelcase
npm verb addNameRange registry:https://registry.npmjs.org/camelcase not in flight; fetching
npm verb get https://registry.npmjs.org/camelcase not expired, no request
npm verb addNamed "3.0.0" is a plain semver version for camelcase
npm verb afterAdd /Users/path/.npm/camelcase/3.0.0/package/package.json not in flight; writing
npm verb correctMkdir /Users/path/.npm correctMkdir not in flight; initializing
npm verb afterAdd /Users/path/.npm/camelcase/3.0.0/package/package.json written
npm verb correctMkdir /Users/path/.npm/_locks correctMkdir not in flight; initializing

在这里等待至少一分钟

npm verb lock using /Users/path/.npm/_locks/staging-d21af557b41d4821.lock for /Users/path/Desktop/t/node_modules/.staging
npm verb unbuild node_modules/.staging/abbrev-ac014442
npm verb unbuild node_modules/.staging/ansi-regex-12e09986
npm verb unbuild node_modules/.staging/ansi-styles-1359ba2f
npm verb unbuild node_modules/.staging/aproba-d9971840
npm verb unbuild node_modules/.staging/array-find-index-c1ddfc4c
[a lot more lines below]

现在查看correctMkdir的代码,似乎只需将/Users/path/.npm/_locks中的所有文件加载到内存中并尝试修复权限?不确定。

lock调用

correctMkdir。这似乎哈希文件和一些加密?也不确定。

对一些npm代码进行反向工程后,我通过将cache-lock-stalecache-lock-wait的配置更改为10毫秒来取得进展。不幸的是,在正确安装所有内容之前,它仍然会挂起太久。我怀疑在更改之前和npm是飞行时没有考虑更改的配置?也许?也许它有些完全不同? :)

任何可以向我暗示正确方向的人?我能做些什么来加快速度吗?

1 个答案:

答案 0 :(得分:1)

经过一夜的睡眠,安装现在似乎要快得多。我猜我的_locks文件夹中仍然挂起了一些缓存。

所以答案是:

暂时将cache-lock-stalecache-lock-wait设置为10ms,npm不会等待您的锁定文件过期。据我所知,npm正在尝试等待_lock文件夹中的所有锁文件完成,因为我们在npm install中运行npm install,来自父进程的锁文件显然仍在使用中。这更像是一个猜测,但我希望它能帮助将来的某个人。