ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Komi Store 开发者贡献指南:从本地构建到落地合入 PR 的完整实践

Komi Store 开发者贡献指南:从本地构建到落地合入 PR 的完整实践 移动开发桌面应用【免费下载链接】komi-store A free, open-source app store for developers releases on GitHub, Codeberg Forgejo — browse, discover, and install apps with one click. Formerly GitHub Store.项目地址https://gitcode.com/gh_mirrors/git/komi-store点击查看免费下载Komi Store曾用名 GitHub Store是一款基于 Kotlin Multiplatform Compose Multiplatform 构建的开源应用商店面向 GitHub、Codeberg 与 Forgejo 上开发者发布的 Release提供浏览、发现与一键安装能力。本文以仓库根目录的 CONTRIBUTING.md 为骨架结合仓库源码与构建配置系统讲解如何从零开始为该项目贡献代码包含环境搭建、常用 Gradle 命令、项目结构、编码规范、分支与提交风格、Pull Request 流程、多语言翻译以及发布节奏帮助贡献者快速上手并顺利落地第一个合入的变更。参与贡献的方式不写代码也能帮上忙官方指南列出的途径包括报告 Bug可复现的 Bug 报告最好附带日志价值最高。建议功能先以 Issue 描述用户侧遇到的问题实现方案可以在讨论中展开。整理 IssueTriage复现未解决的 Bug、补充缺失信息、打标签。写代码认领标记为good first issue或help wanted的 Issue。翻译字符串项目支持 13 种语言详见下文「翻译」一节。测试预发布版本关注仓库新打的 tag 并实际试用。需要说明的是本文规则面向的是客户端应用本体composeApp所在的仓库如果目标是贡献兄弟仓库backend 或 api应参考各自仓库的贡献说明。如何报告 Bug官方提供两条路径应用内报告Profile → Send feedback。该入口会自动填充应用版本、平台与安装方式选择邮件或 GitHub Issue 渠道即可完成提交。在 GitHub 上打开 Bug 报告模板说明现象、复现步骤与你的环境日志和截图有助于定位但不强制。日志在哪里Androidadb logcat | grep zed.rainxch.githubstore应用包名为zed.rainxch.githubstore见 gradle/libs.versions.toml 中的projectApplicationId。桌面端macOS~/Library/Logs/GitHub-Store/session.logWindows%LOCALAPPDATA%/GitHub-Store/logs/session.logLinux$XDG_STATE_HOME/GitHub-Store/logs/session.log桌面日志的落盘机制可以在源码中印证composeApp/src/jvmMain/kotlin/zed/rainxch/githubstore/CrashReporter.kt 在启动时DesktopApp的main第一行通过TeePrintStream把 stdout/stderr 同步写入session.log并在日志超过 5MB 时轮转为session.1.log同时通过Thread.setDefaultUncaughtExceptionHandler捕获未处理异常在会话日志旁写出crash-yyyyMMdd-HHmmss-SSS.log。也就是说「会话日志 崩溃转储」是一对配套产物提交 Bug 时最好一起提供。如何建议功能打开功能请求 Issue 时先讲「痛点」而非「方案」你正在做什么、应用在哪些方面不满足需求。对于较大的想法新页面、新平台支持、架构级调整官方建议先开 Issue 并等待一轮讨论再动手写代码避免返工。本地开发环境搭建环境要求依赖要求说明JDK21推荐 Temurin需正确设置JAVA_HOMEAndroid StudioHedgehog 或更新版本需安装 Kotlin Multiplatform 插件Android SDKtarget API 36、min API 26构建 Android 产物所需Git已配置 username/email提交与分支操作所需min/target SDK 在 gradle/libs.versions.toml 中定义为projectMinSdkVersion 26、projectTargetSdkVersion 36与文档一致。一次性初始化git clone https://github.com/kurikomi-labs/komi-store.git cd komi-store在仓库根目录创建local.propertiessdk.dir/path/to/Android/sdk GITHUB_CLIENT_IDyour-oauth-client-id-or-leave-blank-for-local其中GITHUB_CLIENT_ID仅在你想本地测试 GitHub OAuth device-flow 登录时才需要填写其余功能不依赖它即可运行。常用 Gradle 命令# Android debug 构建 ./gradlew :composeApp:assembleDebug # Android release 构建需要在 local.properties 中配置签名 ./gradlew :composeApp:assembleRelease # 桌面端开发模式运行 ./gradlew :composeApp:run # 桌面端安装包 ./gradlew :composeApp:packageExe :composeApp:packageMsi # Windows ./gradlew :composeApp:packageDmg :composeApp:packagePkg # macOS ./gradlew :composeApp:packageDeb :composeApp:packageRpm # Linux # 全量构建检查编译 lint ./gradlew build # 格式检查ktlint ./gradlew ktlintCheck # 自动格式化 ./gradlew ktlintFormat首次构建会拉取大量依赖后续构建会复用 Gradle 构建缓存。缓存配置可以在 gradle.properties 中看到org.gradle.cachingtrue、org.gradle.paralleltrue、org.gradle.configuration-cachetrue均已开启并设置了 4GB Gradle 堆与 3GB Kotlin daemon 堆。桌面安装包的 target format 是在 composeApp/build.gradle.kts 的compose.desktop.application块中按当前操作系统动态选择的Windows 产出Exe/MsimacOS 产出Dmg/PkgLinux 产出Deb/Rpm按仓库源码还可生成AppImage。Linux 安装包还会读取projectVersionName作为appRelease与debPackageVersion。项目结构官方文档给出的顶层布局如下与仓库实际一致composeApp/ # 主应用入口 导航 core/ domain/ # 仓储接口、模型、用例 data/ # 仓储实现、Ktor、Room、DI presentation/ # 共享主题 可复用 Compose 组件 feature/ apps/ # 已安装应用管理 auth/ # GitHub OAuth device flow details/ # 仓库 Release 详情 dev-profile/ # 开发者 / 用户资料 favourites/ # 收藏 home/ # 发现trending / hot / popular profile/ # 用户资料、设置、外观 search/ # 带过滤条件的搜索 starred/ # Star 的仓库 build-logic/convention/ # 自定义 Gradle convention 插件每个feature/name/通常包含最多三个子模块domain/、data/、presentation/。部分功能如favourites、starred、recently-viewed是纯 presentation 模块直接消费 core 层的仓储。这一分层在 settings.gradle.kts 的include(...)列表中有完整映射新增模块时需要同步在此注册。架构的完整说明见 CLAUDE.md各 feature 的专属说明见feature/name/CLAUDE.md如 feature/apps/CLAUDE.md、feature/auth/CLAUDE.md、feature/tweaks/CLAUDE.md。编码规范项目使用 Kotlin 官方代码风格kotlin.code.styleofficial见 gradle.propertiesCI 会用 ktlint 检查每个 PR。架构Clean Architecture MVIdomain 层零框架依赖data 层实现 domain 接口presentation 层持有 ViewModel 与 Compose 代码。每个页面采用State / Action / Event模式class XViewModel : ViewModel() { private val _state MutableStateFlow(XState()) val state _state.asStateFlow() private val _events ChannelXEvent() val events _events.receiveAsFlow() fun onAction(action: XAction) { ... } }Action、Event、导航路由均使用sealed interface。Koin做依赖注入每个 feature 模块从data/di/SharedModule.kt暴露一个 Koin moduleViewModel 在composeApp/src/commonMain/kotlin/zed/rainxch/githubstore/app/di/initKoin.kt中统一装配并通过koinViewModel()注入。实际装配点可以从 initKoin.kt 看到startKoin { modules(mainModule, coreModule, networkModule, databaseModule, viewModelsModule, ...) }一次聚合了 core 与各 feature 的模块。类型安全导航基于Serializablesealed interfaceGithubStoreGraph其完整路由定义在 GithubStoreGraph.kt包括ExploreScreen、SearchScreen、DetailsScreen、TweaksScreen、HostTokensScreen等 30 余条路由。Source setscommonMain共享代码Compose UI、ViewModel、仓储契约。androidMain仅 Android 的平台实现Shizuku、PackageManager、OkHttp。jvmMain仅桌面的平台实现CIO、文件路径、原生安装器。命名包名zed.rainxch.{module}.{layer}。私有状态字段使用下划线前缀_state、_events。Composable 函数使用PascalCase。布尔状态使用isXxx/hasXxx/canXxx。注释除非函数意图无法从签名和函数体看出否则不要写 KDoc / docstring。行内注释只保留给不显然的不变量、棘手的并发逻辑、第三方 Bug 的 workaround、反直觉的选择。如果读代码就能回答「为什么」就删掉注释。该规则全局适用评审者会对凑数的注释提出异议。技术栈要点以 gradle/libs.versions.tomlVersion Catalog为准当前实际版本为Kotlin 2.3.10、Compose Multiplatform 1.10.3、Ktor 3.4.0、Room 2.8.4、Koin 4.1.1另含 kotlinx.serialization 1.10.0、DataStore 1.2.0、Landscapist 2.9.5、Kermit 2.0.8、Shizuku 13.1.5、AGP 8.13.2 等。所有版本统一放在 Version Catalog 中。新增依赖时把版本号和 alias 写进libs.versions.toml不要在模块自己的build.gradle.kts里直接写版本。约定插件位于build-logic/convention/如KmpLibraryConventionPlugin.kt、CmpLibraryConventionPlugin.kt、CmpFeatureConventionPlugin.kt、CmpApplicationConventionPlugin.kt、RoomConventionPlugin.kt、KtlintConventionPlugin.kt等用于统一模块的构建脚本。新增模块时应选用合适的约定插件convention.kmp.library、convention.cmp.library、convention.cmp.feature等而不是手写构建脚本。分支与提交风格分支默认分支为main。绝不允许直接向main提交先开特性分支。命名约定与仓库现有分支保持一致feat/issue#-short-slug功能特性。fix/short-slugBug 修复。chore/short-slug重构、依赖升级、文档、构建清理。示例feat/470-sui-support、fix/auth-stuck-on-direct-and-dialog-loop、chore/drop-legacy-query-hash。提交一个提交 一个逻辑变更。不要把重构和功能打包进同一提交也不要把两个无关功能塞进一个提交。提交信息简短、祈使语气与仓库现有风格一致通常是一句不超过 72 字符的句子✅fix: clear parked install metadata once the system confirms install✅feat: support multi-select platform filter on Home❌fixed bug/wip/more changes复杂变更可以写长正文重点解释为什么而不是做了什么diff 已经展示了做了什么。允许使用 AI 辅助工具但提交信息与 PR 描述必须是你自己的语言且代码是你读过并认可的。推送前应去掉自动生成的Co-Authored-By: ...尾注避免污染git log。Pull Request 流程先开或认领 Issue再动手做实质性工作打字错误、单行修复这类小改动可以跳过。从最新main拉分支git fetch origin git checkout -b feat/123-some-thing origin/main做变更保持 PR 聚焦如果超出单一逻辑变更拆成分层提交。运行本地检查./gradlew ktlintCheck build如果确定改动范围有限也可以只跑对应模块的窄范围任务。推送并针对main开 PR描述里包含做了什么为什么——用户侧问题或技术动机如何测试——评审者在干净 checkout 上可复现的确切步骤截图或录屏——任何 UI 变更都要求视觉差异强制关联 IssueCloses #123/Fixes #123。评审前自己先跑本地检查。CI 不会对 PR 自动运行构建./gradlew ktlintCheck build是你的安全网不要指望 merge 按钮兜住坏构建。处理 CodeRabbit 的自动评审。每个 PR 都会收到 CodeRabbit AI 的评审意见逐条阅读判断是否正确要么修复要么回复解释为什么保留。「Looks fine to me」不回复是不合格的maintainer 会在合并前要求你处理这些评论。CodeRabbit 并非永远正确带理由地反驳是被欢迎的。处理人类评审意见时用后续提交跟进评审期间除非评审者要求不要 force-push合入时自动 squash。合并由 maintainer 通过 GitHub 的 Squash and merge 执行合并后你的分支会被自动删除。什么样的 PR 会被拒绝混合多个关注点一个 PR 里同时包含重构 功能 依赖升级。新增依赖但描述里没有理由。视觉变更没有截图。代码无视项目既有模式例如「为什么不是XViewModel」「为什么跳过了约定插件」。提交信息空洞 / 含糊或历史里残留 WIP 提交。翻译Komi Store 内置 13 种语言。字符串资源位于core/presentation/src/commonMain/composeResources/下core/presentation/src/commonMain/composeResources/ values/strings.xml # 默认英语 values-ar/strings-ar.xml # 阿拉伯语 values-bn/strings-bn.xml # 孟加拉语 values-es/strings-es.xml # 西班牙语 values-fr/strings-fr.xml # 法语 values-hi/strings-hi.xml # 印地语 values-it/strings-it.xml # 意大利语 values-ja/strings-ja.xml # 日语 values-ko/strings-ko.xml # 韩语 values-pl/strings-pl.xml # 波兰语 values-ru/strings-ru.xml # 俄语 values-tr/strings-tr.xml # 土耳其语 values-zh-rCN/strings-zh-rCN.xml # 简体中文Android 侧的镜像资源在 composeApp/src/androidMain/res/values 及各语言values-*/strings.xml桌面与移动端共享同一套多语言体系。新增翻译的步骤在values/strings.xml中找到缺失或新增的 key。将本地化内容加到对应的values-lang/strings-lang.xml。提交 PR标题格式为i18n: language — short note例如i18n: Spanish — translate APK Inspect strings。若新增一种全新的语言环境需要先联系 maintainer 配置 locale 文件及相关语言专属资源。另外未经核验的机器翻译不建议直接提交——低质量翻译比缺失更糟因为它会覆盖回退的英文文案。发布流程发布由 maintainer 在main上经过短暂稳定窗口后执行在composeApp/build.gradle.kts中升级versionName和versionCode当前版本定义集中在 gradle/libs.versions.toml 的projectVersionName/projectVersionCode由 build 脚本引用。为提交打 tagvX.Y.Z。maintainer 使用签名密钥构建 Android release并构建桌面安装包.exe、.msi、.dmg、.pkg、.deb、.rpm、.appimage、.tar.zst。Release Notes 由人工撰写覆盖用户可见的变更而非逐条列 commit。F-Droid 与应用内更新器会自动拾取新发布。作为贡献者通常不需要参与发布只需了解合入main不意味着立即发布之上还有发布节奏。安全披露不要在公开 Issue 中提交安全漏洞。请使用 GitHub 的私有漏洞报告功能或发送邮件至hellogithub-store.org。项目将 token 泄露、安装流程漏洞、绕过签名路径视为严重级别其余问题按尽力而为原则分类处理。常见问题与沟通渠道实时沟通官方 Discord 服务器是与 maintainer 及其他贡献者交流最快的方式。邮件hellogithub-store.org适用于不合适的公开渠道的事项赞助、合作、敏感协调。一般问题 / 讨论通过 GitHub Discussion如已启用或功能请求 Issue。本地环境卡住可以开一个包含现有进度的 draft PR并在描述里求助——项目宁愿帮助你完成也不希望你默默放弃。总而言之Komi Store 的贡献流程以「小而聚焦」为核心干净的 feature 分支、语义化的提交信息、State/Action/Event 的 MVI 模式、Koin 装配与类型安全导航是代码层面必须遵守的骨架./gradlew ktlintCheck build是提交前必须通过的本地安全网。对照本文从环境搭建开始认领一个good first issue即可完整走通「Issue → 分支 → 变更 → 检查 → PR → 评审 → 合入」的闭环。赞分享移动开发桌面应用【免费下载链接】komi-store A free, open-source app store for developers releases on GitHub, Codeberg Forgejo — browse, discover, and install apps with one click. Formerly GitHub Store.项目地址https://gitcode.com/gh_mirrors/git/komi-store点击查看免费下载相关推荐Frigate 贡献者开发指南从本地环境搭建到提交 PR 的完整实践Frigate 贡献者开发指南从本地环境搭建到提交 PR 的完整实践 Frigate 是一套面向 IP 摄像头的实时本地目标检测 NVR 系统其代码库横跨人工智能计算机视觉音视频OmniRoute 贡献者开发指南从本地构建到 PR 全流程实战OmniRoute 贡献者开发指南从本地构建到 PR 全流程实战 本文是 OmniRoute 官方《Współtworzenie OmniRoute》Pol后端API网关LLM 网关人工智能大模型MCP 服务桌面应用RS School App 贡献指南从本地开发到 PR 合入的完整工作流RS School App 贡献指南从本地开发到 PR 合入的完整工作流 本指南以仓库根目录的 CONTRIBUTING.md https://link.gi教育后端前端上一篇KernelSU 架构与实践基于 Linux 内核的 Android Root 方案解析docs/README_ES 技术深读下一篇Thorium 浏览器上手指南选对五个指令集版本让老电脑也跑上编译加速创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表