编者按:问题的原标题是"使用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
。你可以:
- 下载依赖项
- 从依赖项的目录运行
npm link
- 从您的项目运行
npm link mycrazydependency
此处提供详细信息:https://docs.npmjs.com/cli/link
如果存在收缩包装文件,则忽略package.json
。您需要做的是使用查找和替换操作(如sed ...
)更改要检索的URL。然而,我不确定将URL更改为file:///
语法是否有效,但请尝试一下。