內網私倉全流程搭建記錄(二)-npm私倉提交與拉取

1、npm私倉依賴下載及本地上傳

方法一
1)使用Pycharm創建py文檔,寫入如下py代碼:

import os
import re
import aiohttp
import asyncio
from urllib.parse import urlparse
from concurrent.futures import ThreadPoolExecutor

# 創建存儲文件夾
download_folder = "sourcenpm"
os.makedirs(download_folder, exist_ok=True)

# 讀取文件內容
with open("package-lock.json", "r") as file:
    content = file.read()

# 使用正則表達式匹配resolved字段的值
pattern = r'"resolved":\s+"(https:\/\/[^"]+\.tgz)"'
matches = re.findall(pattern, content)

# 異步下載函數
async def download_file(session, url):
    async with session.get(url) as response:
        if response.status == 200:
            parsed_url = urlparse(url)
            filename = os.path.basename(parsed_url.path)
            full_filename = os.path.join(download_folder, filename)
            content = await response.read()
            with open(full_filename, "wb") as output_file:
                output_file.write(content)

            print(f"文件 {filename} 下載成功")
        else:
            print(f"無法下載文件 {url}")

async def download_with_semaphore(semaphore, session, url):
    async with semaphore:
        await download_file(session, url)

async def main():
# 創建異步HTTP會話
    async with aiohttp.ClientSession() as session:
        semaphore = asyncio.Semaphore(8) # 限制併發數爲8
        tasks = []
        for url in matches:
            tasks.append(download_with_semaphore(semaphore, session, url))
        await asyncio.gather(*tasks)

        print("下載完成")

# 運行異步下載
if __name__ == "__main__":
    asyncio.run(main())

2)將vue項目中的package-lock.json文件放到本py腳本目錄下,執行該py腳本,package-lock.json中的依賴文件自動下載到新建的sourcenpm文件夾中,下載完成後將sourcenpm文件夾拷貝到內網中;
3)編寫上傳腳本npmimport.sh,win10環境下,使用powershell執行./npmimport.sh命令,代碼如下:

find . -type f -name '*.tgz' | sed "s|^\./||" | xargs -I '{}' \
curl -u 'admin:123456' -X 'POST' -v 'http://127.0.0.1:19999/service/rest/v1/components?repository=npm-test' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'npm.asset=@{};type=application/x-compressed';

在Linux中執行./npmimport.sh -u admin -p 123456 -v http://127.0.0.1:19999/service/rest/v1/components?repository=npm-test命令,代碼如下:

find . -type f -name '*.tgz' | sed "s|^\./||" | xargs -I '{}' \
curl -u "$USERNAME:$PASSWORD" \
-v ${REPO_URL} \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'npm.asset=@{};type=application/x-compressed';

 方法二、

1)將本地編譯後代碼目錄路徑下已生成的node_modules拷貝到內網中,在node_modules文件夾中新建npm2nexus.sh文件,執行./npm2nexus.sh命令,npm2nexus.sh內容如下:

#!/bin/bash
#通過本腳本批量上傳本地node_modules中的npm依賴包到私倉nexus3內
#將本本腳本文件npm2nexus.sh放在本地node_modules文件夾中即可
file_name="package.json" # 要查找的文件名
search_path="D:\VueWorkspace\RuoYi-Vue\ruoyi-ui\node_modules"    # 本地node_modules路徑
 
result=$(find $search_path -type f -iname "$file_name")   # 使用find命令查找文件
if [ ! -z "$result" ]; then                               # 如果結果不爲空
    while IFS= read -r file; do                           # 對於每個找到的文件
        echo "File found at: $(dirname "$file")"          # 輸出文件所在的目錄
        # 這裏可以添加其他操作或者調用函數處理該文件
        filepath=$(dirname "$file")
        cd "$filepath"
        npm publish --registry 'http://127.0.0.1:19999/repository/npm01/'  #nexus私倉地址
        cd "$search_path"
    done <<< "$result"
else
    echo "No files matching '$file_name' were found."     # 沒有找到符合條件的文件時的提示信息
fi

注:無論通過下載還是直接通過node_modules文件上傳,都可能存在相關依賴包無法正常下載或上傳等情況,需要區別對待,或單獨補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章