当前位置: 首页 > news >正文

多包单仓库(monorepo)实现形式

目录

背景

需求和方案

从0开始搭建一个Monorepo项目

创建

配置全局公共样式

配置全局公共组件

方式1:不需要独立发布的组件包,只在当前项目的子项目中使用

方式2:需要独立发布和版本维护的包

子项目的独立构建和部署

总结

Monorepo优势

便于代码维护、管理

支持多目录结构

优化开发流程、提升开发效率

Monorepo缺点

权限管理问题

代码管理


背景

随着业务不断增加,公司项目越来越多、沉淀的功能组件、工具包、UI、业务组件等内容越来越多,模块不断增长,一个组件一个仓库(Mulitrepo)虽然从业务逻辑上解耦,但是也增加了管理难度:

  • 依赖关系不清晰、管理复杂

  • 配置无法共享

  • 代码共享流程复杂,每次发布之后需要在项目中手动更新版本进行测试,效率低

在现代前端开发中,Monorepo是一种越来越流行的代码管理方式,它通过将多个相关包集中在一个仓库中进行管理,带来了更高效的开发体验和更简单的依赖管理。


需求和方案

需求:

  1. 多项目整合与独立运行

  2. 公共组件和样式共享

方案:

pnpm 是一种高效的包管理工具,它通过去重存储依赖和工作空间功能,为 Monorepo 项目提供了强大的支持。

上述需求可以通过在pnpm配置workspace工作空间(官网链接)来实现。


从0开始搭建一个Monorepo项目

创建

1.新建一个workspace文件夹,初始化

pnpm init

生成一个package.json文件

2.删除package.json 文件中的maintest字段

由于工程根目录 package.json 不需要发包,需要配置 "private": true

{"name": "workspace","version": "1.0.0","description": "","private": true,"scripts": {},"keywords": [],"author": "","license": "ISC"
}

3.根目录下新建pnpm-workspace.yaml文件(更多)

packages:
# packages/ 直接子目录中的所有包
- 'packages/*'

4.新建多包目录,例如workspace下新建一个文件夹packages,用于存放后续的各个项目

5.packages文件夹下新建2个vue项目

// 创建第一个
pnpm create vite app-first --template vue// 创建第二个
pnpm create vite app-second --template vue

找到这2个子项目的vite.config.js文件,配置2个项目不同的端口号,避免端口冲突

  server: {port: 3000,}

6.workspace根目录下执行安装依赖

pnpm i

执行之后根目录和2个子项目下都会生成各自的node_module文件。

7.配置根目录下package.json下子项目启动和构建脚本

  "scripts": {"dev:first": "pnpm run -C packages/app-first dev","dev:second": "pnpm run -C packages/app-second dev","build:first": "pnpm run -C packages/app-first build","build:second": "pnpm run -C packages/app-second build"},

若需要同时启动2个项目,需要安装依赖concurrently

pnpm install --save-dev concurrently

若遇到报错,按照报错信息修改命令即可

相关文章:

多包单仓库(monorepo)实现形式

目录 背景 需求和方案 从0开始搭建一个Monorepo项目 创建 配置全局公共样式 配置全局公共组件 方式1:不需要独立发布的组件包,只在当前项目的子项目中使用 方式2:需要独立发布和版本维护的包 子项目的独立构建和部署 总结 Monorepo优势 便于代码维护、管理 支持…...

Java冒泡排序算法之:变种版

什么是冒泡排序算法? 冒泡排序是一种简单的排序算法,通过多次遍历待排序的数组,逐步将最大的(或最小的)元素“冒泡”到数组的一端。它以其操作过程类似气泡从水底冒至水面而得名。 冒泡排序的工作原理 比较相邻元素&…...

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址:https://arxiv.org/pdf/2409.17266v1 Github地址:https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型(AAPM)…...

Spring常见知识

1、什么是spring的ioc? 其实就是控制反转,提前定义了一个bean,到时候使用的时候直接autowire就可以了。目的是减低计算机代码之间的耦合度。 创建三个文件,分别是Bean的定义、Bean的使用、Bean的配置。 IOC通过将对象创建和管理…...

计算机网络的五层协议

计算机网络的五层协议 ‌计算机网络的五层协议模型包括物理层、数据链路层、网络层、传输层和应用层,每一层都有其特定的功能和相关的协议。‌‌1 ‌物理层‌:负责传输原始的比特流,通过线路(有线或无线)将数据转换为…...

Bluetooth LE Audio - 蓝牙无线音频新应用 (上)

SIG联盟(Bluetooth Special Interest Group)自2020年开始推广新的LE Audio,在穿戴式装置掀起一股热潮,各个品牌商、制造商、第三方软件商都积极的寻找新的LE Audio规格究竟能提供什么样的新应用。究竟LE Audio如何改变你我的生活、…...

