当前位置: 首页 > backend >正文

快速将前端得依赖打为tar包(yarn.lock版本)并且推送至nexus私有依赖仓库(笔记)

第一步

 创建js文件 文件名为downloadNpmPackage.js

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";const fs = require("fs");
const path = require("path");
const request = require("request");// 设置依赖目录
const downUrl = "./npm-dependencies-tgz";
if (!fs.existsSync(downUrl)) {fs.mkdirSync(downUrl);
}// 读取 yarn.lock 文件内容
const yarnLockPath = "./yarn.lock";
if (!fs.existsSync(yarnLockPath)) {console.error("未找到 yarn.lock 文件,请确保在项目根目录。");process.exit(1);
}
const yarnLockContent = fs.readFileSync(yarnLockPath, "utf8");// 正则匹配所有 resolved URL
const resolvedPattern = /resolved\s+"([^"]+)"/g;
let match;
const tgz = [];// 从 yarn.lock 提取所有下载地址
while ((match = resolvedPattern.exec(yarnLockContent)) !== null) {const url = match[1];// 过滤出 tarball 链接(一般 ending with .tgz 或 npm registry 的地址)if (url.endsWith(".tgz") || url.includes("registry.npmjs.org")) {tgz.push(url);}
}if (tgz.length === 0) {console.log("未在 yarn.lock 中找到任何可下载的依赖链接。");process.exit(0);
}console.log(`共解析到 ${tgz.length} 个依赖包,将开始下载。`);// 重试次数和状态变量
const retryTimes = 3;
let currentTryTime = 0;
let currentDownIndex = 0;
const downloadFailTgz = [];// 下载进度显示
function showProgress(received, total, filePath) {const percentage = ((received * 100) / total).toFixed(2);process.stdout.write(`\r${filePath} 下载进度:${percentage}% (${received}/${total} 字节)`);if (received >= total) {console.log(`\n${filePath} 下载完成!`);}
}// 依赖下载函数
function doDownload(url) {const filename = path.basename(url.split("?")[0]);const outputDir = path.join(downUrl, filename);const req = request({method: "GET",uri: url,timeout: 60000});// 获取内容长度req.on("response", (data) => {const totalBytes = parseInt(data.headers["content-length"]);let receivedBytes = 0;// 监听下载过程data.on("data", (chunk) => {receivedBytes += chunk.length;showProgress(receivedBytes, totalBytes, filename);});});// 管道写入文件const writeStream = fs.createWriteStream(outputDir);req.pipe(writeStream);req.on("error", (err) => {console.error(`\n${filename} 下载失败:`, err);handleRetryOrFail();});writeStream.on("finish", () => {// 当前文件下载成功,继续下一个currentDownIndex++;currentTryTime = 0;startNextDownload();});writeStream.on("error", (err) => {console.error(`\n${filename} 写入错误:`, err);handleRetryOrFail();});function handleRetryOrFail() {if (currentTryTime < retryTimes) {currentTryTime++;console.log(`\n${filename} 重试第 ${currentTryTime} 次...`);doDownload(url);} else {console.warn(`\n${filename} 下载失败,已重试 ${retryTimes} 次`);downloadFailTgz.push(url);currentDownIndex++;currentTryTime = 0;startNextDownload();}}
}// 开始下一次下载
function startNextDownload() {if (currentDownIndex < tgz.length) {console.log(`开始下载第 ${currentDownIndex + 1}/${tgz.length} 个依赖`);doDownload(tgz[currentDownIndex]);} else {// 全部下载完成if (downloadFailTgz.length === 0) {console.log("【完成】所有依赖均下载成功!");} else {console.warn("【完成】部分依赖下载失败,请手动下载:");downloadFailTgz.forEach((url) => console.log(url));}}
}// 启动第一个下载
startNextDownload();

放置在与yarn.lock同级目录下 然后再这个目录下打开终端执行 node downloadNpmPackage.js
等待即可

第二步

准备一份名为UploadnpmPackage.sh得文件将以下内容复制进去

#!/bin/bash# 解析参数
while getopts ":r:u:p:" opt; docase $opt inr) REPO_REGISTRY="$OPTARG" ;; # 例如:http://xxx/xxx/xxx/u) USERNAME="$OPTARG" ;;       # npm账号(可选,若需要登录)p) PASSWORD="$OPTARG" ;;       # npm密码*) echo "用法: $0 -r <registry_url> [-u <用户名>] [-p <密码>]"; exit 1 ;;esac
done# 检查必填参数
if [[ -z "$REPO_REGISTRY" ]]; thenecho "请提供仓库地址参数 -r"exit 1
fi# 若提供了用户名密码,提前登录(可选)
if [[ -n "$USERNAME" && -n "$PASSWORD" ]]; thennpm set //$(echo "$REPO_REGISTRY" | sed 's|^https*://||')/:_authToken "$PASSWORD"# 或者登录# npm login --registry=$REPO_REGISTRY
fi# 查找所有 .tgz 文件
find . -type f -name '*.tgz' | while read -r file; doecho "开始上传:$file"# 进入包所在目录,执行 npm publish# 如果包路径不同,可以考虑进去目录再执行# 这里假设包就是当前目录或子目录npm publish "$file" --registry="$REPO_REGISTRY"if [[ $? -eq 0 ]]; thenecho "成功上传:$file"elseecho "上传失败:$file"fiecho ""
done

将这个文件放在刚才打出来的那个包里与其他tag包再同一个目录下
然后再npm-dependencies-tgz 这个目录上右键走git bash 
执行以下命令   红色部分替换为你自己得

sh UploadnpmPackage.sh -u admin -p nexusAdmin2023 -r

http://172.24.105.249:8089/service/rest/v1/components?repository=npm-local

http://www.xdnf.cn/news/16174.html

相关文章:

  • 《C++》面向对象编程--类(下)
  • LLM中的位置嵌入矩阵(Position Embedding Matrix)是什么
  • matrix-breakout-2-morpheus靶机通关教程
  • DBA常用数据库查询语句
  • Python爬虫案例:Scrapy+XPath解析当当网网页结构
  • Lua(模块与包)
  • 【docker | 部署 】Jetson Orin与AMD平台容器化部署概述
  • Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
  • 前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)
  • 【RAG优化】RAG应用中图文表格混合内容的终极检索与生成策略
  • VUE的学习
  • iOS WebView 加载失败与缓存刷新问题排查实战指南
  • 医疗行业新变革:AR 培训系统助力手术培训精准高效​
  • Oracle国产化替代:一线DBA的技术决策突围战
  • 华为OpenStack架构学习9篇 连载—— 01 OpenStack架构介绍【附全文阅读】
  • 【C++】使用箱线图算法剔除数据样本中的异常值
  • Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示
  • CIRL:因果启发的表征学习框架——从域泛化到奖励分解的因果革命
  • Spring MVC中常用注解_笔记
  • 【Linux】linux基础开发工具(一) 软件包管理器yum、编辑器vim使用与相关命令
  • MCU(微控制器)中的高电平与低电平?
  • 实战演练11:生成式对话机器人(Bloom)
  • 输电线路微气象在线监测装置:保障电网安全的科技屏障
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • 多模态LLM/Diffusion推理加速
  • 11.2 yolov8用自己的数据集训练语义分割模型
  • Android Camera createCaptureSession
  • Mysql命令show processlist
  • 成品电池综合测试仪:保障电池品质与安全的核心工具|深圳鑫达能
  • 聚观早报 | 猿编程推动中美青少年AI实践;华为Pura 80数字版售价公布;iPhone 17 Air电池曝光