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



编者按:问题的原标题是"使用npm安装来安装存储在本地目录上的节点模块",这使得透明地重新定义安装源的愿望不那么明显。因此,一些现有的答案建议基于修改安装过程的解决方案

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

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

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

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

我认为您的意图是透明地更改安装源:换句话说:您不想更改软件包,只想像以前一样调用npm install,但要从自定义文件系统位置安装软件包,脱机(无需Internet连接)

这个谜题有两块:

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

    • 请注意,缓存的包以特定的方式存储:package.json文件存储在子文件夹package中,压缩后的包作为一个整体存储为package.tgz。最简单的方法是将包从现有的缓存复制到您的自定义位置,或者在您连接Internet时简单地安装额外需要的包,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
    • 特殊使用,通过命令行选项:
      • npm install --cache /path/to/BAR
  • 强制npm使用缓存的包:

    • 目前,这需要通过cache-min配置项解决问题。
      • 一个更直接的功能,例如通过--offline交换机,多年来一直是一个功能请求-请参阅https://github.com/npm/npm/issues/2568
    • 诀窍是将cache-min设置为一个非常高的值,这样缓存中的所有包都被认为是新鲜的,并从那里提供:
      • 对于透明使用(npm install可以照常调用):
        • 通过全局设置配置项
          • npm config set cache-min 9999999999
          • 请注意,这将持续对所有npm操作生效
        • 通过环境变量(其范围可以是脚本,甚至是单个命令):
          • export npm_config_cache_min=9999999999
          • npm_config_cache_min=9999999999 npm install
      • 特殊使用,通过命令行选项:
        • npm install --cache-min 9999999999

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

注意事项

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

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

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

示例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

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

相关内容

  • 没有找到相关文章

最新更新