簡體字、馮|npm 倉庫(nexus/artifactory)批量遷移

背景

公司制品庫遷移,要將npm庫從原制品庫nexus遷移到artifactory中。涉及到近千的依賴包,手動太過費時。因此通過python腳本進行批量操作

思路

梳理思路,單個包的遷移步驟如下:下載包->修改包(package.json)中倉庫地址->執行npm publish命令。

與單個包相比,批量操作還需要能拿到包的所有下載地址,在推送之前需要登錄npm并設置全局repository地址。

獲取包的下載地址

倉庫包組件不多,但版本多。因此我選擇直接在瀏覽器中console通過js腳本獲取url,如果組件較多建議寫腳本獲取。

// 將數據以文件形式存儲
(function (console) {

    console.save = function (data, filename) {

        if (!data) {

            console.error('Console.save: No data')

            return;

        }

        if (!filename) filename = 'console.json'

        if (typeof data === "object") {

            data = JSON.stringify(data, undefined, 4)

        }

        var blob = new Blob([data], { type: 'text/json' }),

            e = document.createEvent('MouseEvents'),

            a = document.createElement('a')

        a.download = filename

        a.href = window.URL.createObjectURL(blob)

        a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')

        e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)

        a.dispatchEvent(e)

    }

})(console)
//獲取a標簽中url
function getHref(a){
    var urlArr = new Array();
    var hrefArr = document.getElementsByTagName('a'); //獲取這個頁面的所有A標簽
    for( var i=0; i<hrefArr.length; i++ ){
        hrefURL = hrefArr[i].href;
        urlArr[i] = hrefURL;
    }
    console.save(urlArr,a);
}
//執行獲取腳本
getHref("XXXX.txt");

獲取到的url文件(XXXX.txt)如下:

[
    "http://xxxx.com/service/rest/repository/browse/npm/xxxx/",
    "http://xxxx.com/repository/npm/xxxx/xxxx.tgz"
]

python 腳本

目錄

tmp_package
tmp_tar_package
tmp_utar_package
urls
auto.py
replace_file.py

tmp_package、tmp_tar_package、tmp_utar_package目錄為空目錄,urls中存放上一部中獲取的url文件;

代碼

  • replace_file.py
def replace_content(file,old_content,new_content):
    content=read_file(file)
    content=content.replace(old_content,new_content)
    rewrite_file(file,content)
#讀文件
def read_file(file):
    with open(file,encoding='UTF-8') as f:
        read_all = f.read()
        f.close()
    return read_all

#寫內容到文件
def rewrite_file(file,data):
    with open(file,'w',encoding='UTF-8') as f:
        f.write(data)
        f.close()
  • auto.py,運行腳本前需要登錄有權限的npm賬號
import wget
import os
import shutil
import tarfile
import replace_file
import urllib.parse
path='tmp_package/'
utar_path='tmp_utar_package/'
tar_path='tmp_tar_package/'
def tzgName(url):
    #根據url獲取壓縮包名稱
    arr=url.split('-/')
    return arr[1]
def readPackageUrls(f):
    #從文件中讀取地址
    urls = []
    f = 'urls/'+f
    file=open(f)
    data_lists=file.readlines()
    for i in data_lists:
        if i.rfind('.tgz') != -1:
            urls.append(i.replace('"','').replace(',\n',''))
    return urls
def dowanloadPackages(urls):
    #下載文件
    for u in urls:
        u=u.strip()
        u=urllib.parse.unquote(u)
        name = path + tzgName(u)
        print(u)
        print(name)
        t=wget.download(u,name)
    return 'download success! size: '
def utar():
    #文件解壓
    for f in os.listdir(path):
        dest_dir=f.replace('.tgz','')
        dest_dir=utar_path+dest_dir
        f=path+f
        try:
            tar=tarfile.open(f)
            names=tar.getnames()
            for name in names:
                tar.extract(name,dest_dir)
            tar.close()
        except Exception as e:
            print(e)
def ptar():
    #這個沒用
    for f in os.listdir(utar_path):
        tar = tar_path+f+'.tgz'
        f=utar_path+f+'/package/'
        try:
            with tarfile.open(tar,'w:gz') as tar:
                tar.add(f,arcname=os.path.basename(f))
        except Exception as e:
            print(e)          
def repalce():
    #這一步把需要替換的文件中字符串替換掉,主要是倉庫地址
    old_path='http://xxxx.com/repository/npm/'
    old_path1='http://xxxx.cn/repository/npm/'
    new_path='https://xxxx.com/artifactory/api/npm/npm-releases/'
    for f in os.listdir(utar_path):
        package_path= utar_path + f + '/package/package.json'
        replace_file.replace_content(package_path,old_path,new_path)
        replace_file.replace_content(package_path,old_path1,new_path)
def dealPackage():
    utar()
    repalce()
    # ptar()
    return 'deal package success!'
def pushPackage():
    for i in os.listdir(utar_path):
        p = utar_path+i+'/package/'
        shell= 'cd ' + p + ' & npm publish & cd ../../../'
        print(shell)
        os.system(shell)
    return 'publish package success!'
def cleanTmp():
    shutil.rmtree(path)
    shutil.rmtree(utar_path)
    shutil.rmtree(tar_path)
    os.makedirs(path)
    os.makedirs(utar_path)
    os.makedirs(tar_path)
cleanTmp()
sum = 0
for f in os.listdir('urls'):
    us = readPackageUrls(f)
    cleanTmp()
    dowan=dowanloadPackages(us)
    deal=dealPackage()
    push=pushPackage()
    print('處理文件:%s,共:%d條數據'%(f,len(us)))
    sum+=len(us)
    print('共處理文件:%d 條數據'%(sum))
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370