如何快速准备数学建模?

前言 大家好,我是fanstuck。数学建模不仅是解决复杂现实问题的一种有效工具,也是许多学科和行业中的关键技能。从工程、经济到生物、环境等多个领域,数学建模为我们提供了将实际问题转化为数学形式,并利用数学理论和方法进行求解的强大能力。然而,对于许多初学者而言,如…...

如何在linux系统上完成定时开机和更新github端口的任务

任务背景 1.即使打开代理,有的时候github去clone比较大的文件时也会出问题。这时需要每小时更新一次github的host端口; 2.马上要放假,想远程登录在学校的台式电脑,但学校内网又不太好穿透。退而求其次,选择定时启动电…...

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统)指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…...

探索 Linux:(一)介绍Linux历史与Linux环境配置

探索 Linux:(一)介绍Linux历史与Linux环境配置 一. 计算机与操作系统的历史1.1计算机的历史1.2操作系统的历史 二、Unix 操作系统的历史三、Linux 与安卓的关系3.1Linux 与安卓的关系3.2安卓的历史 四、Linux 简单介绍五、Linux 环境安装5.1 虚拟机5.2 直…...

前端【2】html添加样式、CSS选择器

一、为html添加样式的三种方法 1、内部样式 2、外部样式 3、行内样式 二、css的使用--css选择器 1、css基本选择器 元素选择器 属性选择器 id选择器 class/类选择器 通配符选择器 2、群组选择器-多方面筛选 3、关系选择器 后代选择器【包含选择器】 子元素选择器…...

Yolov8 目标检测剪枝学习记录

最近在进行YOLOv8系列的轻量化,目前在网络结构方面的优化已经接近极限了,所以想要学习一下模型剪枝是否能够进一步优化模型的性能 这里主要参考了torch-pruning的基本使用,v8模型剪枝,Jetson nano部署剪枝YOLOv8 下面只是记录一个…...

LeDeCo:AI自动化排版、设计、美化海报

1.简介 平面设计是一门艺术学科,致力于创造吸引注意力和有效传达信息的视觉内容。今天,创造视觉上吸引人的设计完全依赖于具有艺术创造力和技术专长的人类设计师,他们巧妙地整合多模态图形元素,这是一个复杂而耗时的过程&#xf…...

Flink CDC解决数据库同步,异常情况下增量、全量问题

Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的数据同步方案,基于 Flink CDC 同步的解决方案以及更多…...

01、flink的原理和安装部署

flink中主要有两个进程,分别是JobMManager和TaskManager,当然了根据flink的部署和运行环境不同,会有一些不同,但是主要的功能是类似的,下面我会讲下聊下,公司用的多的部署方式,基于yarn集群的部…...

美图脱掉“复古外衣”,在AI浪潮中蜕变

"人工智能就像电力一样,如果你的竞争对手正在使用它,你也需要使用它,否则你就会失去竞争力",斯坦福大学教授和谷歌前首席科学家安德鲁恩格尔曾这样说到。 而近日拉开序幕的消费电子风向标——科技贸易展国际消费电子展…...

sqlalchemy The transaction is active - has not been committed or rolled back.

连接池参考 参考:https://blog.csdn.net/SunJW_2017/article/details/129332393 1、因为使用了连接池,没有释放 2、解决方法: from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session from gree…...

47.数据绑定的PropertyChanged C#例子 WPF例子

[CallerMemberName] string propertyName null 这段代码中的 [CallerMemberName] 是一个特性(Attribute),它应用于 propertyName 参数。这个特性的作用是,在编译时,如果调用 OnPropertyChanged 方法时没有显式提供 pr…...

网络安全 | Web安全常见漏洞和防护经验策略

关注:CodingTechWork 引言 OWASP (Open Web Application Security Project) Top 10是Web应用最常见的安全风险集合,帮助开发人员和安全专家识别和防止最严重的网络安全问题。以下是基于OWASP Top 10的Web安全防护经验策略与规则集。Web开发者必须对潜在…...

Agent一键安装,快速上手Zabbix监控!

目录 一、Linux操作系统部署Agent环境配置1、防火墙配置2、永久关闭selinux yum方式安装1、配置zabbix仓库2、安装agent3、配置 Zabbix-Agent 指向 Zabbix-Server4、启动agent服务 二进制包安装1、下载二进制包2、创建用户和目录及更改属主(组)3、解压二…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流&#xff0c;会涉及到许多有意思的话题&#xff0c;诸如怎么确保对方能收到信息&#xff0c;怎么应对数据丢失、被污染或者顺序混乱&#xff0c;怎么提高…...