从自定义文件系统目录离线透明地安装 npm 包

Transparently install npm packages offline, from a custom filesystem directory

编者注:问题的原题目是"Use npm install to install node modules stored on a local directory",是想透明重新定义安装源不太明显。因此,一些现有的答案建议基于修改安装过程的解决方案。

我知道这很简单,但我对这方面的任何事情都很陌生,所以在四处搜索并不断找到并不是我真正想要的答案后,我想我应该直接问。

我目前在 运行 目录 FOO 中有一个调用 npm install 的进程。目录 FOO 包含一个 package.json 和一个 npm-shrinkwrap.json 文件来指定模块(在本例中为 bluebird、extend 和 mysql,但这并不重要)和版本。这一切都很好。

但现在我不想通过互联网获取模块,而是希望将它们存储在本地目录 BAR 中,并让 foo 中的进程使用 npm 从那里安装它们。我不能将它们永久存储在 FOO 中,但我可以出于我无法控制的原因将它们存储在 BAR 中。我知道这相对简单,但我似乎无法记下正确的命令集。感谢您的帮助。

如果存在收缩包装文件,则忽略 package.json。您需要做的是更改 URL 它们正在使用 sed ... 之类的查找和替换操作检索。但是我不确定将 URL 更改为 file:/// 语法是否有效,但试一试。

注意:这个答案最初建议重新定义缓存位置。虽然这在原则上是可行的,但 npm 仍会尝试为每个包裹联系网络,从而导致过多的延迟。

我假设你的意图是透明地改变安装源:换句话说:你不想改变你的包,你只是想像以前一样调用 npm install,但是从你的 自定义文件系统位置安装软件包,离线(不需要互联网连接).

拼图有两块:

  • 重新定义 npm 的缓存文件系统位置(缓存以前下载的包的位置)以指向您的自定义位置:

    • 请注意,缓存包以特定方式存储:package.json 文件存储在子文件夹 package 中,压缩包作为一个整体存储为 package.tgz.最简单的方法是将包从现有缓存复制到自定义位置,或者在有 Internet 连接时简单地安装额外需要的包,这会自动缓存它们。

    • 对于透明使用(npm install可以照常调用):

      • 通过设置配置项全局
        • npm config set cache '/path/to/BAR'
        • 请注意,这将持续对 所有 npm 操作生效。
      • 通过环境变量(可以限定为脚本甚至单个命令):
        • export npm_config_cache='/path/to/BAR'
        • npm_config_cache='path/to/BAR' npm install
    • Ad-hoc 使用,通过命令行选项:
      • npm install --cache /path/to/BAR
  • 强制npm使用缓存包:

    • 目前,这需要通过 cache-min 配置项 的 解决方法。
    • 诀窍是将 cache-min 设置为一个非常高的值,这样缓存中的所有包都被认为是新鲜的并从那里提供服务:
      • 对于透明使用(npm install可以照常调用):
        • 通过设置配置项全局
          • npm config set cache-min 9999999999
          • 请注意,这将持续对 所有 npm 操作生效。
        • 通过环境变量(可以限定为脚本甚至单个命令):
          • export npm_config_cache_min=9999999999
          • npm_config_cache_min=9999999999 npm install
      • Ad-hoc 使用,通过命令行选项:
        • npm install --cache-min 9999999999

假设您已全局或通过环境变量设置 cache-min, 运行 npm install 现在应该直接从您的自定义缓存位置提供包。

注意事项

  • 这假设您的 npm install 需要的 所有 包在您的自定义位置可用;如果没有 Internet 连接,尝试安装不在缓存中的包显然会 失败

  • 相反,如果您确实可以访问 Internet 但想阻止 npm 使用它来获取包 - 它仍然会尝试如果在缓存中找不到包 - 您必须将 registry 配置项更改为无效的内容,以强制在线安装尝试失败;例如:

    • export npm_config_registry=http://example.org
    • 请注意 URL 必须存在以避免在 npm 尝试连接时出现延迟;虽然您可以将值设置为 语法上 无效的值(例如 none),但 npm 将在 every[=136] 上发出警告=] 使用.

示例 bash 脚本:

#!/usr/bin/env bash

# Set environment variables that set npm configuration items to:
#  - redefine the location of the cache folder
#  - make npm look in the cache only (assuming the packages are there)
# Note that by doing this inside a script the changes will only take effect
# in the script and NOT persist.
export npm_config_cache='/path/to/BAR' npm_config_cache_min=9999999999

# Now cd to your package and invoke `npm install` as usual.
cd '/path/to/project'
npm install

您可能想试试 npm link。你可以:

  1. 下载依赖
  2. 运行 npm link 来自依赖目录
  3. 运行 npm link mycrazydependency 来自你的项目

这里有详细信息:https://docs.npmjs.com/cli/link