简体字、冯|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阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351