将本地前端工程中的npm依赖上传到Nexus

2023-09-19 13:41:22

【问题背景】

用Nexus搭建了内网的依赖仓库,需要将前端工程中node_modules中的依赖上传到Nexus上,但是node_modules中的依赖已经是解压后的状态,如果直接机械地将其简单地打包上传到Nexus,那么无法通过npm install下载使用。故有此文。

【解决思路】

前端工程中的所有npm依赖信息已经记录在package-lock.json文件中,包括依赖的下载地址,所以可以直接根据package-lock.json中记录的依赖地址逐个下载依赖的原始包,然后再上传到Nexus对应的仓库中。

【前置条件】

  1. Nexus上已创建好hosted类型的npm仓库,假设起名为:npm-local
  2. 本地前端工程所在PC可以连接互联网
  3. 本地前端工程已执行npm install且已生成package-lock.json

【编写脚本】

下述的NodeJS脚本可以下载package-lock.json文件中的依赖,将该脚本保存到一个名为downloadNpmPackage.js的文件中:

const fs = require('fs');
const path = require('path');
const request = require('request');
// 指定根据package-lock.json中记录的信息下载依赖
const packageLock = require('./package-lock.json');
// 指定将依赖下载到当前目录下的npm-dependencies-tgz目录
const downUrl = './npm-dependencies-tgz';

if (!fs.existsSync(downUrl)) {
  fs.mkdirSync(downUrl);
}

// 收集依赖的下载路径
const tgz = [];
for (let pkg in packageLock.dependencies) {
  let tgzUrl = packageLock.dependencies[pkg]['resolved'];
  tgz.push(tgzUrl);
}

// 逐个下载
tgz.forEach((url) => {
  const outUrl = url.split('/').pop()
  let outUrl2 = [outUrl]
  if(outUrl.indexOf('?') !== -1){
    outUrl2 = outUrl.split('?')
  }
  const outputDir = path.join(downUrl, outUrl2[0])
  let receivedBytes = 0;
  let totalBytes = 0;
  const req = request({
    method: 'GET',
    uri: url
  });
  req.on('response', function(data) {
    totalBytes = parseInt(data.headers['content-length']);
  });
  req.on('data', function(chunk) {
    receivedBytes += chunk.length;
    showProgress(receivedBytes, totalBytes, outUrl2[0]);
  });
  req.pipe(fs.createWriteStream(outputDir));
});

// 依赖下载进度显示
function showProgress(received, total, filePath) {
  const percentage = ((received * 100) / total).toFixed(2);
  process.stdout.write(`${filePath} 下载进度:${percentage}% (${received}/${total} 字节)\r`);
  if (received === total) {
    console.log(`\n${filePath} 下载完成!`);
  }
}

下述Bash脚本可以将下载好的前端依赖上传到Nexus上,将该脚本保存到名为UploadnpmPackage.sh的文件中。

#!/bin/bash

# 获取命令行参数
while getopts ":r:u:p:" opt; do
    case $opt in
        r) REPO_URL="$OPTARG"
        ;;
        u) USERNAME="$OPTARG"
        ;;
        p) PASSWORD="$OPTARG"
        ;;
    esac
done
 
# find 并批量上传
find . -type f -name '*.tgz'  | sed "s|^\./||" | xargs -I '{}' \
curl -u "$USERNAME:$PASSWORD" -X 'POST' -v \
  ${REPO_URL} \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'npm.asset=@{};type=application/x-compressed' ;

【上传依赖】

1.将NodeJs脚本downloadNpmPackage.js置于前端工程目录下且与package-lock.json文件同级:

2.在当前目录运行Node命令:

node downloadNpmPackage.js

等待程序下载依赖包:

下载完成后会在package-lock.json同级目录生成一个名为npm-dependencies-tgz的文件夹:

里面存放的是当前工程所有依赖的tgz文件:

将npm-dependencies-tgz文件夹打包成tar压缩包。

3.z至此上一步压缩的tar包和名为UploadnpmPackage.sh的shell脚本如下,可以将这俩发给负责依赖上传的同事,由他们完成后面的上传操作。

4.上传依赖的同事收到上述两个文件后,解压npm-dependencies-tgz.tar压缩包,得到npm-dependencies-tgz目录,将UploadnpmPackage.sh剪切到npm-dependencies-tgz目录下与所有tgz依赖包同级:

5.若是linux操作系统,则需要使用如下命令将脚本中的换行符进行转换:

dos2unix UploadnpmPackage.sh

若没有dos2unix则需要安装一下:sudo yum install dos2unix。如果是windows则跳过本步。

6.在npm-dependencies-tgz目录下使用如下命令运行脚本UploadnpmPackage.sh将依赖包上传到nexus上,注意红字部分根据Nexus的实际情况填写:

sh UploadnpmPackage.sh -u admin -p nexusAdmin2023 -r

