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

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、引言
      • 1. Monorepo 和 MultiRepo 简介
      • 2. 为什么选择 Monorepo?
    • 二、Monorepo 和 MultiRepo 的区别
      • 1. 定义和概述
      • 2. 各自的优点和缺点
      • 3. 适用场景
    • 三、Monorepo 的开发策略
      • 1. 版本控制
      • 2. 依赖管理
      • 3. 构建和发布
      • 4. 代码质量和测试
    • 四、实践指南
      • 1. 安装和初始化
      • 2. 配置 pnpm 工作区
      • 3. 创建工作区目录和示例项目
      • 4. 管理依赖
      • 5. 示例项目架构
    • 五、结论

一、引言

1. Monorepo 和 MultiRepo 简介

在软件开发中,代码仓库的管理方式对项目的效率和协作有着重要影响。常见的代码仓库管理方式主要有两种:Monorepo(单体仓库)和 MultiRepo(多仓库)。

在这里插入图片描述

  • Monorepo(单体仓库):是指将多个项目存储在同一个代码仓库中。这种方式允许不同项目共享代码和依赖,并在同一个版本控制系统中进行管理。
  • MultiRepo(多仓库):是指将每个项目存储在独立的代码仓库中,每个仓库独立管理代码和依赖。不同项目之间的代码和依赖需要通过包管理工具或其他方式进行共享。

2. 为什么选择 Monorepo?

选择 Monorepo 的原因主要包括以下几点:

  • 代码共享:在同一个仓库中,项目之间的代码共享更加便捷,减少了重复代码,提高了代码复用率。
  • 一致性管理:可以统一管理依赖、构建和发布流程,确保不同项目的开发环境和工具链的一致性。
  • 简化依赖管理:跨项目的依赖管理变得更加简单,减少了依赖冲突和版本不兼容的问题。
  • 提升协作效率:团队成员可以在同一个仓库中协作,代码审查、问题跟踪和变更管理更加方便。

在许多优秀的开源项目中,Monorepo 方案已经被广泛采用,以下是一些知名的例子:

  • Babel:一个用于编译 JavaScript 的工具链,通过 Monorepo 管理其各个插件和核心库。
  • React:Facebook 开发的流行前端库,采用 Monorepo 管理其核心代码、工具和社区插件。
  • Angular:Google 开发的前端框架,使用 Monorepo 来管理其所有模块、工具和文档。
  • Vue:尤雨溪开发的前端框架,也采用 Monorepo 管理其核心库、工具和插件。
  • Nx:一个构建用于企业级 Angular 应用程序的工具,采用 Monorepo 方案来管理其所有插件和工具。
  • TypeScript:微软开发的 JavaScript 超集语言,使用 Monorepo 来管理编译器、语言服务和社区贡献的工具。

在这里插入图片描述

这篇文章旨在介绍 Monorepo 的开发策略与实践指南,为希望采用或正在采用 Monorepo 管理方式的开发团队提供参考和帮助。文章将详细探讨 Monorepo 的优势和挑战,并分享实际项目中的最佳实践和常见问题解决方案。

二、Monorepo 和 MultiRepo 的区别

1. 定义和概述

Monorepo(单体仓库)

  • 定义:将多个项目存储在同一个代码仓库中,这些项目共享一个版本控制系统和一个构建系统。
  • 概述:所有代码和依赖都集中在一个仓库中,可以方便地进行统一管理和协调。

MultiRepo(多仓库)

  • 定义:将每个项目存储在独立的代码仓库中,每个仓库有自己的版本控制系统和构建系统。
  • 概述:每个项目独立管理,项目之间的代码和依赖共享通过包管理工具或其他方式进行。

2. 各自的优点和缺点

Monorepo 的优势与挑战

  • 优势
    • 代码共享:容易在不同项目之间共享代码和资源,减少重复代码。
    • 一致性管理:统一管理依赖、构建和发布流程,确保一致性。
    • 协作效率:开发团队可以在同一个仓库中协作,代码审查和变更管理更加方便。
    • 依赖管理:跨项目的依赖管理更加简单,减少依赖冲突。
  • 挑战
    • 规模问题:仓库规模较大时,可能导致版本控制系统性能下降。
    • 构建时间:随着项目数量增加,构建时间可能变长,需要优化构建流程。
    • 权限管理:需要精细化的权限管理,以确保不同项目的访问控制。

