本文档概述了 Joplin 代码库中的多仓库结构、包组织和依赖管理。有关高级系统架构的信息,请参阅 系统架构。
Joplin 使用 Yarn workspaces 组织成一个多仓库,这允许在保持独立构建和依赖的同时,共同开发多个相关包。
来源:package.json1-121 .eslintrc.js1-322 tsconfig.json1-34 yarn.lock1-102
多仓库的配置位于根目录的 package.json 文件中
根目录包含共享的配置文件
package.json:定义 workspaces 和共享脚本tsconfig.json:基础 TypeScript 配置.eslintrc.js:整个项目的 linting 规则yarn.lock:依赖锁定文件来源:package.json1-121 tsconfig.json1-34 .eslintrc.js1-322 packages/app-desktop/package.json1-211 packages/app-mobile/package.json1-152 packages/app-cli/package.json1-82 packages/lib/package.json1-108 packages/server/package.json1-86 packages/tools/package.json1-71 packages/renderer/package.json1-58 packages/fork-htmlparser2/package.json1-68
来源:packages/app-desktop/package.json1-211 packages/app-mobile/package.json1-152 packages/app-cli/package.json1-82 packages/lib/package.json1-108 packages/server/package.json1-86 packages/tools/package.json1-71 packages/renderer/package.json1-58 packages/fork-htmlparser2/package.json1-68
| 包 | 描述 | 版本 | 主要技术 |
|---|---|---|---|
app-desktop | 基于 Electron 的桌面应用程序 | 3.3.5 | Electron, React, CodeMirror, TinyMCE |
app-mobile | 适用于 iOS 和 Android 的移动应用程序 | 3.3.0 | React Native, Expo |
app-cli | 命令行界面 | 3.3.0 | Node.js, terminal-kit |
客户端应用程序共享一个通用核心,但实现特定于平台的接口。例如,桌面应用程序使用 Electron,并为 Windows、macOS 和 Linux 提供了特定的构建配置。
来源:packages/app-desktop/package.json29-128 packages/app-mobile/package.json1-152 packages/app-cli/package.json1-82
| 包 | 描述 | 目的 | 关键依赖项 |
|---|---|---|---|
lib | 核心业务逻辑 | 数据模型、同步引擎、设置 | sqlite3, fs-extra, node-rsa |
renderer | Markdown/HTML 渲染器 | 笔记渲染 | markdown-it, katex, highlight.js |
editor | 编辑器组件 | 富文本和 Markdown 编辑 | CodeMirror 组件 |
utils | 实用函数 | 共享助手 | 极少的依赖 |
lib 包尤为核心,包含:
来源:packages/lib/package.json1-108 packages/renderer/package.json1-58 packages/editor/package.json1-46
The server 包实现了 Joplin Server 功能,该功能提供:
它使用 Koa.js 作为 Web 框架,并支持 SQLite 和 PostgreSQL 数据库
来源:packages/server/package.json1-86
多仓库中的软件包使用带波浪号前缀的统一版本模式互相引用
这确保了
来源:packages/app-desktop/package.json160-209 packages/app-mobile/package.json23-87 packages/server/package.json24-60
外部依赖项在两个级别进行管理
根级别还包含使用 Yarn 的 resolution 机制修补的依赖项
此机制确保所有包之间的依赖版本一致,并在需要时应用自定义补丁。
来源:package.json72-121 packages/app-desktop/package.json131-210 packages/lib/package.json42-107
根目录下的 package.json 提供了构建所有包的脚本
这些脚本使用 Yarn 的工作区功能来
每个包通常实现
构建流程因包类型而异
来源:packages/app-desktop/package.json7-18 packages/app-mobile/package.json7-21 packages/server/package.json6-22
发布通过专用脚本管理
例如,服务器的发布流程会增加版本号、创建 Git 标签并更新变更日志
来源:package.json42-51 packages/tools/release-server.ts1-29
该项目在所有包中使用 Jest 进行测试
各个包会为其特定需求配置 Jest,测试通常与源文件一起存放。
来源:package.json56-57 packages/lib/package.json15-16 packages/renderer/package.json16-17
该项目使用支持 TypeScript 的 ESLint
TypeScript 文件有额外的规则来强制执行一致的编码模式。
Joplin 项目的 monorepo 结构提供了多项优势
包的组织反映了客户端应用程序、核心库和服务器组件之间的架构分离。依赖管理使用 Yarn 工作区来保持包之间的兼容性,同时允许每个包指定其自己的外部依赖项。
构建系统同时支持带有监视模式的开发工作流程和带有每个平台特定脚本的发布流程。跨代码库的测试和代码检查是标准化的,以确保一致的质量。