快速將前端得依賴打為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.pswp.cn/pingmian/90284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90284.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity VS Unreal Engine ,“電影像游戲的時代” 新手如何抉擇引擎?(結)

Unity VS Unreal Engine &#xff0c;“電影像游戲的時代” 新手如何抉擇引擎&#xff1f;(1)-CSDN博客 這是我的上一篇文章&#xff0c;如果你仍然困惑選擇引擎的事情&#xff0c;我們不妨從別的方面看看 注意&#xff1a;我們可能使用"UE5"來表示Unreal Engine系…

EVAL長度限制突破方法

EVAL長度限制突破方法 <?php $param $_REQUEST[param]; If (strlen($param) < 17 && stripos($param, eval) false && stripos($param, assert) false) //長度小于17&#xff0c;沒有eval和assert關鍵字 {eval($param); } //stripos — 查找字符串…

Linux部署.net Core 環境

我的環境 直接下載安裝就可以了 wget https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.315/dotnet-sdk-8.0.315-linux-x64.tar.gzmkdir -p $HOME/dotnet && tar zxf dotnet-sdk-8.0.315-linux-x64.tar.gz -C $HOME/dotnet export DOTNET_ROOT$HOME/dotnet expor…

ARM-定時器-PWM通道輸出

學習內容需求點亮4個燈&#xff0c;采用pwm的方式。定時器通道引腳AFLED序號T3CH0PD12AF2LED5CH1PD13AF2LED6CH2PD14AF2LED7CH3PD15AF2LED8實現LED5, LED6, LED7, LED8呼吸燈效果通用定時器多通道點亮T3定時器下的多個通道的燈。開發流程添加Timer依賴初始化PWM相關GPIO初始化P…

javaSE(List集合ArrayList實現類與LinkedList實現類)day15

目錄 List集合&#xff1a; 1、ArrayList類&#xff1a; &#xff08;1&#xff09;數據結構&#xff1a; &#xff08;2&#xff09;擴容機制 &#xff08;3&#xff09;ArrayList的初始化&#xff1a; &#xff08;4&#xff09;ArrayList的添加元素方法 &#xff08;5…

解決 WSL 中無法訪問 registry-1.docker.io/v2/,無法用 docker 拉取 image

文章目錄無法拉取docker鏡像補充遷移 WSL 位置Install Docker無法拉取docker鏡像 docker run hello-world Unable to find image hello-world:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline excee…

【C++】簡單學——list類

模擬實現之前需要了解的概念帶頭雙向鏈表&#xff08;double-linked&#xff09;&#xff0c;允許在任何位置進行插入區別相比vector和string&#xff0c;多了這個已經沒有下標[ ]了&#xff0c;因為迭代器其實才是主流&#xff08;要包頭文件<list>&#xff09;方法構造…

Qt 國際化與本地化完整解決方案

在全球化的今天&#xff0c;軟件支持多語言和本地化&#xff08;Internationalization & Localization&#xff0c;簡稱i18n & l10n&#xff09;已成為基本需求。Qt提供了一套完整的解決方案&#xff0c;幫助開發者輕松實現應用程序的國際化支持。本文將從原理到實踐&a…

MNIST 手寫數字識別模型分析

功能概述 這段代碼實現了一個基于TensorFlow和Keras的MNIST手寫數字識別模型。主要功能包括&#xff1a; 加載并預處理MNIST數據集構建一個簡單的全連接神經網絡模型訓練模型并評估其性能使用訓練好的模型進行預測保存和加載模型 代碼解析 1. 導入必要的庫 import matplot…

進階系統策略

該策略主要基于價格動態分析,結合多種技術指標和數學計算來生成交易信號。其核心邏輯包括: 1. 價格極值計算:首先,策略計算給定周期(由`Var3`定義)內的最高價和最低價,分別存儲在`Var12`和`Var13`中。這一步驟旨在捕捉價格的短期波動范圍。 2. 相對位置計算:接著,策…

【Linux內核】Linux驅動開發

