Flatpak打包应用,使用debpak列出依赖树
筛选依赖的高效流程:
- 获取声明依赖:用 dpkg -I your-package.deb 获取官方依赖列表。
- 分析实际依赖:用 ldd 分析 .deb 包内的库文件,找出所有实际需要的共享库。
- 转换为包名:对于 ldd 列出的每个 .so 文件,用 dpkg -S <库文件路径> 查找它属于哪个软件包
- 获取递归依赖:用 apt-cache depends 或 apt-rdepends 获取所有依赖包的完整列表。
- 与 Flatpak 运行时对比:查阅 org.freedesktop.Platform 的文档,移除其中已包含的库
可使用debpak列出依赖树
一 准备工作
# 添加 Flathub 远程源(若未添加)flatpak remote-add--user--if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo# 创建工作目录并将 libmysqlclient21 DEB 包放入 debs/ 子目录mkdir-p~/flatpak-mysql-client/debs# 假设你已经下载了 libmysqlclient21_8.0.46-1ubuntu24.04_amd64.debcp/path/to/libmysqlclient21_8.0.46-1ubuntu24.04_amd64.deb ~/flatpak-mysql-client/debs/cd~/flatpak-mysql-client二 安装 Flatpak 运行时与 SDK
flatpak install --user org.freedesktop.Platform//24.08 org.freedesktop.Sdk//24.08 -y
下载精确匹配的依赖包
进入 debs/ 目录,下载 mysql-common 和 libssl3t64。必须确保版本与你的 libmysqlclient21 完全一致(可通过 apt show libmysqlclient21 在 Ubuntu 24.04 上查看依赖版本)。
cd~/flatpak-mysql-client/debswgethttp://archive.ubuntu.com/ubuntu/pool/main/m/mysql-8.0/mysql-common_8.0.46-1ubuntu24.04_all.debwgethttp://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl3t64_3.0.13-0ubuntu3_amd64.deb# 确认三个 DEB 文件均存在ls-1*.deb版本一致性:若官方仓库更新了版本号,请访问 Ubuntu 24.04 软件包库 查找与你的 libmysqlclient21 相同构建版本的依赖包,并相应调整下载命令和后续清单中的文件名。
三 编写 Flatpak 清单文件 com.example.mysqlclient.json
在工作目录 ~/flatpak-mysql-client/ 下创建 com.example.mysqlclient.json,内容如下:
{"app-id":"com.example.mysqlclient","runtime":"org.freedesktop.Platform","runtime-version":"24.08","sdk":"org.freedesktop.Sdk","command":"entrypoint.sh","finish-args":["--socket=network","--filesystem=home","--env=LD_LIBRARY_PATH=/app/lib:/app/usr/lib/x86_64-linux-gnu","--env=MYSQL_HOME=/app/etc/mysql"],"modules":[{"name":"mysql-common","buildsystem":"simple","sources":[{"type":"file","path":"debs/mysql-common_8.0.46-1ubuntu24.04_all.deb","sha256":"替换为实际SHA256"}],"build-commands":["ar x mysql-common_*.deb","zstd -d -c data.tar.zst | tar xf - -C /app","rm -f *.tar.zst control.tar.zst debian-binary"]},{"name":"libssl3","buildsystem":"simple","sources":[{"type":"file","path":"debs/libssl3t64_3.0.13-0ubuntu3_amd64.deb","sha256":"替换为实际SHA256"}],"build-commands":["ar x libssl3t64_*.deb","zstd -d -c data.tar.zst | tar xf - -C /app","rm -f *.tar.zst control.tar.zst debian-binary","mkdir -p /app/lib","ln -s /app/usr/lib/x86_64-linux-gnu/libssl.so.3 /app/lib/libssl.so.3","ln -s /app/usr/lib/x86_64-linux-gnu/libcrypto.so.3 /app/lib/libcrypto.so.3"]},{"name":"libmysqlclient","buildsystem":"simple","sources":[{"type":"file","path":"debs/libmysqlclient21_8.0.46-1ubuntu24.04_amd64.deb","sha256":"替换为实际SHA256"}],"build-commands":["ar x libmysqlclient21_*.deb","zstd -d -c data.tar.zst | tar xf - -C /app","rm -f *.tar.zst control.tar.zst debian-binary","mkdir -p /app/lib","ln -s /app/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21 /app/lib/libmysqlclient.so.21"]},{"name":"entrypoint","buildsystem":"simple","sources":[{"type":"script","dest-filename":"entrypoint.sh","commands":["#!/bin/bash","# finish-args 已保证基本路径,这里再加固一次并保留原有值","export LD_LIBRARY_PATH=/app/lib:/app/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}","export MYSQL_HOME=/app/etc/mysql","echo 'MySQL client library environment is ready.'","exec bash"]}],"build-commands":["install -Dm755 entrypoint.sh /app/bin/entrypoint.sh"]}]}设计要点:
- finish-args 中显式设置了 LD_LIBRARY_PATH,确保任何通过 command 启动的程序都能自动获得库路径。
- 入口脚本进一步追加路径,保证即使外部覆盖也不会丢失。
- 使用 ar + zstd 解压 DEB 包,兼容 Ubuntu 24.04 的 .zst 压缩格式。
四 计算 SHA256 并填入清单
cd~/flatpak-mysql-client sha256sum debs/*.deb将输出的三个哈希值分别替换清单中对应的 “sha256”: “替换为实际SHA256”。
五 构建并安装 Flatpak 应用
cd~/flatpak-mysql-client# 若已安装旧版本,先卸载flatpak uninstall--usercom.example.mysqlclient-y2>/dev/null||true# 构建并安装flatpak-builder--user--install--force-clean build-dir com.example.mysqlclient.json构建成功后,应用会自动注册到用户级 Flatpak 仓库。
六 测试验证
启动应用进入沙箱环境:
flatpak run com.example.mysqlclient
在打开的 Bash 中执行以下验证命令:
# 检查真实库文件是否存在ls-l/app/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21# 检查所有动态依赖是否满足(使用运行时链接器,输出不应含 "not found")/lib64/ld-linux-x86-64.so.2--list/app/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21# 查看库版本strings /app/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21|grep'^8\.0'若上述命令均正常,则打包成功。
七 打包为离线安装文件(.flatpak)
flatpak build-bundle ~/.local/share/flatpak/repo mysqlclient.flatpak com.example.mysqlclient
生成的 mysqlclient.flatpak 可拷贝到其他机器安装:flatpak install --user mysqlclient.flatpak
集成你自己的应用(直接替换 command)
若你想发布一个依赖 MySQL 客户端库的自己的程序(例如 myapp),可按以下步骤修改清单:
- 将你的可执行文件(如 myapp)放入工作目录 ~/flatpak-mysql-client/。
- 修改清单文件:
将顶层 “command”: “entrypoint.sh” 改为 “command”: “myapp”。
在 modules 末尾添加一个模块用于安装你的程序(可删除 entrypoint 模块)。- 重新构建(同步骤 5)。
添加模块示例:
{"name":"myapp","buildsystem":"simple","sources":[{"type":"file","path":"myapp","sha256":"替换为实际SHA256"}],"build-commands":["install -Dm755 myapp /app/bin/myapp"]}因为 finish-args 已设置 LD_LIBRARY_PATH,你的程序 无需任何包装脚本 即可直接加载库文件。
第一步:杀掉占用 8080 端口的旧进程 sudo lsof -i :8080 # 查看哪个进程占用 # 或直接 kill 所有 nginx 进程 pkill -9 nginx 彻底清理所有缓存并重新构建 cd ~/flatpak-nginx # 删除旧构建目录和缓存 rm -rf build-dir rm -rf ~/.cache/flatpak-builder/build/nginx-* rm -rf ~/.cache/flatpak-builder/build/nginx-config-* rm -rf ~/.cache/flatpak-builder/build/launch-script-* # 卸载旧版本(确保干净) flatpak uninstall --user org.nginx.nginx -y && rm -rf ~/.var/app/org.nginx.nginx # 重新构建并安装(无缓存,完全重新编译) flatpak-builder --user --install --force-clean build-dir org.nginx.nginx.json运行测试
flatpak run org.nginx.nginx
命令检查 /var/tmp/nginx 目录是否被正确创建
flatpak run --command=ls org.nginx.nginx /var/tmp/nginx
不存在,说明启动脚本未执行
