无网安装 本地node_modules全依赖
💡 以下步骤在外网打tgz包时,会将当前工具所需的所有依赖的对应版本都打入进来。不会考虑当前系统、当前电脑已经存在的依赖。从而打出一个完整的工具依赖包。并且在无网环境下,无视其他依赖镜像,将此包内容安装到本地。前言:
适用背景:
1.无网环境
2.已经自行安装好Node环境。
3.容器部署集群架构。
4.安装基于本地的node_modules依赖。(不拉取外网或者镜像仓库的依赖)
起因:
1.项目用的JAVA后端框架sofaboot,且是容器集群环境。
功能需求是要向微信推送代码。必须利用微信官方的miniprogram-ci机器人。
导致问题:
①必须要在dockerfile镜像里的sofaboot基础镜像里,集成进Node环境。
注意事项:dockerfile只支持一个基础镜像源。所以不能直接引用依赖。
且不是编译环境,而是运行环境。在调用接口时,接口利用bash命令在镜像pod中调用ci机器人进行推送业务代码。
解决:集成一个sofaboot和Node都有的基础镜像源。
②在JAVA中编写长复杂bash命令时,不能直接照搬手敲的bash语法。
注意事项:
(1)在JAVA中不能直接用cd命令。需要创建工作目录,模拟cd的效果。
(2)在JAVA中当bash基础命令无法执行时,可以用数组分开。
//bash : miniprogram-ci -v
cmds=["miniprogram-ci","-v"];
//error eg:
cmds=["miniprogram-ci -v"];
(3)当输出结果过长,无法获取完整时,可以用流读取标准输出和标准错误。
③从项目架构和安全性来说,在pod里运行bash命令并不安全,并且pod作为一种临时区域,并不符合架构设计的严密性。
解决:另外部署一台连接外网的ECS并剥离出项目里涉及bash命令相关的接口独立运行。使用http调用。也可加上Token验证。
④安装ci机器人时,由于没有符合的内置镜像源。所以ci的全部依赖需要自己从外网打包。
并且每次启动,都要安装进本次的pod中。
踩坑:
(1)在外网npm i 之后,把依赖解压放入pod中的node_modules目录下。
问题:这样安装会导致,在pod中使用npm i 命令会自动去拉取镜像中的依赖,并不会安装依附于本地的依赖。
(2)在外网打好tgz包,然后放入pod中直接npm i ./此包
问题:会一直卡死在安装进度条。猜测是因为镜像仓库中有其他版本的同一依赖相冲突。
总结:
默认已经安装好Node环境。无网安装基于Node可在外网一键Npm install之后的全部依赖。 本文以安装微信ci机器人,miniprogram-ci 为例。
安装步骤:
1.安装 npm-pack-all 工具,运行:
npm i -g npm-pack-all
- 将需要安装的依赖包在有互联网的机器上下载到本地.
- 全局包运行:
npm i -g <package_name> && fex. npm i -g miniprogram-ci
- 非全局包运行:
npm i --global-style <package_name> && fex. npm i --global-style miniprogram-ci
- 进入安装包目录
- 全局包安装路径查看运行,然后进入依赖包的目录
npm root -g
- 非全局包默认项目路径下node_modules并进入依赖包的目录
3、打包依赖包及其所有依赖,运行:
npm-pack-all
运行完成后会在当前目录下生成<package_name>,<x.x.x>,tgz文件
fex. miniprogram-ci.1.9.15.tgz
4.拷贝生成的<package_name>.x.x.x.tgz文件到开发云桌面,并通过工具上传至pod中
5.从sofastack控制台-》发布部署服务-》应用服务-》选择pod-》进入bash
6.进入上传的<package_name>.x.x.x.tgz文件所在目录,运行:
-全局包通用模板:
mkdir -pv /user/local/<package_name>/v<x.x.x>&& tar -xvf <package_name>.<x.x.x>.tgz -C /user/local/<package_name>/v<x.x.x> && cd /user/local/<package_name>/ && npm i -g v<x.x.x>/
eg:
fex. mkdir -pv /user/local/miniprogram-ci/v1.9.15 && tar -xvf miniprogram-ci-1.9.15 tgz -C /user/local/miniprogram-ci/v1.9.15 && cd /user/local/miniprogram-ci/ && npm i -g v1.9.15/
项目实例:
需要注意的是,在执行最后2步时,npm i -g package/ 是因为,package.json在package目录下。需要cd到正确的位置。
mkdir -pv /user/local/miniprogram-ci/v1.9.15 && tar -xvf miniprogram-ci-1.9.15 tgz -C /user/local/miniprogram-ci/v1.9.15 && cd /user/local/miniprogram-ci/v1.9.15 && npm i -g package/
-非全局包通用模板:
mkdir -pv /path/to/project/node_modules/<package_name> && tar -xvf <package_name>.<x.x.x>.tgz -C /path/to/project/node_modules/<package_name> && cd /path/to/project/node_modules/ && npm i <package_name>/
7.验证依赖安装是否成功即可。
miniprogram-ci -v
最后:感谢项目组的前辈指导。