从自定义文件系统目录

时间:2016-04-15 19:49:06

标签: json node.js npm package.json npm-shrinkwrap

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

我认为你的意图是透明地更改安装源:换句话说:你不想改变你的包,你只想打电话给{{ 1}}和以前一样,但是要从自定义文件系统位置安装软件包,离线(无需Internet连接)。

这个难题有两个部分:

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

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

    • 对于透明使用(package.tgz可以照常调用):

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

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

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

警告

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

  • 相反,如果您确实可以访问Internet,但希望阻止 npm install使用它来获取程序包 - 如果在程序包中找不到程序包,它仍会尝试cache - 您必须将npm配置项更改为无效的内容,以强制联机安装尝试失败; e.g:

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

示例npm脚本:

bash

答案 1 :(得分:1)

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

  1. 下载依赖
  2. 从依赖项的目录
  3. 运行npm link
  4. 从您的项目
  5. 运行npm link mycrazydependency

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

答案 2 :(得分:0)

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