批量下载npm离线安装包
上篇讲到如何下载npm离线安装包的几种思路
https://blog.csdn.net/xinle0320/article/details/124285708
1、批量下载npm离线安装包
三种方式
- 通过 package.json 的 _resolved属性链接下载
- 通过 package-lock.json 的 resolved属性链接下载
- 本地直接打包方式
1.1分享使用属性链接方式下载,实现批量下载功能
如有疑问欢迎留言
,废话不多说直接贴代码
# -*-coding:utf-8-*-
import json
import os
from pathlib import Path
from urllib.request import urlretrieve
def node_modules(file_dir):
""" 通过递归遍历 node_modules 每个子包的package.json 解析下载链接 """
links = []
for root, dirs, files in os.walk(file_dir):
if 'package.json' in files:
package_json_file = os.path.join(root, 'package.json')
try:
with open(package_json_file, 'r', encoding='UTF-8') as load_f:
load_dict = json.load(load_f)
# print(load_dict)
if '_resolved' in load_dict.keys():
links.append(load_dict['_resolved'])
except Exception as e:
print(package_json_file)
print('Error:', e)
return links
def package_lock(package_lock_path):
""" 通过递归遍历 package-lock.json 解析下载链接 """
links = []
with open(package_lock_path, 'r', encoding='UTF-8') as load_f:
load_dict = json.load(load_f)
# print(load_dict)
search(load_dict, "resolved", links)
return links
def yarn_lock(package_lock_path):
""" 通过递归遍历 xxx-yarn.lock 解析下载链接 """
links = []
with open(package_lock_path, 'r', encoding='UTF-8') as load_f:
for line in load_f:
if line.find('resolved') >= 0:
line = line.replace('resolved', '')
url = line.strip().strip('"')
links.append(url)
return links
def search(json_object, key, links):
""" 遍历查找指定的key """
for k in json_object:
if k == key:
links.append(json_object[k])
if isinstance(json_object[k], dict):
search(json_object[k], key, links)
if isinstance(json_object[k], list):
for item in json_object[k]:
if isinstance(item, dict):
search(item, key, links)
def download_file(path, store_path):
""" 根据下载链接下载 """
# 判断输出的目录是否存在
if store_path is None:
store_path = 'D:\\nodejs'
if not Path(store_path).exists():
os.makedirs(store_path, int('0755'))
links = []
if path.endswith("package-lock.json"):
links = package_lock(path)
elif path.endswith("yarn.lock"):
links = yarn_lock(path)
else:
links = node_modules(path)
print("links:" + str(len(links)))
# print(links)
for url in links:
try:
filename = url.split('/')[-1]
index = filename.find('?')
if index > 0:
filename = filename[:index]
index = filename.find('#')
if index > 0:
filename = filename[:index]
filepath = os.path.join(store_path, filename)
if not Path(filepath).exists():
print("down:" + url)
urlretrieve(url, filepath)
# else:
# print("file already exists:", filename)
except Exception as e:
print('Error Url:' + url)
print('Error:', e)
if __name__ == '__main__':
# down_link = "C:\\Users\\Administrator\AppData\Roaming\\npm\\node_modules"
# down_link = "D:\\Git\\vue\\1\package-yarn.lock"
# down_link = "D:\\Git\\vue\\node_modules"
down_link = "D:\\Git\\vue\\package-lock.json"
download_file(down_link,"D:\\nodejs")
print("ok")