从自定义文件系统目录离线透明地安装 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
配置项 的 解决方法。
- 更直接的功能,例如通过
--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
- 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
。你可以:
- 下载依赖
- 运行
npm link
来自依赖目录
- 运行
npm link mycrazydependency
来自你的项目
这里有详细信息:https://docs.npmjs.com/cli/link
编者注:问题的原题目是"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
配置项 的 解决方法。- 更直接的功能,例如通过
--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
- 通过设置配置项全局:
- 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
。你可以:
- 下载依赖
- 运行
npm link
来自依赖目录 - 运行
npm link mycrazydependency
来自你的项目
这里有详细信息:https://docs.npmjs.com/cli/link