http://172.24.105.249:8089/service/rest/v1/components?repository=npm-local

7.登录Nexus网页,查看到npm-local仓库下已经存在刚才上传的依赖了:

【使用依赖】

1.完成上述上传操作后,查看并复制npm-local仓库地址:

9.CI工具中配置依赖拉取地址为上述复制的地址:http://172.24.105.249:8089/repository/npm-local/。或者离线编译前端源码时可以使用如下命令设置npm仓库地址:

npm config set registry=http://172.24.105.249:8089/repository/npm-local/

10.到此便可正常运行npm install安装依赖了。

更多推荐

在pandas中使matplotlib动态画子图的两种方法【推荐gridspec】

先上对比图,第一种方法,这里仅展示1个大区,多个的话需要加一层循环就可以了,主要是看子图的画法当大区下面的国家为1个或2个时,会进行报错#获取非洲国家列表african_countries=df[df['大区']=='南亚大区']['进口国'].unique()#动态计算子图的行列数量num_countries=len

datax同步数据翻倍,.hive-staging 导致的问题分析

一、背景有同事反馈Datax从Hive表同步数据到Mysql数据翻倍了。通过查看Datax任务日志发现,翻倍的原因是多读取了.hive-staging_xx开头的文件。接下里就是有关.hive-staging的分析。二、环境Hive版本2.1.1三、分析3.1.hive-staging_hive产生的原因通过Spark

【Java】泛型 之 编写泛型

写泛型类比普通类要复杂。通常来说,泛型类一般用在集合类中,例如ArrayList<T>,我们很少需要编写泛型类。如果我们确实需要编写一个泛型类,那么,应该如何编写它?可以按照以下步骤来编写一个泛型类。首先,按照某种类型,例如:String,来编写类:publicclassPair{privateStringfirst;

Spring面试题1:Spring框架的核心功能是什么?Spring框架的好处是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点Spring框架的核心功能是什么Spring框架的核心功能包括:控制反转(IoC):Spring通过IoC容器管理对象的生命周期和依赖关系。它将对象的创建、组装和管理交给Spring容器,使得应用程序更加松耦合

CSS 模糊效果 CSS 黑白效果 CSS调整亮度 对比度 饱和度 模糊效果 黑白效果反转颜色

CSS模糊效果CSS黑白效果CSS调整亮度饱和度模糊效果黑白效果实现调整亮度饱和度模糊效果黑白效果使用filter1、模糊2、亮度3、对比度4、饱和度5、黑白效果6、反转颜色7、组合使用8、filer完整参数实现调整亮度饱和度模糊效果黑白效果使用filter1、模糊blur()用于模糊元素,可以设置模糊的程度,例如fi

【Redis】Redis 的学习教程(十)之使用 Redis 实现消息队列

消息队列需要满足的要求:顺序一致:要保证消息发送的顺序和消费的顺序是一致的,不一致的话可能会导致业务上的错误消息确认机制:对于一个已经被消费的消息(已经收到ACK)不能再次被消费消息持久化:要具有持久化的能力,避免消息丢失,这样当消费者异常宕机导致再次重启后需要重新消费消息时可以再次获取Redis提供了三种不同的方式来

python 异步任务框架 Celery 入门,速看!

01、简介Celery是使用python编写的分布式任务调度框架。它有几个主要的概念:celery应用用户编写的代码脚本,用来定义要执行的任务,然后通过broker将任务发送到消息队列中broker代理,通过消息队列在客户端和worker之间进行协调。celery本身并不包含消息队列,它支持一下消息队列RabbitMQ

在MySQL中使用VARCHAR字段进行日期筛选

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

Mysql---第七篇

系列文章目录文章目录系列文章目录一、简述MyISAM和InnoDB的区别二、简述mysql中索引类型及对数据库的性能的影响一、简述MyISAM和InnoDB的区别MyISAM:不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作是对整个表加锁;存储表的总行数;一个MYISAM表有三个文件:索引文件、表结构文件、数

不要再滥用可选链运算符(?.)啦!

可选链运算符(?.),大家都很熟悉了,直接看个例子:constresult=obj?.a?.b?.c?.d很简单例子,上面代码?前面的属性如果是空值(null或undefined),则result值是undefined,反之如果都不是空值,则会返回最后一个d属性值。本文不是讲解这种语法的用法,主要是想分析下日常开发中,

指针进阶2(内含库函数qsort的模拟实现)

指针进阶2函数指针数组之前给大家介绍过函数指针的相关知识,下面我们进一步讲解一下指针的相关知识:喜欢的小伙伴可以给追秋点点关注,三连走一波!!!我们学习了函数指针数组之后,那肯定有朋友要问了,这个知识点有点复杂,那该如使用呢?下面我们写一个初级的计算器程序简单说明函数指针数组的用途:下面是计算器的代码:#include

热文推荐