• 批量导入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' ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    将脚本 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    脚本使用

    cd npm-tgz-packages/
    ./npmimport.sh -u admin -p 123456 -r http://nexus.demo.com/service/rest/v1/components?repository=npm-shanhy
    
    • 1
    • 2

    在这里插入图片描述

    注:如果你疑问为什么不用 npm publish 命令发布 tgz 文件到 nexus 呢?解释原因就是因为这个命令需要你的环境要预装 npm 环境,而我们使用 bash 脚本却是通用的,可以随便找个 linux 服务器运行就可以。
    如果你刚好有 npm 环境,并且没有批量发布 tgz 包的需求,发布个别几个 tgz 包的话直接使用 npm publish 会很方便。


    (END)

  • 相关阅读:
    DA14580开发板与lis2ds12三轴传感器数据显示实现
    汽车行业“墨守成规”?VR全景助力车企打开新局面
    b站pink老师JavaScript的ES6面向对象案例代码——面向对象版Tab栏切换
    SwiftUI 5.0(iOS 17)TipKit 让用户更懂你的 App
    Acer宏碁掠夺者战斧300笔记本电脑PH315-52工厂模式原装Win10系统安装包 恢复出厂开箱状态 带恢复重置
    HackTheBox - Starting Point -- Tier 0 --- Mongod
    【模型训练】YOLOv7飞鸟检测
    第三章《数组与循环》第5节:do...while循环
    线段树维护矩阵:0920T4
    GO微服务实战第二十二节 案例:如何通过 Service Meh 实现熔断和限流?
  • 原文地址:https://blog.csdn.net/catoop/article/details/127985603