大型项目管理神器:掌握yarn monorepo的安装和使用
I. 引言
在当今的前端开发中,由于项目规模的不断增长和多团队协同,Monorepo成为了越来越流行的开发模式。Monorepo指的是将多个相关项目或者模块打包在一起的软件开发模式,它可以让开发人员更好地组织管理代码,减少重复的代码,提高可复用性和开发效率。在前端开发中,使用yarn monorepo能够更好地管理依赖和代码的复用,符合现代Web应用程序开发的趋势。
本文将介绍yarn monorepo的概念和应用场景,并通过实例详细介绍yarn monorepo的安装和使用方法。本文的写作目标主要有以下几点:
1. 帮助读者了解什么是yarn monorepo以及其在前端开发中的作用。
2. 具体介绍如何安装和配置yarn monorepo,包括创建一个新的monorepo、向monorepo中添加包等基本操作的指南。
3. 深度讲解如何管理yarn monorepo中的依赖关系,如何管理yarn monorepo中的库和应用程序以及如何通过monorepo打包部署应用程序等实践操作。
4. 为读者提供实用的建议和技巧,在项目开发过程中更好地使用yarn monorepo。
总之,本文旨在帮助读者了解和掌握yarn monorepo的基本原理和实用技巧,让读者能够更加高效地管理项目中的代码和依赖,从而更好地开发出高质量的Web应用程序。
II. 什么是yarn monorepo
1. 定义
yarn monorepo是一种Monorepo(单仓库)的代码组织方式,通过一个仓库管理多个相关的项目或库,这些项目或库可以是应用程序、库模块、组件等。在monorepo中,项目之间共享相同的代码库,可以实现更高效的代码复用和管理。
2. 特点
(1)便于管理: yarn monorepo中多项目可以共享相同代码库,避免了多个代码库之间不必要的重复。
(2)更好的可维护性: yarn monorepo可以让开发人员更专注于代码,而不是仓库结构、依赖管理等问题。
(3)精简依赖: yarn monorepo依赖管理只需一份,避免了多份依赖库引起的冲突,也避免了多次相同的依赖安装。
(4)更高的可扩展性: yarn monorepo能够随着项目的增长进行扩展,无论是新增项目还是新增业务特性,都可以更加高效地管理。
3. 与其他包管理器的区别
yarn monorepo是一种比较新的Monorepo模式,相较于其他包管理器,它有以下区别:
(1)yarn monorepo可以使用yarn workspaces实现对多个项目或库的管理,而npm和yarn使用linking作为管理方式。
(2)yarn monorepo能够更好地管理代码复用和依赖,由于项目共享代码库,依赖管理更为精简。
(3)yarn monorepo能够更好地管理多个项目之间的相互依赖关系,从而减少重复代码,避免出现冲突和错误。
总之,yarn monorepo作为一个Monorepo模式的代表,它具有更好的管理、可维护性、精简依赖和可扩展性等优势,适合于管理复杂的前端项目或者多个库模块。
III. yarn monorepo的优点和应用场景
1. 优点
(1)减少重复:yarn monorepo可以实现代码复用,让不同项目共享相同的代码库,减少重复编写代码的问题。
(2)便于管理:yarn monorepo能够更好地管理多个项目或模块之间的依赖关系,避免依赖管理冲突的问题。
(3)统一管理: yarn monorepo可以实现统一的依赖管理,同时也可以实现包括构建、测试、发布等操作的自动化集成,统一管理不同项目的开发流程。
(4)维护过程更为简洁: yarn monorepo只需要一个代码库和一个该仓库下的自插件,使维护过程更为简洁明了。
(5)提高开发效率:yarn monorepo极大的化简了繁琐的代码管理流程,优化了代码依赖关系的管理,从而可以提高整个开发过程的效率。
2. 应用场景
(1)多项目共存管理: 对于多个相关的项目,如各模块的功能块、拆分的前端应用程序和后端服务等,可以使用yarn monorepo进行管理。
(2)不同应用程序的多个版本: 对于不同版本的同一应用程序,可以使用yarn monorepo进行管理,可以保证项目中所有相关的应用的版本都保持一致。
(3)多个库模块共存使用: 对于多个库模块,可以使用yarn monorepo管理,让不同项目共享相同的代码库,减少代码复制的问题。
总之,yarn monorepo适用于管理庞大、多项目或者多库模块的前端项目,可以提高代码复用、减少重复代码和依赖管理冲突等管理问题,同时也可以提高整个开发过程的效率。无论是对于大型应用,还是对于团队协作等场景,使用yarn monorepo都可以让开发过程更加简单和高效。
IV. 安装 yarn monorepo
1. yarn monorepo的安装方法
yarn mon ore po是yarn的扩展,是一个针对monorepo模式的包管理工具。yarn本身可以执行替代npm的操作,并提供了更好的性能和功能。为了安装yarn monorepo,需要先安装yarn:
全局安装yarn命令:
shell
npm install -g yarn
由于yarn monorepo并不是yarn的默认功能,因此我们需要安装yarn workspaces插件。这可以通过使用以下命令来安装:
yarn global add workspaces
2. 全局和本地安装的优缺点
全局安装yarn monorepo可以让您在任何地方使用它,无论在哪里都可以使用此插件。然而,这种方法通常需要使用sudo权限,可能会影响您的系统或开发环境的其他部分。
另一方面,本地安装yarn monorepo可以使安装过程更加方便。这种方式通常需要创建一个新的yarn项目,然后在本地这个项目的目录下安装yarn monorepo。这种做法不会对全局系统造成任何影响,但它也意味着在每个新项目中都必须用相同的依赖项重复一遍。
3. 安装实现方式
接下来,我们将介绍如何在项目中安装yarn monorepo。
(1)在新项目中安装yarn monorepo
a. 首先需建立一个新项目的目录,例如my-project。
b. 在my-project目录中生成一个新的yarn项目:
yarn init -y
c. 通过以下命令安装yarn monorepo:
yarn add -D workspaces
d. 修改my-project目录下的package.json文件来开启yarn workspaces:
{"name": "my-project","private": true,"workspaces": ["packages/*"]}
这里workspaces后面的值是指在my-project目录下的packages文件夹下存放所有的monorepo项目。
(2)在现有项目中添加yarn monorepo
如果您的项目已经存在,可以按以下步骤添加yarn monorepo:
a. 进入项目的根目录。
b. 在package.json中添加workspaces设置:
{..."workspaces": ["packages/*"],...}
这里的packages路径需要修改以符合您文件结构的实际情况。
c. 运行以下命令安装yarn monorepo:
yarn add -D workspaces
总之,安装yarn monorepo可以让您充分利用monorepo中的最佳做法,可以更好地管理一个大型仓库中的依赖关系。通过将所有中的相关项目都放在同一个代码库下,可以使整个开发流程更为轻松。
V. 创建 yarn monorepo
在创建一个新的 yarn monorepo 之前,需要先明确你的项目类型和结构,以确保创建一个可维护和易于管理的项目结构。在本部分中,我们将介绍如何创建一个完整的 yarn monorepo,包括如何创建基础目录结构和如何配置文件。你可以根据你的实际情况和项目要求进行自定义和调整。
1. 创建基础目录结构
在创建新的 yarn monorepo 之前,需要先创建一个存储所有模块和包的文件夹。你可以为文件夹选择任何名称,但建议使用“packages” 或 “modules”。
- project-root- packages
在 packages 目录下创建多个文件夹以表示不同的包,每个文件夹代表一个单独的 npm 包。在每个文件夹中,都需要包含一个 package.json 文件,用于作为每个单独的 npm 包的明细配置。以下是基础目录结构:
- project-root- packages- package-1- package.json- src- package-2- package.json- src
2. 配置文件
为了让 yarn 知道你的项目是一个 monorepo,你需要在你的项目根目录中添加一个 workspace 选项列表。该文件必须命名为 package.json,所以你需要编辑该文件来包含 workspaces。
{"name": "project-root","version": "0.0.0","private": true, // 这里是告诉yarn,这不是一个公开的npm包"workspaces": ["packages/*"]
}
这段代码中workspaces列表表示了所有在 packages 文件夹下的 npm 包被视为与父文件夹同一级别,覆盖了 npm 的默认层次结构。
在每个子文件夹(每个单独的npm包)中,都需要包含一个 package.json 文件,其中包含模块的名称、版本等详细信息。
3. 自定义项目
可以根据项目的具体情况和要求自定义 yarn monorepo。例如,如果您希望在单一的 git 存储库中维护其他资源,如文档或演示,请在项目根目录下添加一个名为 docs(或demo)的文件夹,并在 package.json 文件的工作空间列表中包含该文件夹。
你可以完全自定义项目的目录结构和配置文件,只需要在 package.json 文件中声明您选择的目录。
总之,创建 yarn monorepo 将利用 monorepo 提供的最佳实践,从而更好地管理大型仓库中的依赖关系。此外,将所有相关的项目都放在同一个代码库中,可以让整个开发流程更加简单。你可以根据你的实际情况和项目要求进行自定义和调整,灵活应对不同的开发场景和要求。
VI. 添加包
向 monorepo 中添加不同类型的包,包括应用程序和库模块,通常需要执行以下步骤:
1. 创建一个新的包(模块)
使用以下命令创建一个新的包(模块):
yarn workspace package-name init
这会在 monorepo 的 packages 文件夹中创建一个新的文件夹 package-name,并在其中创建一个新的 package.json 文件。
2. 添加依赖项
添加需要的依赖项和开发依赖项:
yarn workspace package-name add <package-name> // 添加新的依赖
yarn workspace package-name add -D <package-name> // 添加新的开发依赖
对于 monorepo,我们可以在根目录下的 package.json 文件中添加各种依赖,并在每个包(模块)的 package.json 文件中指定包的特定依赖项。
3. 编写应用程序或库
- 应用程序(Application)
编写应用程序时,可以使用任何您想要的框架。在包(模块)的 src 文件夹中编写代码,并将其编译到 public 文件夹中。您可以使用 webpack 或其他编译器,将 src 中的代码打包到 public 文件夹中,供浏览器使用。
例如,在 monorepo 中创建 React 应用程序:
yarn workspace my-react-app add react react-dom
在 src/index.js 中编写 React 代码,将其打包并写入 public 文件夹中。
- 库模块(Library)
作为库模块,我们可以为他们指定通用的入口或模块输出。可以在 package.json 中添加以下内容:
{"main": "dist/index.js","types": "dist/index.d.ts","files": ["dist"],// ...
}
使用 Rollup 或 Webpack 等构建工具将源文件打包在一起并输出到 dist 文件夹中。
比如,在 monorepo 中提供一个脚手架库:
yarn workspace my-tool add chalk commander
在 src/index.js 中编写库代码,将其打包,并将 dist 中的代码作为引用。
4. 安装包(模块)
由于 monorepo 使用了本地文件路径来引用包(模块)之间的依赖,我们不能直接使用 npm install 命令来安装 monorepo 中的依赖。
为了安装 monorepo 中的包(模块),我们需要使用 yarn 和 workspaces 库。可以通过以下命令安装 monorepo 中的所有依赖项:
yarn install --check-files
或者,可以只安装特定的包或模块:
yarn workspace package-name install
也可以安装所有的包和模块:
yarn install
总之,向 monorepo 中添加不同类型的包(模块)需要执行上述步骤。具体来说,需要创建一个新的包(模块)、添加依赖项和开发依赖项、编写应用程序或库,最后使用像 yarn install 这样的命令来安装这些包。这个流程有助于构建一个自包含和灵活的 monorepo,提高代码复用率和开发效率。
VII. 管理依赖
在 monorepo 中管理依赖关系非常重要,因为它可以防止依赖冲突和重复安装依赖项。当项目规模较大时,依赖管理可为大型代码库的开发和维护带来显著的效率提升。
yarn 提供了名为 workspaces 的特性,使得同时安装和管理多个包的依赖项成为可能。workspaces 将整个 monorepo 视为统一的 packages 子目录,从而能够跨越整个 monorepo 检测并安装依赖项。
以下是如何使用 yarn workspaces 来管理各个包之间的依赖关系:
1. 新建 monorepo
首先,需要新建一个 monorepo。如前所述,在 monorepo 根目录和文件夹中创建一个 package.json 文件,并在其中添加 workspaces 字段。
{"name": "my-monorepo","private": true,"workspaces": ["packages/*"]
}
2. 安装依赖项
要安装依赖项,我们可以使用通常的 yarn add 命令,在 package.json 文件中添加依赖项。然后运行 `yarn install` 命令会安装 monorepo 所有包的依赖项,并对所有包进行扫描。这样每个包就都可以使用 monorepo 内安装的任何依赖项。
注意要使用 workspaces 特性指定本地依赖,将其指定为 "link: ../path-to-dependency" 的形式。这样可以保证 monorepo 内的所有包都使用同一个依赖项版本。
{"dependencies": {"dependency-1": "link: ../path-to-dependency-1","dependency-2": "link: ../path-to-dependency-2"}
}
3. 避免重复安装
在使用 monorepo 时,我们需要注意避免重复安装依赖项。为此,我们可以使用 yarn workspaces 命令。
可以使用 yarn workspaces info 命令查看 monorepo 中各个包的依赖项信息。使用 yarn workspaces list 命令可以查看 monorepo 中所有包及其依赖项的列表。
如果需要列出所有已安装的依赖项的详细信息,则可以运行 yarn workspaces info --json。这会显示出 monorepo 中所有包的所有依赖项的详细信息。
4. 手动控制依赖
当 monorepo 中包含第三方依赖项且不同包之间需要使用不同的依赖项版本时,需要手动控制依赖项。
我们可以使用 yarn resolutions 来强制 monorepo 中所有包都使用相同版本的依赖项。例如,以下代码示例强制使用 lodash 4.x 版本:
{"resolutions": {"lodash": "4.x"}
}
总之,使用 yarn workspaces 可以轻松管理 monorepo 中各个包之间的依赖关系。通过使用 workspaces 功能,可以更轻松地处理 monorepo 中的依赖项,从而避免重复安装依赖和依赖冲突,提高开发和维护效率。为了避免手动控制依赖,确定每个依赖项的版本并通过 resolutions 配置指定依赖项的版本也是一个解决方案。
VIII. 线上发布
部署 monorepo 项目需要经过多个步骤,包括构建、编译、打包、部署和最终运行。这些步骤需要根据项目的需求进行自定义和调整,以确保在线上环境中成功部署项目。
1. 构建/编译/打包
在将 monorepo 项目部署到生产环境之前,需要针对每个子包执行构建、编译或打包等任务,以生成可在生产环境中运行的代码和资源。
例如,在部署 Node.js 包时,需要使用 babel 或 TypeScript 编译器对代码进行打包、编译或转换。另外,还需要将代码、依赖项和运行时资源打包成一个唯一的文件或集合,例如使用 webpack 或 rollup 等打包工具。
2. 部署
一旦完成构建和打包任务,可以将生成的代码部署到线上服务器或云环境。对于 Node.js 包,可以使用 pm2 等进程管理器来启动和管理 monorepo 项目。
对于 Web 应用程序和库模块,可以使用容器化平台,例如 Docker 和 Kubernetes,来部署和运行 monorepo 项目。在使用容器化平台时,可以轻松部署和升级 monorepo 项目,并将其扩展到多个节点,从而实现高可用性和性能。
3. 运行
一旦 monorepo 项目成功部署并在生产环境中运行,可以通过 Web 浏览器或 API 请求来访问它。在生产环境中,需要对 monorepo 项目进行测试和监视,以确保其稳定运行和高性能。
总之,部署 monorepo 项目是一个包含多个步骤的复杂过程。需要针对每个子包执行构建、编译或打包等任务,并使用 pm2 或 Docker 等工具部署代码到线上服务器或云平台中。最终需要对 monorepo 项目进行测试和监视,以确保其稳定运行和高性能。在整个部署过程中,需要不断调整和优化项目,以最大程度地实现其性能和效率优势。
IX. 总结
本文主要介绍了如何使用 yarn monorepo 来构建、管理和部署具有多个包或模块的项目。我们讨论了 monorepo 的优势及其在大型项目开发中的应用。我们还介绍了如何设置 monorepo 项目,并详细描述了如何管理依赖关系、添加子包、构建和部署项目。在本文中,我们还讨论了 monorepo 的最佳实践,以及如何实际应用这些技术来提高代码库的维护和开发效率。 最后,本文提出了一些建议,以帮助您在使用 monorepo 时获得最佳体验:
1. 确认 monorepo 是否适合您的项目:在决定使用 monorepo 前,需要确认 monorepo 是否适合您的项目。如果您的项目包含多个紧密关联的包或模块,并且需要在这些包之间进行频繁的代码重用和依赖管理,则 monorepo 是一个不错的选择。
2. 确保清晰的单一职责原则:为了确保 monorepo 的成功,每个包或模块应如清晰的单一职责原则一样,具有特定的功能或用途。这可以帮助简化对代码库的理解和管理。
3. 使用工具集优化开发流程:使用 monorepo 有助于提高代码复用率和开发效率,但在实际操作中,需要使用适当的工具来优化开发流程。 例如,使用 ESLint、Prettier 和 TypeScript 等工具来提高代码规范和可读性,并使用自动化工具(如流水线和部署流程)来简化开发流程。
4. 遵循最佳实践:为了从 monorepo 中获得最大收益,需要遵循最佳实践,例如限制使用共享状态、避免复杂的跨包依赖关系等。应该在使用 monorepo 时保持灵活,并根据项目需求进行适当调整和改进。
总的来说,yarn monorepo 是一个强大的工具,可以帮助开发人员在大型项目中快速构建和管理多个包或模块。通过使用 monorepo,可以提高代码复用率和开发效率,并使代码库更易于理解、维护和扩展。为了从 monorepo 中获得最大收益,需要遵循最佳实践,并在实际应用中进行适当调整和改进。
X. 参考文献
1. "A Beginner's Guide to Yarn Workspaces for Monorepos." Pusher Blog, 3 Oct. 2019, pusher.com/tutorials/yarn-workspaces-monorepo.
2. "Develop Your Web Development Projects Faster with Yarn Workspaces." Auth0 Blog, 11 Mar. 2019, auth0.com/blog/develop-your-web-development-projects-faster-with-yarn-workspaces.
3. "Monorepos - Yarn Workspaces and Lerna.js." Dev.to, 20 Jan. 2020, dev.to/greenbrandonc/monorepos-yarn-workspaces-and-lerna-js-1845.
4. "Yarn Workspaces - Lerna Alternative for Monorepo." Codeburst, 22 May 2019, codeburst.io/yarn-workspaces-lerna-alternative-for-monorepos-2d05f3fd6be2.
5. "Managing Monorepos with Lerna & Yarn Workspaces." Carbon Five, 6 Sept. 2018, carbonfive.com/blog/managing-monorepos-with-lerna-yarn-workspaces.
6. "Yarn Workspaces Documentation." Yarnpkg.com, yarnpkg.com/features/workspaces.
7. "Lerna.js Documentation." Lerna.js.org, lerna.js.org.
8. "Monorepos: Why You Should Consider Them for Your Project." Smashing Magazine, 1 Nov. 2018, smashingmagazine.com/2018/11/monorepos-in-git-and-packages.
相关文章:
大型项目管理神器:掌握yarn monorepo的安装和使用
I. 引言 在当今的前端开发中,由于项目规模的不断增长和多团队协同,Monorepo成为了越来越流行的开发模式。Monorepo指的是将多个相关项目或者模块打包在一起的软件开发模式,它可以让开发人员更好地组织管理代码,减少重复的代码&am…...
算法打卡day28|贪心算法篇02|Leetcode 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II
算法题 Leetcode 122.买卖股票的最佳时机 II 题目链接:122.买卖股票的最佳时机 II 大佬视频讲解:买卖股票的最佳时机 II视频讲解 个人思路 因为只有一只股票,且两天作一个交易单元,那每次只收集正利润就可以最终最多可以获取的利润…...
2013年认证杯SPSSPRO杯数学建模A题(第一阶段)护岸框架全过程文档及程序
2013年认证杯SPSSPRO杯数学建模 A题 护岸框架 原题再现: 在江河中,堤岸、江心洲的迎水区域被水流长期冲刷侵蚀。在河道整治工程中,需要在受侵蚀严重的部位设置一些人工设施,以减弱水流的冲刷,促进该处泥沙的淤积&…...
【3】3道链表力扣题:删除链表中的节点、反转链表、判断一个链表是否有环
3道链表力扣题 一、删除链表中的节点🌏 题目链接📕 示例🍀 分析💻 代码 二、反转链表🌏 题目链接📕 示例🍀 分析① 递归② 迭代 三、判断一个链表是否有环🌏 题目链接📕 …...
mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(上)
一、背景 常见的mongodb集群模式有以下三种: 主从复制(Master-Slave)模式副本集(Replica Set)模式分片(Sharding)模式 公司测试环境搭建的集群采用分片模式,有同事反馈说…...
苹果Mac OS系统上安装brew
1.命令行安装brew Homebrew是 mac的包管理器,仅需执行相应的命令,就能下载安装需要的软件包,可以省掉自己去下载、解压、拖拽(安装)等繁琐的步骤。 a. 打开HomeBrew官网:https://brew.sh/index.html b. 点击页面上的复制按钮,打…...
应用侧渲染流程
应用侧渲染流程 《Android应用程序UI硬件加速渲染环境初始化过程分析》 https://blog.csdn.net/Luoshengyang/article/details/45769759 《Android HWUI绘制流程》 https://wizzie.top/android/android_HWUI_Draw/#1-gpu%E6%B8%B2%E6%9F%93%E7%A1%AC%E4%BB%B6%E5%8A%A0%E9%…...
学生党开放式运动耳机怎么选?五款超高销量高性价比品牌推荐
开放式运动耳机成为了许多人的运动首选装备,想要在众多的开放式耳机中找到一款价格亲民,且性能在线高性价比的开放式运动耳机可并非那么简单,所以今天我就来为大家推荐五款超高销量、高性价比的运动耳机品牌。 在推荐之前,整理了…...
服务器中有g++,但是查询不到,Command ‘g++‘ not found
有gcc但是查询不到g,gcc版本为9.5.0 (base) zyICML:~$ g -V Command g not found, but can be installed with: apt install g Please ask your administrator. 突然就出现这个问题,导致detectron装不上,现在有时间了专门研究下怎么解决 这…...
count(“0“),split() ,sys.stdin.readline() ,matrix.append, input().strip()
目录 count() 方法主要用于计算一个序列(例如列表、元组或字符串)中某个元素出现的次数...
Flink on Kubernetes (flink-operator) 部署Flink
flink on k8s 官网 https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.1/docs/try-flink-kubernetes-operator/quick-start/ 我的部署脚本和官网不一样,有些地方官网不够详细 部署k8s集群 注意,按照默认配置至少有两台wo…...
代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
122.买卖股票的最佳时机II - 🔗 讲解 - 🔗 方法一: 💡这道题自己想到的办法没有解析那么清晰,大致思路就是第一步先找到第一个可以买进的时间(也就是第一个prices[i] < prices[i 1]的i)&…...
常见数据库分类介绍及其适用场景
一、引言 数据库是指在计算机系统中,为了结构化地管理和存储数据而建立起来的一种数据管理系统。它以高效、安全和可靠的方式存储和管理用户所需的各种数据,并提供了强大的数据处理和查询功能。随着信息技术的不断发展,数据库已经成为现代计…...
周末总结(2024/03/30)
工作 接受破烂现状,改变状态 上周一周的工作都感觉是摸鱼状态,每天只有三个小时左右的时间聚焦在工作上,其他时间都在胡思乱想。但是我发现可以在工作中学习和下班相关的技术栈。我无意改变自己的工作状态,只想在5月底找好下家然后…...
(75)爬楼梯
文章目录 1. 每日一言2. 题目2.1 解题思路2.1.1 递归2.1.2 记忆化搜索2.1.3 动态规划2.1.4 动态规划空间优化 2.2 代码2.2.1 递归2.2.2 记忆化搜索2.2.3 动态规划2.2.4 动态规划空间优化 3. 结语 1. 每日一言 Happy life lies in a peaceful mind. 幸福的生活存在于心绪的宁静…...
ttkbootstrap界面美化系列之Notebook(四)
在简单的界面设计中,Notebook也是常用的组件之一,Notebook组件的引入可以根据标签来切换不同的界面。使得界面更有层次感,不必都挤在一个界面上。在tkinter中就有Notebook组件,在ttkbootstrap中,同样也对Notebook进行了…...
MySQL8存储过程整合springboot
注意:调用使用mybatis-plus3形式调用,可能会有些区别 1. 创建存储过程 -- -- 生成员工工号的存储过程 DELIMITER $$ CREATE PROCEDURE generate_employee_number(OUT employeeNumber VARCHAR(20)) -- 解释 out 一个返回值 BEGINDECLARE prefix VARCHAR…...
Acwing 1238.日志统计 双指针
小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 N� 行。 其中每一行的格式是: ts id 表示在 ts 时刻编号 id 的帖子收到一个”赞”。 现在小明想统计有哪些帖子曾经是”热帖”。 如果一个帖子曾在任意一个长度为 D 的…...
Matlab-R2022b-安装文件分享
一、MATLAB主要特点和功能 MATLAB是一款强大的科学计算软件,专门用于算法开发、数据分析、数值计算以及科学数据可视化。 以下是一些MATLAB的主要特点和功能: 1.矩阵运算: MATLAB的名字来源于"Matrix Laboratory"(矩阵实验室&…...
Flutter开发之objectbox
Flutter开发之objectbox 在之前进行iOS开发的时候使用WCDB去进行管理数据库很方便,它支持ORM(Object-Relational Mapping,对象关系映射),用于实现面向对象编程语言里不同类型系统的数据之间的转换。 那么在Flutter开发…...
AI Drug Discovery Design(学习路线)
AIDD,即AI Drug Discovery & Design,是近年来非常火热的技术应用,已经介入到新药设计到研发的大部分环节当中,为新药发现与开发带来了极大的助力。其学习路线涉及多个学科和领域的知识。以下是一个可能的AIDD学习路线…...
【软考】设计模式之状态模式
目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. java示例6.1 非状态模式6.1.1 问题分析6.1.2 接口类6.1.2 实现类6.1.3 客户端6.1.4 结果截图 6.2 状态模式6.2.1 抽象状态类6.2.2 状态类6.2.3 上下文类6.2.4 上下文类 1. 说明 1.允许一个对象在其内部状…...
MNN介绍、安装与编译:移动端深度学习推理引擎
MNN介绍、安装与编译:移动端深度学习推理引擎 引言第一部分:MNN简介第二部分:MNN的安装第三部分:MNN的编译结语 引言 大家好,这里是程序猿代码之路。在移动设备上实现高效的深度学习模型推理一直是人工智能领域的一个挑…...
A Simple Problem with Integers(线段树)
目录 描述 输入 输出 样例输入 样例输出 思路 建树 第一次错误解法(正确解法在下面,可跳过这一步) 正确解法 code 描述 You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of …...
单元测试(UT)用例简介
单元测试(Unit Testing, UT)用例是一系列预先设计好的、针对软件最小可测试单元的测试场景。每一个单元测试用例都是为了验证一个独立代码单元(如函数、方法、类)的行为是否符合预期。这些用例通常包含以下几个关键组成部分&#…...
Java通过反射机制获取类对象下的属性值
目录 以类USER为例: 使用Java的反射机制获取Column的name为“user_name”的类属性值 以类USER为例: import lombok.Data; import javax.persistence.*; import java.io.Serializable;Data Table(name "user_info") public class User imple…...
IDEA插件开发-File -> New->Project中添加一个myOptions
写一个IDEA插件,在IDEA的File -> New -> Project 中添加一个选项myOptions ,点击myOptions 后弹出一个提示对话框:被点击了 为了在IntelliJ IDEA中创建一个插件,您需要遵循一系列的步骤来开发和集成您的功能。下面是一个简化的指南&am…...
海量数据处理项目-账号微服务和流量包数据库表+索引规范(下)
海量数据处理项目-账号微服务和流量包数据库表索引规范(下) 第2集 账号微服务和流量包数据库表索引规范讲解《下》 简介:账号微服务和流量包数据库表索引规范讲解 账号和流量包的关系:一对多traffic流量包表思考点 海量数据下每…...
Nodejs 16与 gitbook搭建属于你自己的书本网站-第一篇
最近想重新搭建一个网站来存放自己的相关知识点,并向网络公开,有个hexo博客其实也不错的,但是总感觉hexo很多花里胡哨的玩意,导致挂载的博客异常卡,这样反而不利于我自己回顾博客了,于是我就开始钻研这个鬼…...
服务器被CC攻击之后怎么办?
1.取消域名绑定取消域名绑定后Web服务器的CPU能够马上恢复正常状态,通过IP进行访问连接一切正常。但是不足之处也很明显,取消或者更改域名对于别人的访问带来了不变,另外,对于针对IP的CC攻击它是无效的,就算更换域名攻…...
提高网站百度权重/北京网络网站推广
最近遇到一个面试的问题,面试官问我给我一个Java类你怎么判断它是否是线程安全?有那些角度可以判断它是否安全? 我当时回答: 我说看 临界资源是否被抢夺,是否用到锁 如果这个类在单线程下跑出的结果 和在多线程下跑出…...
wordpress置顶精华图标/推广引流
本套文章是Java8官方GC调优指南的全文翻译,点击查看原文,原文章名称《Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide》4 Sizing the Generations 设置分代大小下图描述了堆内存已提交空间和虚拟空间的区别。在JVM启动初…...
wordpress iframe页面/35个成功的市场营销策划案例
http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找。 PerferenceActivity是什么,看下…...
jsp做的网站后台信息/东莞网站制作十年乐云seo
先说说es5的循环,一下几种循环的前五种接收的参数是一样的,都是两个参数: 第一个参数:循环里面执行的回调函数,循环调用执行的语句 第二个参数:this的指向 循环中回调函数的参数有三个: 第一个参…...
网站建设seo优化方案/百度收录提交
亲测可用 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2 企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV...
商务网站建设实训报告/公司网络营销实施计划
单件模式,也称单例模式,用以创建独一无二的、只能有一个实例的对象。单件模式的类图是所有模式的类图中最简单的——只有一个类。尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重对这一点来进行分析…...