批量导入Npm包依赖到Nexus私服(批量上传脚本)
背景
批量导入是在以下几点情况下产生的需求:
- 已有Nexus系统,在测试构建环境中
- Nexus系统为离线环境不能配置外网代理自动下载
- 项目代码工程所在工作电脑有条件联网
- 现需要将项目代码在测试构建环境中连接Nexus私服进行编译构建
基于上面几点情况,产生了需要将联网环境的依赖包批量上传到内网环境的Nexus中的需求。
不想了解过程的,可以直接到文章底部拷贝 “脚本内容” 直接使用,文章前面都是解释说明性内容。
方法说明
1、在有网络的环境中,对代码进行编译构建,生成 package-lock.json
或者 yarn.lock
,具体使用 npm 还是 yarn 取决于你自己的实际需求。
2、打开 lock
文件,从 resolved
字段中获取所有的 tgz
文件下载链接(你可以使用这则表达式匹配或者使用一些工具批量处理提取)。
3、将获得的所有 tgz 文件链接进行批量下载到一个文件夹中(比如可以使用迅雷批量下载)。
你可以按需精确挑选依赖包下载,也可以比较方便的统一处理全部下载,后面使用脚本批量上传的时候,多次重复上传同一个包没有影响,私服会忽略仓库中已经存在的包。
4、打开浏览器登录Nexus,确定你需要上传到的目标 repository 名称。
5、在API菜单中获取上传包的API,如下图所示:
这段 curl 命令,我们在脚本中使用,原理即循环所有 tgz 文件循环调用 api 接口进行上传。
脚本内容
#!/bin/bash # 获取命令行参数 while getopts ":r:u:p:" opt; do case $opt in r) REPO_URL="$OPTARG" ;; u) USERNAME="$OPTARG" ;; p) PASSWORD="$OPTARG" ;; esac done # find 并批量上传 find . -type f -name '*.tgz' | sed "s|^\./||" | xargs -I '{}' \ curl -u "$USERNAME:$PASSWORD" -X 'POST' -v \ ${REPO_URL} \ -H 'accept: application/json' \ -H 'Content-Type: multipart/form-data' \ -F 'npm.asset=@{};type=application/x-compressed' ;
将脚本 npmimport.sh
放在 tgz 文件所在目录中,然后一并上传到一个任意 Linux 服务器上,文件结构示例如下:
[root@test npm-tgz-packages]# ll total 120 -rw-r--r-- 1 root root 97346 Nov 22 16:07 autocomplete-core-1.7.1.tgz -rw-r--r-- 1 root root 19476 Nov 22 21:13 autocomplete-preset-algolia-1.7.1.tgz -rwxr-xr-x 1 root root 461 Nov 22 22:43 npmimport.sh [root@test npm-tgz-packages]# tree -C . ├── autocomplete-core-1.7.1.tgz ├── autocomplete-preset-algolia-1.7.1.tgz └── npmimport.sh 0 directories, 3 files
脚本使用
cd npm-tgz-packages/ ./npmimport.sh -u admin -p 123456 -r http://nexus.demo.com/service/rest/v1/components?repository=npm-shanhy
注:如果你疑问为什么不用
npm publish
命令发布 tgz 文件到 nexus 呢?解释原因就是因为这个命令需要你的环境要预装 npm 环境,而我们使用 bash 脚本却是通用的,可以随便找个 linux 服务器运行就可以。
如果你刚好有 npm 环境,并且没有批量发布 tgz 包的需求,发布个别几个 tgz 包的话直接使用npm publish
会很方便。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步