私服 nexus 之间迁移 npm 仓库
本文介绍如何将一个 Nexus 特定仓库中的 npm 包内容迁移到另一个 Nexus 特定仓库。此过程适用于需要重构仓库结构或合并仓库的场景。
迁移脚本
以下是完整的迁移脚本,它会自动完成以下操作:
- 从源仓库获取所有 npm 包列表
- 下载每个包的 .tgz 文件
- 解压并重新发布到目标仓库
#!/bin/bash # === 配置区域 === NEXUS_URL="https://nexus.test.com" USERNAME="test" PASSWORD="123456" SOURCE_REPO="npm-a" TARGET_REPO="npm-b" SOURCE_REGISTRY="$NEXUS_URL/repository/$SOURCE_REPO/" TARGET_REGISTRY="$NEXUS_URL/repository/$TARGET_REPO/" TMP_DIR="/tmp/npm-migrate" mkdir -p "$TMP_DIR" cd "$TMP_DIR" || exit 1 # ================= # ✅ 日志处理:同时输出到终端和日志文件 LOG_FILE="$TMP_DIR/npm-migrate.log" exec > >(tee -a "$LOG_FILE") 2>&1 log() { echo "[$(date '+%F %T')] $*" } log "🚀 启动 npm 仓库迁移脚本" # 遇到错误不中断脚本 set +e TOKEN="" while true; do log "📥 获取包列表,continuationToken=$TOKEN" RESPONSE=$(curl -s -u "$USERNAME:$PASSWORD" \ "$NEXUS_URL/service/rest/v1/components?repository=$SOURCE_REPO${TOKEN:+&continuationToken=$TOKEN}") ITEM_COUNT=$(echo "$RESPONSE" | jq '.items | length') log "📦 本页包含 $ITEM_COUNT 个包" echo "$RESPONSE" | jq -c '.items[]' | while read -r item; do name=$(echo "$item" | jq -r '.assets[0].path' | cut -d/ -f1) version=$(echo "$item" | jq -r '.version') log "➡️ 处理 $name@$version" tarball_url="${SOURCE_REGISTRY}${name}/-/${name}-${version}.tgz" tarball_file="${name}-${version}.tgz" log "🌐 下载包: $tarball_url" curl -s -u "$USERNAME:$PASSWORD" -O "$tarball_url" if [[ -f "$tarball_file" ]]; then tar -xzf "$tarball_file" pkg_dir="package" # 可选:检查是否已存在(加快速度) EXISTS=$(curl -s -u "$USERNAME:$PASSWORD" "$TARGET_REGISTRY$name" | grep "\"$version\"") if [[ -n "$EXISTS" ]]; then log "✅ $name@$version 已存在于目标仓库,跳过发布" else log "🚀 发布 $name@$version 到 $TARGET_REPO" npm publish "$pkg_dir" --registry "$TARGET_REGISTRY" --force if [[ $? -ne 0 ]]; then log "❌ 发布失败:$name@$version" else log "✅ 发布成功:$name@$version" fi fi rm -rf "$tarball_file" "$pkg_dir" else log "❌ 下载失败:$tarball_url" fi done # 分页处理 TOKEN=$(echo "$RESPONSE" | jq -r '.continuationToken') if [[ "$TOKEN" == "null" || -z "$TOKEN" ]]; then log "✅ 所有包处理完成,无更多分页" break else log "➡️ 获取下一页 continuationToken=$TOKEN" fi done log "🏁 所有迁移已完成"
在 ~/.npmrc 中配置目标仓库的 auth 认证信息,因为发布包要使用,内容如下示例:
registry=https://nexus.test.com/repository/npm-b/ //nexus.test.com/repository/npm-b/:_auth=c45h2312asmh3dsfYW3fassaawRAxMde= //nexus.test.com/repository/npm-b/:always-auth=true
其中 _auth 后面的内容是对 “账号:密码” 进行base64之后的字符串,注意账号密码使用英文冒号分隔拼接在一起后统一 base64。
使用说明
-
确保已安装 curl, jq, npm 和 tar 工具
-
确保有源仓库和目标仓库的访问权限
执行脚本:
chmod +x migrate.sh ./migrate.sh
注意事项
-
此脚本仅处理源仓库中的第一页数据(默认100条记录),如需处理更多数据,需要添加分页逻辑
-
迁移过程中会保留原始包的版本信息
-
使用 --force 参数强制发布,可能会覆盖目标仓库中已存在的同名包
-
脚本执行完毕后会自动清理临时文件
(END)
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。