MultiRepo 的优势与挑战

  • 优势
    • 独立性:每个项目独立管理,不受其他项目变更的影响。
    • 灵活性:各项目可以选择最适合自己的工具和依赖版本。
    • 权限控制:更容易对每个项目进行精细化的权限管理。
  • 挑战
    • 代码共享:在不同项目之间共享代码和资源较为困难,可能导致重复代码。
    • 依赖管理:跨项目的依赖管理复杂,需要额外的工具和配置。
    • 协作效率:团队成员需要在多个仓库之间切换,可能降低协作效率。

3. 适用场景

Monorepo 适用场景

  • 大型项目:需要统一管理多个子项目或模块的大型项目。
  • 频繁共享代码:多个项目之间频繁共享代码和资源的情况。
  • 一致性要求高:对依赖、构建和发布流程一致性要求较高的项目。
  • 团队协作:需要高效协作的团队和项目。

MultiRepo 适用场景

  • 独立性强的项目:各项目相互独立,变更较少影响其他项目。

  • 灵活性需求高:需要为每个项目选择不同的工具和依赖版本。

  • 权限控制严格:需要对每个项目进行精细化权限管理的情况。

  • 规模较小的项目:项目规模较小,不需要频繁共享代码和资源。

三、Monorepo 的开发策略

1. 版本控制

Git 分支策略

  • 主分支(main/master):用于发布稳定版本的分支,代码应保持高稳定性和可发布状态。
  • 开发分支(develop):主要开发活动的分支,包含最新的开发代码,定期合并到主分支。
  • 功能分支(feature):每个新功能或改进的独立分支,从开发分支创建,完成后合并回开发分支。
  • 修复分支(fix/hotfix):用于紧急修复生产环境问题的分支,从主分支创建,修复后合并回主分支和开发分支。

Commit 规范

  • Commit 消息格式:使用一致的格式,如 type(scope): description,例如 feat(api): add new endpoint for user data
  • 类型(type):如 feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(其他)。
  • 范围(scope):指明修改的具体模块或组件。

2. 依赖管理

使用工具

  • Lerna:用于管理 JavaScript 和 TypeScript 项目的 Monorepo 工具,支持版本控制和依赖管理。
  • Yarn Workspaces:Yarn 的一项功能,允许在 Monorepo 中高效管理依赖,减少重复安装的依赖包。
  • Nx:一个强大的 Monorepo 管理工具,提供了更高级的依赖分析、构建和测试功能。
  • pnpm Workspaces:pnpm 提供的 workspace 功能,允许在 Monorepo 中高效管理依赖,并利用硬链接技术减少磁盘空间占用。

如何管理跨项目的依赖

  • 统一版本:确保所有项目使用相同版本的依赖,避免版本冲突。
  • 本地链接:通过工具(如 Lerna、Yarn Workspaces 或 pnpm Workspaces)实现本地依赖的链接,确保项目之间的依赖关系清晰。

3. 构建和发布

持续集成/持续交付(CI/CD)方案

  • CI 工具:使用 Jenkins、GitHub Actions、GitLab CI 等工具,实现自动化构建和测试。
  • 流水线设计:定义清晰的构建和发布流水线,包括编译、测试、打包、发布等步骤。

自动化发布流程

  • 版本控制:使用语义化版本(Semantic Versioning)管理项目版本。
  • 发布脚本:编写自动化发布脚本,实现从代码合并到发布的全流程自动化。

4. 代码质量和测试

代码审查流程

  • 代码审查工具:使用 GitHub、GitLab 或 Bitbucket 的 Pull Request 功能进行代码审查。
  • 审查标准:定义统一的代码审查标准和最佳实践,确保代码质量。

