贡献指南
NoteGen 是一个开源且免费的社区项目,我们将持续为爱发电,并接受任何形式的贡献。
Hi! 非常感谢你参与 NoteGen 的贡献!在此之前,请花一些时间阅读以下内容:
如何贡献
不论是贡献代码还是提交问题,都应该先创建 Issue。
Issues
请始终使用 Issues 创建新问题,尽量详细描述问题,包括重现步骤、预期行为和实际行为。
Discussions
如果你想发起讨论,可以使用 Discussions,或加入 交流群。
Pull Request
技术栈
NoteGen 主要用到以下几个技术栈:
-
查看 package.json 中前端依赖包。
-
查看 src-tauri/Cargo.toml 中 Rust 依赖包。
如果你本次贡献需要更新或添加依赖,请在 issue 中添加 package.json
或 src-tauri/Cargo.toml
的更新说明。
开发环境
请先阅读 Tauri 2 前置要求 文档,按照文档要求配置开发环境。
环境装好后,fork 仓库到你的 GitHub 账号下,然后克隆到本地:
# 1. fork 到你的 GitHub 账号下
# 2. 克隆到本地
git clone https://github.com/your-username/note-gen.git
然后进入项目目录,安装依赖:
# 3. 进入项目目录 & 安装依赖
cd note-gen
pnpm install
# 4. 启动本地开发,如果遇到白屏情况,尝试右键 reload。
pnpm tauri dev
目录说明
src
:前端应用目录。apps
:前端应用目录。core
:主应用核心功能目录。article
:写作。image
:图床管理。record
: 记录。search
:搜索。setting
:设置。
screenshot
:截图窗口。
components
:组件目录,shadcn 和通用组件。lib
:常用工具库,例如 ai、github 请求等。db
:SQLite 数据库。store
:状态管理目录,采用 zustand。
src-tauri
:Rust 代码目录。messages
:多语言配置目录。
Pull Request 指南
NoteGen 未使用 master 或 main 分支,一切发开都在 dev 分支下进行,通过合并到 release 分之后触发 Github Action 进行版本发布和构建。
Fork 仓库后,请使用 dev 分支创建一个新的分支,命名为本次贡献的名称,例如 fix/123
或 feat/121
。
你可以多次提交代码,直到完成所有修改,在提交 Pull Request 时,我们会通过 Squash and Merge
合并成一个提交。
请在 PR 标题中添加 fix(#xxx): ***
或 feat(#xxx): ***
,#xxx 是 issue 编号,例如 NoteGen 更新计划 #46。
在提交 PR 前,确保本地运行 pnpm tauri build
可以正常构建及运行。
开发指南
本章节将介绍如何快速上手 NoteGen 的开发。
DeepWiki
你可以通过 AI 生成的文档 DeepWiki 来快速学习 NoteGen 的开发文档。
项目环境搭建
请先阅读 Tauri 2 前置要求 文档,按照文档要求配置开发环境。
通过 pnpm tauri dev
可以启动本地开发,如果遇到白屏情况,尝试右键 reload。
项目构建
桌面端
通过 pnpm tauri build
可以构建桌面端应用,注意此时会根据你的系统构建相应的安装包。
默认情况下是通过 Github Action 自动构建的,通过发布 release 分支时触发,通常会修改 src-tauri/tauri.conf.json
中的版本号。
Android
要构建 Android 应用,首先运行 pnpm tauri android init
。
然后阅读 Tauri 2 Android 签名 文档,按照文档要求创建签名 key。
在 src-tauri/gen/android
目录下创建 keystore.properties
文件,内容如下:
storePassword=**
keyPassword=**
keyAlias=**
storeFile=/**/Downloads/upload-keystore.jks
在 src-tauri/gen/android/app/build.gradle.kts
中添加一下代码:
import java.io.FileInputStream
android {
signingConfigs {
create("release") {
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
}
最后可以通过 pnpm tauri android build --apk --split-per-abi
构建不同 Android 架构的 APK。