推薦書籍&#xff1a; 《Linux內核探秘&#xff1a;深入解析文件系統和設備驅動的架構與設計》 知識點 x86的IO地址空間和內存地址空間是獨立的兩套地址空間&#xff0c;并且使用不同的指令訪問。MOV, IN, OUT。內存映射I/O可以將IO映射到內存。ARM等RISC采用統一編編址&#x…

MySQL用戶管理(15)

文章目錄前言一、用戶用戶信息創建用戶修改密碼刪除用戶二、數據庫的權限MySQL中的權限給用戶授權回收權限總結前言 其實與 Linux 操作系統類似&#xff0c;MySQL 中也有 超級用戶 和 普通用戶 之分 如果一個用戶只需要訪問 MySQL 中的某一個數據庫&#xff0c;甚至數據庫中的某…

react19相關問題和解答

目錄 1. react19將ref放在了props中(不再需要 forwardRef),那么是不是可以通過ref獲取子組件的全部變量了? 我的子組件的useImperativeHandle還需要定義嗎? 1.1. ref 在 props 中的本質變化 1.2. 為什么不能訪問全部變量? 2. In HTML,cannot be a descendant of. Thi…

Code Composer Studio:CCS 設置代碼折疊

Code Composer Studio&#xff1a;設置代碼折疊,可以按函數&#xff0c;if, 等把代碼折疊起來。1.2.開啟折疊選項3.開啟后&#xff0c;如果文件已經打開&#xff0c;要關掉重新打開文件就可以開到折疊功能生效。

JMeter groovy 編譯成.jar 文件

groovy 編譯 一、windows 下手動安裝Groovy 下載 Groovy 二進制包 前往官網&#xff1a;https://groovy.apache.org/download.html 下載 Binary release&#xff08; https://groovy.jfrog.io/ui/native/dist-release-local/groovy-zips/apache-groovy-sdk-4.0.27.zip &#xf…

使用maven-shade-plugin解決依賴版本沖突

項目里引入多個版本依賴時&#xff0c;最后只會使用其中一個&#xff0c;一般可以通過排除不使用的依賴處理&#xff0c;但是如果需要同時使用多個版本&#xff0c;可以使用maven-shade-plugin解決。以最典型的poi為例&#xff0c;poi版本兼容性很低&#xff0c;如果出現找不到…

[CH582M入門第十一步]DS18B20驅動

學習目標: 1、介紹DS18B20 2、學習單總線 3、學習DS18B20程序驅動一、DS18B20介紹 DS18B20 是一款由 Maxim Integrated(原Dallas Semiconductor) 推出的 數字溫度傳感器,以其單總線(1-Wire)通信協議、高精度和廣泛應用而聞名。以下是其核心特點和應用介紹: 主要特性 數…

SGLang + 分布式推理部署DeepSeek671B滿血版

部署設備&#xff1a;28A100 80G&#xff0c;兩臺機器&#xff0c;每臺機器8張A100。 模型&#xff1a;deepseek-671B-int8 模型下載地址&#xff1a;https://huggingface.co/meituan/DeepSeek-R1-Block-INT8 模型參考&#xff1a; 1、SGLang Docker部署 github地址&#…

PCL 間接平差擬合球

目錄 一、算法原理 1、計算流程 2、參考文獻 二、代碼實現 三、結果展示 本文由CSDN點云俠原創,首發于2025年7月24日。博客長期更新,本文最新更新時間為:2025年7月24日。 一、算法原理 1、計算流程 空間球方程: ( x ? a ) 2 + ( y ? b ) 2 + ( z ? c ) 2 = R 2 (1) (…

基于 HAProxy 搭建 EMQ X 集群

負載均衡器&#xff08;LB&#xff09;負責分發設備的 MQTT 連接與消息到 EMQ X 集群&#xff0c;采用 LB 可以提高 EMQ X 集群可用性、實現負載平衡以及動態擴容。 HAProxy簡介 HAProxy 是一款高性能的 開源負載均衡器 和 反向代理服務器&#xff0c;主要用于在多個服務器之…