测试策略

  • 单元测试:为每个模块和功能编写单元测试,确保其独立运行正确。
  • 集成测试:测试项目之间的依赖关系和交互,确保整体系统的正确性。
  • 端到端测试:模拟用户操作,测试整个系统的功能和性能,确保最终用户体验。

通过上述开发策略,可以有效管理和优化 Monorepo 的开发流程,提高代码质量和团队协作效率。

四、实践指南

1. 安装和初始化

全局安装 pnpm

npm install pnpm -g

在项目下进行初始化

pnpm init

得到初始的 package.json

{"name": "my-monorepo","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

修改 package.json 文件
删除 main 这一行以及 scripts 的内容,调整后如下:

{"name": "my-monorepo","version": "1.0.0","description": "","scripts": {},"keywords": [],"author": "","license": "ISC"
}

scripts 中后期应当加上 eslint 以及 prettier、commit 等配置,以便于统一代码规范以及格式化信息。

2. 配置 pnpm 工作区

新建 pnpm-workspace.yaml 文件

touch pnpm-workspace.yaml

声明对应的工作区

# pnpm-workspace.yaml
packages:# 主包,存放所有项目的目录- 'packages/**'# 存放组件的目录- 'components/*'# 组件库使用的示例代码- 'examples/*'# 存放文档- 'docs/**'# 存放公共库(配置文件、工具函数、模版等)- 'shared/**'

3. 创建工作区目录和示例项目

在根目录创建相应的工作区目录以及示例项目

# 新建 packages 目录
mkdir packages
# 新建 components 目录
mkdir components
# 新建 examples 目录
pnpm create vite examples
# 新建 docs 目录
mkdir docs
# 新建 shared 目录
mkdir shared

4. 管理依赖

将所有项目用到的共同依赖的 dependenciesdevDependencies 添加到根目录的 package.json

在根目录下载依赖到仓库全局锁定,后面创建的项目将沿用这套依赖

pnpm install -w

5. 示例项目架构

root
├── .husky           # Git钩子,自动化代码检查
├── node_modules     # 依赖存放
├── packages         # 各项目或包的集合
│   ├── proj1        # 项目1
│   ├── proj2        # 项目2
│   └── ...          # 其他项目
├── components       # 存放组件的目录
├── examples         # 组件库使用的示例代码
├── docs             # 文档
├── shared           # 存放公共库(配置文件、工具函数、模版等)
├── .cz-config.js    # 提交信息格式化
├── .gitignore       # Git忽略规则
├── .prettierrc.js   # Prettier格式化配置
├── pnpm-workspace.yaml # pnpm工作区配置
└── README.md        # 项目总览

通过上述步骤,可以快速上手并高效管理一个基于 pnpm Workspaces 的 Monorepo 项目。在后续开发过程中,可以进一步配置 eslintprettiercommitlinthusky 等工具,以确保代码质量和开发规范。

五、结论

在现代前端开发中,Monorepo 已成为一种流行的项目管理方式。通过使用 pnpm workspaces,可以有效地管理多个项目和包,使其共享依赖、统一构建和测试流程,提高开发效率和项目的一致性。

通过本文的实践指南,你可以快速上手并高效管理一个基于 pnpm Workspaces 的 Monorepo 项目。规范的目录结构、合理的依赖管理、统一的代码规范和格式化工具,都是保持项目健康和可维护的重要因素。

相关文章:

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

🔥 个人主页:空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo? 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…...

使用 PyTorch 创建的多步时间序列预测的 Encoder-Decoder 模型

Encoder-decoder 模型在序列到序列的自然语言处理任务(如语言翻译等)中提供了最先进的结果。多步时间序列预测也可以被视为一个 seq2seq 任务,可以使用 encoder-decoder 模型来处理。本文提供了一个用于解决 Kaggle 时间序列预测任务的 encod…...

开启IT世界的第一步:高考新生的暑期学习指南

目录 前言 了解IT领域 学习编程语言 实践项目 学习资源 阅读专业书籍 培养良好的学习习惯 结语 最后 - 投票 前言 七月的钟声敲响,各省的高考分数已揭晓,意味着一段紧张而又充满奋斗的旅程画上了句号。然而,高考的结束并不意味…...

软考系统架构师高效备考方法论

软考系统架构师高效备考方法论 本章总结的备考方法论也是希望能帮助更多的小伙伴高效的备考最终通过考试,这种考试个人感觉是尽量一次性考过, 要不然老拖着,虽然每年可以考两次,5月和11月,两次考试间隔5个月时间&#…...

【neo4j图数据库】入门实践篇

探索数据之间的奥秘:Neo4j图数据库引领新纪元 在数字化浪潮汹涌的今天,数据已成为企业最宝贵的资产之一。然而,随着数据量的爆炸性增长和数据关系的日益复杂,传统的关系型数据库在处理诸如社交网络、推荐系统、生物信息学等高度互…...

【TS】TypeScript 原始数据类型深度解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript 原始数据类型深度解析一、引言二、基础原始数据类型2.1 boolean2.2 …...

怎么样调整分类的阈值

调整分类模型的阈值是改变模型对正负类的预测标准的一种方法,常用于提高精确率、召回率或者其他性能指标。以下是如何调整分类阈值的步骤和方法: PS:阈值是针对预测概率(表示样本属于某个特定类别的可能性)来说的 调…...

java+mysql教师管理系统

完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统,该系统旨在实现教师信息的管理,并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…...

PDF文档如何统计字数,统计PDF文档字数的方法有哪些?

在平时使用pdf阅读或者是处理文档的时候,常常需要统计文档的字数。pdf在查看文字时其实很简单。 PDF文档是一种常见的电子文档格式,如果需要对PDF文档中的字数进行统计,可以使用以下方法: Adobe Acrobat DC:Adobe Ac…...

在Python asyncio中如何识别协程是否被block了

现在asyncio在Python中的使用越来越广泛了,但是很多人对于协程(corotine)的一些使用方式还不太熟悉。在这篇文章中,我将会介绍如何识别协程是否被block了,并以常用的HTTP网络库requests/httpx为例来说明如何避免协程被block的问题。 为什么协程会被block 在Python中,可…...

Hyper-V虚拟机固定IP地址(手把手教设置)

链接虚拟机修改网络配置文件 输入指令 sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0 然后 输入 按 i 键 再按回车 (enter) 进入编辑模式 修改配置(这几项)其中 IPADDR 就是你想给虚拟机固定的 IP 地址 多台的话只需要修改这个IP 就行其他不变 BOOTPROTO=static…...

以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!

大家好,我是CodeQi! 项目开发中,Loading 的展示与关闭是非常关键的用户体验设计。 当我们的应用需要发起多个异步请求时,如何有效地管理全局 Loading 状态,保证用户在等待数据加载时能有明确的反馈,这是一个值得深入探讨的问题。 本文将以 Vue 3 项目为例,详细讲解如…...

Node.js学习(一)

Node.js安装与入门案例: 需求:点击按钮,请求本地目录指定文件的内容,并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了,可是会发现不行。 网页运行在浏览器端,通常后续要发布&#xf…...

Spring Data JPA使用及实现原理总结

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...

【C语言】extern 关键字

在C语言中,extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中,通常用于声明全局变量或函数,这些变量或函数的定义位于其他文件中。 基本用法 变量声明…...

Linux--V4L2应用程序开发(二)改变亮度

一、思路流程 创建一个新线程用来控制亮度,线程通过读取用户输入来增加或减少亮度值,并使用 ioctl 函数将新亮度值设置到视频设备。 二、代码 /*创建线程来控制亮度*/ pthread_t thread; pthread_create(&thread, NULL, thread_brightness_contrl…...

[Gstreamer] 消息处理handler的设置

前言: Gstreamer 提供以 GstMessage 和 GstBus 为基础的消息传递机制,所有GstMessage 发送的时候都需要指定 GstBus 用来明确当前 message 将在哪条 Bus 上流转。所有的 GstMessage 最终都会进入一个handler,这个handler函数可以通过两种方式…...

线性代数笔记

行列式 求高阶行列式 可以划上三角 上三角 余子式 范德蒙行列式 拉普拉斯公式 行列式行列对换值不变 矩阵 矩阵的运算 同型矩阵加减 对应位置相加减 矩阵的乘法 左边第 i 行 一次 相乘求和 右边 第 j 列 eg 中间相等 两边规模 矩阵的幂运算 解题思路 找规律 数学归纳…...

未公开 GeoServer开源服务器wfs远程命令执行漏洞 已复现(CVE-2024-36401)

0x01 阅读须知 技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成…...

【WebGIS干货分享】Webgis 面试题-浙江中海达

1、Cesium 中有几种拾取坐标的方式,分别介绍 Cesium 是一个用于创建 3D 地球和地理空间应用的 JavaScript 库。在 Cesium 中,你可以使用不同的方式来拾取坐标,以便与地球或地图上的对象进行交 互。以下是 Cesium 中几种常见的拾取坐标的方式…...

ES 修改索引字段类型

大体的原理: 1:按照老索引按需修改,新建新索引 2:转移数据(数据量大,时间会很长) 3:删除老索引 4:给新索引 创建别名 第一步:创建新索引 可以先获取老索引ma…...

恢复的实现技术-日志和数据转储

一、引言 在系统正常运行的情况下,事务处理的恢复机制应采取某些技术措施为恢复做好相应的准备,保证在系统发生故障后,能将数据库从一个不一致的错误状态恢复到一个一致性状态 恢复技术主要包括 生成一个数据库日志,来记录系统中…...

全网最全最细的jmeter接口测试教程,建议收藏

在日常工作中,尤其是做接口测试时,我们最经常用到的两个工具,就是Jmeter和postman。今天,我们主要是讲一讲Jmeter在接口测试这一块的一些方式方法。内容比较多,大家可以收藏一下,以后慢慢学。 1&#xff0…...

Raspbian命令行连接WiFi网络

Raspbian命令行连接WiFi网络 1. 源由2. 环境3. 信号4. 连接5. 检查6. 断开 1. 源由 “懒人”多福,是什么原因,大家知道不,哈哈。 如果大家关注过之前《Ardupilot开源代码之Rover上路计划》,为了笔记本电脑在不断网的情况下进行配…...

王佩丰 Excel 基础二十四讲——目录

前言 跟着B站学习王佩丰 Excel 基础教程,本文章为索引目录 课程传送门:视频地址——点击前往 王佩丰Excel基础教程24讲完整版 第一讲:认识 Excel 第二讲:Excel 单元格格式设置 第三讲:查找替换定位(未编辑…...

Qt扫盲-QRect矩形描述类

QRect矩形描述总结 一、概述二、常用函数1. 移动类2. 属性函数3. 判断4. 比较计算 三、渲染三、坐标 一、概述 QRect类使用整数精度在平面中定义一个矩形。在绘图的时候经常使用,作为一个二维的参数描述类。 一个矩形主要有两个重要属性,一个是坐标&am…...

Android系统adb shell怎么执行checksum 来判断文件是否变更?

在Android系统中,通过ADB(Android Debug Bridge)shell执行checksum(校验和)来检查文件是否变更是一个常见的需求,尤其是在自动化测试或确保应用文件未被篡改的场景中。在Linux和Android shell中&#xff0c…...

JS中的上下文

一.执行上下文的概念: 执行上下文简称上下文。变量或者函数的上下文决定了它们可以访问哪些数据,以及它们的行为。每一个上下文都具有一个关联的变量对象,而这个上下文中定义的所有变量和函数都存在于这个对象上。 二.JS中上下文的执行机制&a…...

【深度学习】注意力机制

https://blog.csdn.net/weixin_43334693/article/details/130189238 https://blog.csdn.net/weixin_47936614/article/details/130466448 https://blog.csdn.net/qq_51320133/article/details/138305880 注意力机制:在处理信息的时候,会将注意力放在需要…...

安卓开发自定义时间日期显示组件

安卓开发自定义时间日期显示组件 问题背景 实现时间和日期显示,左对齐和对齐两种效果,如下图所示: 问题分析 自定义view实现一般思路: (1)自定义一个View (2)编写values/attrs.…...

IT行业入门,如何假期逆袭,实现抢跑

目录 前言 1.IT行业领域分类 2.基础课程预习指南 3.技术学习路线 4.学习资源推荐 结束语 前言 IT(信息技术)行业是一个非常广泛和多样化的领域,它包括了许多不同的专业领域和职业路径。如果要进军IT行业,我们应该要明确自己…...

Pyramid 中混合认证策略

1. 问题背景 在一个使用 Pyramid 框架开发的应用程序中,需要同时处理 HTML 内容的显示和 JSON API 的请求。对于 HTML 内容,使用了 AuthTktAuthenticationPolicy 进行身份验证和 ACLAuthorizationPolicy 进行授权。当用户成功登录后,会在浏览…...

深度学习经典检测方法概述

一、深度学习经典检测方法 two-stage(两阶段):Faster-rcnn Mask-Rcnn系列 one-stage(单阶段):YOLO系列 1. one-stage 最核心的优势:速度非常快,适合做实时检测任务! 但是…...

<sa8650>sa8650 qcxserver-之-摄像头传感器VB56G4A驱动开发<1>

<sa8650>sa8650 qcxserver-之-摄像头传感器VB56G4A驱动开发 <1> 一、前言二、QCX架构三、QCX 传感器驱动程序定制开发3.1 sensor硬件接口3.2 sensor配置文件3.2.1 cameraconfig.c3.2.2 cameraconfigsa8650_water.c3.2.3 新增编译MK3.2.4 参数解析3.2.4.1 struct Camera…...

推荐8款超实用的ComfyUI绘画插件,帮助我们的AI绘画质量和效率提升几个档次!

前言 大家在使用SD绘画过程中&#xff0c;想必见识到了插件的强大功能&#xff0c;本身纯净版的SD界面是相对简洁的&#xff0c;但是搭配了各种插件后&#xff0c;界面标签栏会增加很多&#xff0c;相应的功能也增加了。 从简单的中文界面翻译插件&#xff0c;到强大的contro…...

MATLAB-振动问题:两自由度耦合系统自由振动

一、基本理论 二、MATLAB实现 以下是两自由度耦合系统自由振动质量块振动过程动画显示的MATLAB程序。 clear; clc; close allx0 1; D1 40; D12 8; D2 D1; m1 1; omega0 sqrt(D1/m1); k1 D12 / D1; k2 D12 / D2; k sqrt(k1 * k2); omegazh omega0 * sqrt(1 k); omeg…...

人工智能-NLP简单知识汇总01

人工智能-NLP简单知识汇总01 1.1自然语言处理的基本概念 自然语言处理难点&#xff1a; 语音歧义句子切分歧义词义歧义结构歧义代指歧义省略歧义语用歧义 总而言之&#xff1a;&#xff01;&#xff01;语言无处不歧义 1.2自然语言处理的基本范式 1.2.1基于规则的方法 通…...

Spring Boot中的异步编程技巧

Spring Boot中的异步编程技巧 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Spring Boot应用程序中如何使用异步编程技巧&#xff0c;以提升性…...

深度解密Spark性能优化之道

课程介绍 课程通过实战案例解析和性能调优技巧的讲解&#xff0c;帮助学员提升大数据处理系统的性能和效率。课程内容涵盖了Spark性能调优的各个方面&#xff0c;包括内存管理、并行度设置、数据倾斜处理、Shuffle调优、资源配置等关键技术和策略。学员将通过实际案例的演示和…...

在U盘/移动硬盘上安装热插拔式Ubuntu系统,并将Docker目录挂载到NTFS硬盘

Windows10的WSL2的确给开发人员带来了很多方便&#xff0c;但是仍然有很多缺点。比如&#xff1a;太占系统内存&#xff1b;有些软件无法在WSL2中编译成功&#xff1b;相当于虚拟机&#xff0c;性能不如原装系统。 装双系统&#xff0c;相信大家都不陌生&#xff0c;但它会占用…...

商城小程序论文(设计)开题报告

一、课题的背景和意义 近些年来&#xff0c;随着移动互联网巅峰时期的来临&#xff0c;互联网产业逐渐趋于“小、轻、微”的方向发展&#xff0c;符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中&#xff0c;被誉为“运行着程序的网站”之名的微信小程序…...

15. Java的 CAS 操作原理

1. 前言 本节内容主要是对 CAS 操作原理进行讲解&#xff0c;由于 CAS 涉及到了并发编程包的使用&#xff0c;本节课程只对 CAS 的原理问题进行讲解&#xff0c;有助于同学后续对并发编程工具使用的学习。本节具体内容点如下&#xff1a; 了解 CAS 的概念&#xff0c;这是本节…...

修改element-ui日期下拉框datetimePicker的背景色样式

如图&#xff1a; 1、修改背景色 .el-date-picker.has-sidebar.has-time { background: #04308D; color: #fff; border: 1px solid #326AFF } .el-date-picker__header-label { color: #ffffff; } .el-date-table th { color: #fff; } .el-icon-d-arrow-left:before { color: …...

Linux—— 逻辑运算符,压缩和解压缩

- -a&#xff1a; and 逻辑与 - -o&#xff1a; or 逻辑或 - -not&#xff1a; not 逻辑非 - 优先级&#xff1a;与>或>非 shell [rootserver ~]# find / -size 10k -a -size -50k [rootserver ~]# find /etc -name "e*" -o -name "f*"…...

音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

STM32实现按键单击、双击、长按、连按功能,使用状态机,无延时,不阻塞

常见的按键判定程序&#xff0c;如正点原子按键例程&#xff0c;只能判定单击事件&#xff0c;对于双击、长按等的判定逻辑较复杂&#xff0c;且使用main函数循环扫描的方式&#xff0c;容易被阻塞&#xff0c;或按键扫描函数会阻塞其他程序的执行。使用定时器设计状态机可以规…...

C#之Delta并联机械手的视觉同步分拣

本文导读 前面两节课程我们介绍了怎么建立Delta并联机械手的正逆解以及如何通过视觉进行匹配定位。本节课程给大家分享如何通过C#语言开发正运动Delta并联机械手传送带同步的视觉分拣。 VPLC711硬件介绍 VPLC711是正运动推出的一款基于x86平台和Windows操作系统的高性能机器…...

01:Linux的基本命令

Linux的基本命令 1、常识1.1、Linux的隐藏文件1.2、绝对路径与相对路径 2、基本命令2.1、ls2.2、cd2.3、pwd / mkdir / mv / touch / cp / rm / cat / rmdir2.4、ln2.5、man2.6、apt-get 本教程是使用的是Ubuntu14.04版本。 1、常识 1.1、Linux的隐藏文件 在Linux中&#xf…...

GNSS 载波、测距码和导航电文的关系简介

1、GNSS 载波、测距码和导航电文 在卫星导航系统中&#xff0c;载波、测距码和导航电文是构成GPS信号的三个基本组成部分&#xff0c;它们共同工作以实现精确的卫星定位和导航功能。以下是对这三个组成部分的详细介绍&#xff1a; 1. 载波&#xff08;Carrier&#xff09;&…...

deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题

deepE介绍 deepE是一个开源的用于端侧(自动驾驶车,机器人)等环境的系统问题与性能分析工具。基于ebpf功能实现 deepE项目地址 欢迎star 测试程序 #include <iostream> #include <thread> #include <mutex>static std::mutex lock;void func1() {int l…...

ANSYS新能源汽车动力电池仿真应用案例

燃料电池是一种非燃烧过程的电化学能转换装置&#xff0c;将氢气&#xff08;等燃料&#xff09;和氧气的化学能连续不断地转换为电能&#xff0c;是发电设备而非储能设备。 根据电解质的不同&#xff0c;分为碱性燃料电池AFC、磷酸燃料电池PAFC、熔融碳酸盐燃料电池MCFC、固体…...

Linux学习笔记(一)

命令格式 command [-options] [parameter] command&#xff1a;命令名&#xff0c;相应功能的英文单词或单词的缩写 [-options]&#xff1a;选项&#xff0c;可用来对命令进行控制&#xff0c;也可以省略 parameter&#xff1a;传给命令的参数&#xff0c;可以是零个、一个或者…...

qml StackView replace方法

目录 前言 示例代码 main.qml FirstPage.qml SecondPage.qml 解释 运行效果 注意事项 前言 在 QML 中&#xff0c;StackView 提供了一种轻量级的方式来管理页面的导航。除了 push 和 pop 方法&#xff0c;StackView 还提供了 replace 方法来替换当前页面。这个方法可以…...

【算法笔记自学】入门篇(2)——算法初步

4.1排序 自己写的题解 #include <stdio.h> #include <stdlib.h>void selectSort(int A[], int n) {for(int i 0; i < n - 1; i) { // 修正索引范围int k i;for(int j i 1; j < n; j) { // 修正索引范围if(A[j] < A[k]) {k j;}}if (k ! i) { // 仅在…...

与枚举结合的策略模式

枚举类&#xff1a; package com.dtranx.tools.corpora.businessapi.enums;import com.dtranx.tools.commons.vo.EnumResponseVo; import com.google.common.collect.Lists;import java.util.List;/*** ClassName SimpleSearchMode* Description TODO* Date 2024/5/28 15:55* A…...

快递物流运输中的锁控系统优缺点探讨

一、物流运输中锁控系统的重要性 1.1 保障货物安全 在物流运输过程中&#xff0c;货物安全是物流公司最为关注的问题之一。传统机械锁虽然在一定程度上提供了安全保障&#xff0c;但其缺点逐渐暴露&#xff0c;成为物流运输中的一个痛点。 易被破解&#xff1a;传统机械锁通…...

途观LPro:油车智能时代的引领者?

从极为含蓄的“超聪明的油车”发布会主题,到冲上热搜的“最聪明的油车”,5月30日,途观L Pro在成都的上市发布会,成为上汽大众开启“油电同进,油电同智”赛道的新起点。“最聪明的油车”是比较出来的,而非王婆卖瓜。在全网直播的发布会现场,上汽大众总经理贾健旭公布了一…...

Sylvester矩阵、子结式、辗转相除法的三者关系(第二部分)

【三者的关系】 首先&#xff0c;辗转相除法可以通过Sylvester矩阵进行&#xff0c;过程如下&#xff08;以 m 8 、 l 7 m 8、l 7 m8、l7为例子&#xff09;。 首先调整矩阵中 a a a系数到最后面几行&#xff0c;如下所示&#xff1a; S ( a 8 a 7 a 6 a 5 a 4 a 3 a 2 …...

香港优才计划找中介是否是智商税,靠谱中介又该如何找?

关于香港优才计划的申请&#xff0c;找中介帮助还是自己DIY&#xff0c;网络上充斥的声音太多&#xff0c;对不了解的人来说&#xff0c;难以抉择的同时还怕上当受骗。 这其中很容易误导人的关键在于——信息差&#xff01; 今天这篇文章的目的就是想让大家看清一些中介和DIY…...

从动态代理角度简单理解Spring AOP

1. 概述 动态代理 是指在运行时&#xff0c;动态地创建目标类的代理对象&#xff0c;并对其中特定的方法进行拦截或增强的技术。这种技术主要用于在不修改目标类代码的情况下&#xff0c;增强目标类的功能。 在Java中&#xff0c;动态代理主要基于Java的反射机制和接口来实现…...

Flutter 中的 ShrinkWrappingViewPort 小部件:全面指南

Flutter 中的 ShrinkWrappingViewPort 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建跨平台的移动应用。在 Flutter 的布局体系中&#xff0c;ShrinkWrappingViewport 是一个特殊的滚动视图&#xff0c;它…...

【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化-CSDN博客 下一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化-CSDN博客 查询时FROM子句中的表达…...