npm离线安装包

来源:互联网 发布:qq农场蜜蜂进化数据 编辑:程序博客网 时间:2024/04/27 18:19

参考网址:http://www.ruanyifeng.com/blog/2016/01/npm-install.html
http://blog.lxjwlt.com/front-end/2016/03/01/npm-offline-package.html

NPM在安装的过程中会自动下载安装包的依赖文件,离线环境下由于无法下载安装包必要的依赖文件会导致安装失败。以下提供两种方式获取NPM离线包,以供离线环境安装。

npmbox

npmbox原名叫npmzip,用于压缩npm安装包。npmbox工具会直接在npm服务器上自动查找并下载好我们指定的安装包,并将安装包压缩成一个后缀为.npmbox的压缩文件。

首先在联网环境中全局安装npmbox工具:

npm install npmbox -g

由于npmbox工具压缩的文件也需要由npmbox工具来解压,所以离线环境上也要安装npmbox。我们在联网环境上用npmbox工具对其自身的安装包进行压缩:

npmbox npmbox

目录下生成一个新的文件“npmbox.npmbox”,将该文件拷贝到离线环境中,执行以下命令进行解压安装:

tar --no-same-owner --no-same-permissions -xvzf npmbox.npmbox

Windows系统的命令行貌似没有tar命令,建议使用第三方的命令行工具,如Git-bash

解压后得到一个缓存文件夹,不需理会继续执行以下命令全局安装npmbox(windows环境下):

npm install --global --cache .\.npmbox.cache --cache-min 99999 --shrinkwrap false npmbox

如果没有报错,npmbox工具已经在离线环境中安装成功了。
(在这里我遇到了安装npmbox还是去registry去找模块问题)
通过查找
总结一下,Node模块的安装过程是这样的。
发出npm install命令
npm 向 registry 查询模块压缩包的网址
下载压缩包,存放在~/.npm目录
解压压缩包到当前项目的node_modules目录
注意,一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。
但是,运行npm install的时候,只会检查node_modules目录,而不会检查~/.npm目录。也就是说,如果一个模块在~/.npm下有压缩包,但是没有安装在node_modules目录中,npm 依然会从远程仓库下载一次新的压缩包。
这种行为固然可以保证总是取得最新的代码,但有时并不是我们想要的。最大的问题是,它会极大地影响安装速度。即使某个模块的压缩包就在缓存目录中,也要去远程仓库下载,这怎么可能不慢呢?
另外,有些场合没有网络(比如飞机上),但是你想安装的模块,明明就在缓存目录之中,这时也无法安装。

因此,我把online环境成功安装了npmbox的/usr/lib/node_modules下的所有文件拷贝到offline环境的/usr/lib/node_modules下,再次执行

npm install --global --cache .\.npmbox.cache --cache-min 99999 --shrinkwrap false npmbox

成功

接下来要获取npm离线安装包就非常简单了,比如我们想获取bootstrap离线包,只需要在联网环境下执行:
npmbox bootstrap
然后将压缩文件bootstrap.npmbox拷贝到离线环境,执行以下命令进行解压:
npmupbox bootstrap.npmbox

但是这种情况安装的命令工具无法在$PATH路径找到,因为执行npmupbox bootstrap.npmbox仅仅解压生成一个node_modules目录,里面包含安装包所有的文件,需要用户自己配置$PATH路径。
因此,我没有采用这种方法安装
我采用安装npmbox一样的方法
例如,offline安装azure-cli
1)online环境成功安装了azure-cli的/usr/lib/node_modules下的所有文件拷贝到offline环境的/usr/lib/node_modules下
2)tar --no-same-owner --no-same-permissions -xvzf azure-cli.npmbox
3)npm install --global --cache .\.npmbox.cache --cache-min 99999 --shrinkwrap false azure-cli

0 0