封面图片来源:使用 Aseprite 制作(源文件, 遵循 CC BY-SA 4.0 )
目录
注意:本文不是 flatpak 打包教程,并假定读者能够独立打包 flatpak 格式安装包
以 QRookie 为例子演示如何向 Flathub 提交软件,这也是我目前唯一发布在 Flathub 的软件
编写 Manifest
QRookie 项目本身已经包含图标、.desktop 文件、Appstream 文件,只需要编写 flatpak manifest 就可以了。(如果你要打包的软件不包含这些,或不符合规范,那就得自己重新写了)
app-id: io.github.glaumar.QRookie
runtime: org.kde.Platform
runtime-version: "6.6"
sdk: org.kde.Sdk
command: qrookie
finish-args:
- --socket=wayland
- --socket=fallback-x11
- --share=ipc
- --device=all
- --share=network
- --persist=.android
cleanup:
- "*.a"
- /include
modules:
- name: p7zip
buildsystem: simple
build-commands:
- cd CPP/7zip/Bundles/Alone
- make
- cd ../../../../
- install -pDm 0755 bin/7za -t "$FLATPAK_DEST/bin/"
sources:
- type: archive
url: https://github.com/p7zip-project/p7zip/archive/refs/tags/v17.05.tar.gz
sha256: d2788f892571058c08d27095c22154579dfefb807ebe357d145ab2ddddefb1a6
- name: android-tools
buildsystem: simple
build-commands:
- install -pDm 0755 adb -t "$FLATPAK_DEST/bin/"
sources:
- type: archive
url: https://dl.google.com/android/repository/platform-tools_r34.0.0-linux.zip
sha256: 8137c2834dea05cb64c1a8bc041ea00fcd43e3a8a29429ad4f25b8ee51efebf6
- name: qcoro
buildsystem: cmake-ninja
sources:
- type: archive
url: https://github.com/danvratil/qcoro/archive/refs/tags/v0.10.0.tar.gz
sha256: b7c8f00273ad27d85814bf4ec93eb6922c75656800a61d11854d36355a4a1aec
- name: qrookie
buildsystem: cmake-ninja
sources:
- type: archive
url: https://github.com/glaumar/QRookie/archive/refs/tags/v0.2.1.tar.gz
sha256: e0f036d7dc3b9408a9bdcd438316e7d6edc98a9ef3fa9fca8dbf42000917b628
{
"only-arches": ["x86_64"]
}
一些注意事项
- 如果你不是软件作者,需要事先征得作者同意,即使是开源软件也一样;
- 权限最小化,如果用了比较宽泛的权限,如:
--device=all
--filesystem=home
审核可能会要求解释使用原因; - 至少保证在 Gnome 和 KDE 下主题显示正常,如果程序确实只在 KDE 下才能正常显示,可以考虑添加环境变量
--env=XDG_CURRENT_DESKTOP=KDE
临时解决; - 包括依赖在内,所有
modules
尽可能从源码编译,因为 Flathub 是支持多架构的。上面 QRookie 需要adb
,所以只支持 x86,对于只支持特定架构的,需要添加一个flathub.json
文件,参考 这里; - 编译环境不能联网,即不能在
build-args
里使用--share=network
,对于 QRookie 来说这不是问题,但如果打包的软件使用的是 Golang、Rust、C# 等带包管理的语言,则无法联网下载依赖, 解决方法是提前生成每个依赖的 module 并包含到 manifest 里,这里 提供了针对各个语言依赖生成工具; - 官方提供了一些常用依赖 shared-modules ,可以的话尽量直接使用这里面的 module
本地编译和检查
编译和安装
flatpak run org.flatpak.Builder --force-clean --sandbox --user --install --install-deps-from=flathub --ccache --mirror-screenshots-url=https://dl.flathub.org/media/ --repo=repo builddir io.github.glaumar.QRookie.yml
运行
flatpak run io.github.glaumar.QRookie
检查
每次上传前最好都使用工具检查一下,把低级错误处理掉
Manifest
flatpak run --command=flatpak-builder-lint org.flatpak.Builder manifest io.github.glaumar.QRookie.yml
Repo
flatpak run --command=flatpak-builder-lint org.flatpak.Builder repo repo
repo 检查出现 appstream-screenshots-not-mirrored-in-ostree
是正常的,可以忽略,其他错误参考 https://docs.flathub.org/docs/for-app-authors/linter/ 修改
Appstream
flatpak run --command=flatpak-builder-lint org.flatpak.Builder appstream io.github.glaumar.QRookie.metainfo.xml
# 或者
appstreamcli validate io.github.glaumar.QRookie.metainfo.xml
.desktop file
desktop-file-validate io.github.glaumar.QRookie.desktop
上传
1. Fork flathub/flathub
在 Github 上 fork flathub/flathub , 不要勾选 Copy the master branch only
2. Clone 到本地
git clone --branch=new-pr [email protected]:your_github_username/flathub.git
cd flathub
3. 创建新分支
git checkout -b io.github.glaumar.QRookie
4. 提交文件
# 有其他文件当然也一并提交,这里只有这两个文件
git add io.github.glaumar.QRookie.yml flathub.json
git commit
git push --set-upstream origin io.github.glaumar.QRookie
5. 在 Github 上向 new-pr 分支 pull request
记住是向 flathub 仓库 new-pr 分支 pull request,然后按照提示编辑描述即可,完成后点击 “Create pull request”。之后社区会有志愿者审核,按审核意见修改即可
6. 接收仓库
审核通过后 pull request 会标记为 ready,等待每周的统一合并即可。请求合并之后在 flathub 下会创建一个新仓库(这里是 flathub/io.github.glaumar.QRookie)并转交给你,收到通知后记得接收。合并之后几天内你的应用就会出现在 flathub 首页
软件更新
- fork 收的新仓库 (flathub/io.github.glaumar.QRookie)
- 修改并提交
- 创建 pull request
- 等待机器人检查通过(这里 可以看到等待队列)
- 你拥有 flathub/io.github.glaumar.QRookie 的写入权限,自己 merge 就好(我这里遇到过 github 抽风无法合并,等待 1~2 个小时之后再合并就好了)
- 合并之后一般第二天更新就会在 flathub.org 上展示
参考:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。