基于上面几点情况,产生了需要将联网环境的依赖包批量上传到内网环境的
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"
# 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