当前位置: 首页 > news >正文

Flatpak打包应用,使用debpak列出依赖树

筛选依赖的高效流程:

  1. 获取声明依赖:用 dpkg -I your-package.deb 获取官方依赖列表。
  2. 分析实际依赖:用 ldd 分析 .deb 包内的库文件,找出所有实际需要的共享库。
  3. 转换为包名:对于 ldd 列出的每个 .so 文件,用 dpkg -S <库文件路径> 查找它属于哪个软件包
  4. 获取递归依赖:用 apt-cache depends 或 apt-rdepends 获取所有依赖包的完整列表。
  5. 与 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),可按以下步骤修改清单:

  1. 将你的可执行文件(如 myapp)放入工作目录 ~/flatpak-mysql-client/。
  2. 修改清单文件:
    将顶层 “command”: “entrypoint.sh” 改为 “command”: “myapp”。
    在 modules 末尾添加一个模块用于安装你的程序(可删除 entrypoint 模块)。
  3. 重新构建(同步骤 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
不存在,说明启动脚本未执行

http://www.jsqmd.com/news/1132632/

相关文章:

  • 免费AI视频插帧神器:Flowframes让30fps视频秒变60fps的终极指南
  • 5分钟解决Windows 10/11经典游戏兼容性问题:dxwrapper终极解决方案
  • 关于程序员在30岁、35岁之后怎么办的新思考
  • Go 控制器限速:Reconcile 失败时,别把 API Server 打满
  • OpCore-Simplify:三分钟搞定macOS启动配置的终极方案
  • 3大核心功能:GHelper华硕笔记本性能控制完全指南
  • Java Web 产业园区智慧公寓管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 3个关键问题:如何通过WSC API安全管理Windows Defender?
  • Path of Building PoE2:流放之路2角色构建的终极开源工具指南
  • whisper.cpp语音识别架构决策:企业级部署的技术权衡与性能优化深度解析
  • 戴森球计划r2modman联机开服全攻略|超低延迟+多Mod支持
  • 通信与接口协议面试六、RS485
  • Appium Inspector部署与使用全指南:提升移动自动化测试效率
  • FinalBurn Neo:打造完美复古街机游戏体验的终极指南
  • CNN 感受野计算:从 3x3 卷积到 5 层网络,感受野如何扩大至 13x13
  • 如何免费解锁Android投屏新体验?scrcpy的终极完整使用指南
  • 余子式展开:工程师手算行列式的高效解剖刀
  • 三星固件下载器Bifrost:零基础获取官方固件的终极指南
  • Selenium自动化测试实战:从框架搭建到工程化落地
  • 2149567-00-8 PSMA binder-2 特性
  • GHelper:为华硕笔记本用户量身打造的轻量级硬件控制解决方案
  • MQ 的 Erlang 使用思路:从并发模型到消息队列实践
  • 基于本地AI工具构建高效学习系统:从药学备考到通用学习流程自动化
  • 文生图模型单打独斗效率低?多模型组合放大生产力的底层逻辑
  • 三星固件下载终极指南:Bifrost如何让官方固件获取变得简单快速
  • C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
  • 叶兴阳双语音标,英语发音工具断层级天花板
  • 初学者吉他怎么选?2026新手选购全攻略,8款高性价比型号实测推荐
  • 2026年6月文章一览
  • 如何利用Arsenal-Image-Mounter实现突破性磁盘镜像挂载:一站式专业指南