3

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

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

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

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

4

3 回答 3

2

注意:这个答案最初建议重新定义缓存位置。虽然这在原则上有效,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
    • 临时使用,通过命令行选项:
      • 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
      • 临时使用,通过命令行选项:
        • 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时发出警告。

示例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
于 2016-04-15T21:43:15.523 回答
1

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

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

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

于 2016-04-15T21:49:26.590 回答
0

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

于 2016-04-15T20:53:12.903 回答