掘金 后端 ( ) • 2024-04-25 09:31

无网安装 本地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
  1. 将需要安装的依赖包在有互联网的机器上下载到本地.
  • 全局包运行:
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

最后:感谢项目组的前辈指导。