flatpak
很久以前,Linux发行版附带了一个操作系统以及所有可用的软件。 没有“第三方”软件的概念,因为所有内容都是发行版的一部分。 应用程序的安装不是很多,因为它们是从大型软件仓库中启用的,因此可以在许多软盘或后来购买或下载的CD中获得它们。
随着互联网的普及,这种情况变得更加便捷,如今“应用程序商店”的概念应运而生。 当然,Linux发行版倾向于将其称为软件存储库或简称为repo ,其中包含“品牌”的一些变体,例如Ubuntu Software Center或具有典型GNOME极简主义的简单软件 。
当开源软件仍然是一种新颖事物并且开源应用程序的数量是一个数字而不是理论数字时,该模型可以很好地工作。 在当今世界GitLab和GitHub上和到位桶(和许多 许多更多),这是几乎不可能指望开源项目的数量,更在仓库打结语。 如今,没有Linux发行版,甚至Debian及其强大的软件包维护者团队也无法宣称或希望为每个可安装的开源项目都拥有一个软件包。
当然,Linux软件包不必位于存储库中即可安装。 任何程序员都可以打包他们的软件,然后从自己的网站进行分发。 但是,由于存储库被视为发行版的组成部分,因此没有通用的打包格式,这意味着程序员必须决定发布.deb
还是.rpm
,还是发布AUR构建脚本,还是发布Nix或Guix软件包,Homebrew脚本或/opt
的大多数通用.tgz
存档。 对于每天生活和呼吸Linux的开发人员来说,这是不堪重负的,对于仅尝试尽最大努力来支持自由和开源目标的开发人员而言,这就不那么容易了。
Flatpak项目提供了通用的包装格式以及分散的分发方式,以及便携性和沙盒。
要构建Flatpak,必须首先安装Flatpak(使您能够使用Flatpak软件包的子系统)和Flatpak-builder应用程序。
在Fedora,CentOS,RHEL等上:
$ sudo dnf install flatpak flatpak-builder
在Debian,Ubuntu和类似系统上:
$ sudo apt install flatpak flatpak-builder
您还必须安装构建要打包的应用程序所需的开发工具。 根据正在打包的应用程序的开发性质,您可能已经安装了开发环境,因此您可能不会注意到这些组件是必需的,但是如果您开始使用Jenkins或从容器内部构建Flatpaks,则必须确保您的构建工具是工具链的一部分。
对于第一个示例构建,本文假定您的应用程序使用GNU Autotools ,但是Flatpak本身支持其他构建系统,例如cmake
, cmake-ninja
, meson
, ant
以及自定义命令(在Flatpak术语中是一个simple
构建系统) ,但这绝不意味着构建本身实际上很简单)。
与严格的RPM构建基础结构不同,Flatpak不施加项目目录结构。 我更喜欢基于dist软件包创建项目目录,但是没有技术上的原因,您不能将Flatpak构建过程与源目录集成在一起。 但是,从技术上讲,从dist包构建Flatpak较容易,并且演示也更简单,因此本文将使用此模型。 为GNU Hello设置项目目录,作为您的第一个Flatpak:
$
mkdir hello_flatpak
$
mkdir src
下载您的可分发源。 对于此示例,源代码位于https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
。
$
cd hello_flatpak
$
wget https:
// ftp.gnu.org
/ gnu
/ hello
/ hello-
2.10 .tar.gz
/app
。
前两个属性是您要打包的应用程序的ID以及它提供的命令。 该应用程序ID对于要打包的应用程序必须是唯一的。 表示唯一ID的规范方法是使用一个三元组值,该值由负责代码的实体和应用程序的名称组成,例如org.gnu.Hello
。 应用程序提供的命令是您在终端中键入以运行该应用程序的任何命令。 这并不意味着应从终端而不是“活动”或“应用程序”菜单中的.desktop
文件运行该应用程序。
在名为org.gnu.Hello.yaml
的文件中,输入以下文本:
id
: org.gnu.Hello
command
: hello
清单可以用YAML或JSON编写。 本文使用YAML。
接下来,您必须定义此Flatpak软件包提供的每个“模块”。 您可以将模块视为依赖项或组件。 对于GNU Hello,只有一个模块:GNU Hello。 更复杂的应用程序可能需要特定的库或整个其他应用程序。
modules :
- name
: hello
buildsystem
: autotools
no-autogen
: true
sources :
- type
: archive
path
: src/hello-2.10.tar.gz
buildsystem
值标识Flatpak必须如何构建模块。 每个模块可以使用自己的构建系统,因此一个Flatpak可以定义多个构建系统。
no-autogen
值告诉Flatpak不要运行autotools
的设置命令,这是不必要的,因为GNU Hello源代码是make dist
的产物。 如果您要构建的代码不是易于构建的形式,则可能需要安装autogen
和autoconf
来准备autotools
的源代码。 此选项根本不适用于不使用autotools
项目。
type
值告诉Flatpak源代码在归档文件中,这会在构建之前触发必要的取消归档任务。 该path
指向源代码。 在此示例中,源位于本地构建计算机上的src
目录中,但是您可以将源定义为远程位置:
modules :
- name
: hello
buildsystem
: autotools
no-autogen
: true
sources :
- type
: archive
url
: https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
最后,您必须定义应用程序运行和构建所需的平台。 Flatpak维护者提供的运行时和SDK包括常见的库,包括freedesktop
, gnome
和kde
。 基本要求是freedesk
runtime和SDK,尽管这可能会被GNOME或KDE取代,具体取决于您需要运行的代码。 对于此GNU Hello示例,仅需要基础知识。
runtime
: org.freedesktop.Platform
runtime-version
: '18.08'
sdk
: org.freedesktop.Sdk
整个GNU Hello flatpak清单:
id
: org.gnu.Hello
runtime
: org.freedesktop.Platform
runtime-version
: '18.08'
sdk
: org.freedesktop.Sdk
command
: hello
modules :
- name
: hello
buildsystem
: autotools
no-autogen
: true
sources :
- type
: archive
path
: src/hello-2.10.tar.gz
现在已经定义了包,您可以构建它。 构建过程会提示Flatpak-builder解析清单并解决每个需求:它确保必需的Platform和SDK可用(如果没有,则必须使用flatpak
命令安装它们),它会取消归档源代码,并执行指定的buildsystem
。
启动命令:
$ flatpak-builder build-dir org.gnu.Hello.yaml
如果目录build-dir
不存在,则创建该目录。 名称build-dir
是任意的; 您可以将其称为build
或bld
或penguin
,并且在同一项目目录中可以有多个构建目标。 但是,术语build-dir
是文档中经常使用的值,因此将其用作文字值可能会有所帮助。
您可以在运行应用程序之前或之后对应用程序进行测试,方法是运行build命令以及--run
选项,并使用Flatpak提供的命令结束该命令:
$ flatpak-builder
--run build-dir \
org.gnu.Hello.yaml hello
Hello, world
!
打包一个简单的独立的hello world应用程序很简单,幸运的是,打包一个GUI应用程序并不难。 最困难的应用程序包是那些不依靠公共库和框架(在包装方面,“通用”意味着什么已经不被别人包装)。 Flatpak社区为您可能必须打包的许多组件提供了SDK和SDK扩展。 例如,打包pdftk
的纯Java实现时,我使用在Flatpak Github存储库中找到的OpenJDK SDK扩展:
runtime
: org.freedesktop.Platform
runtime-version
: '18.08'
sdk
: org.freedesktop.Sdk
sdk-extensions
:
- org.freedesktop.Sdk.Extension.openjdk11
Flatpak社区在运行应用程序所需的基础上做了很多工作,以使开发人员的打包过程变得容易。 例如,来自KDE社区的Kblocks游戏需要运行KDE平台,而Flatpak已经提供了该平台。 不包括附加的libkdegames
库,但是将其添加到modules
列表中就像kblocks
本身一样kblocks
。
这是Kblocks游戏的清单:
id
: org.kde.kblocks
command
: kblocks
modules :
- buildsystem
: cmake-ninja
name
: libkdegames
sources :
type
: archive
path
: src/libkdegames-19.08.2.tar.xz
- buildsystem
: cmake-ninja
name
: kblocks
sources :
type
: archive
path
: src/kblocks-19.08.2.tar.xz
runtime
: org.kde.Platform
runtime-version
: '5.13'
sdk
: org.kde.Sdk
如您所见,清单仍然是直截了当且相对直观的。 构建系统不同,运行时和SDK指向KDE而不是Freedesktop,但是结构和要求基本相同。
但是,由于它是一个GUI应用程序,因此需要一些新选项。 首先,它需要一个图标,以便在“活动”或“应用程序”菜单中列出该图标时,它看起来很漂亮且易于识别。 Kblocks的源代码中包含一个图标,但是Flatpak导出的文件名必须使用应用程序ID(例如org.kde.Kblocks.desktop
)作为org.kde.Kblocks.desktop
。 最简单的方法是直接在应用程序源中重命名文件,只要您在清单中包括以下指令,Flatpak便可以为您完成此操作:
rename-icon : kblocks
GUI应用程序的另一个独特特性是,它们通常需要与常见的桌面服务集成,例如图形服务器(X11或Wayland)本身,声音服务器(例如Pulse Audio )和进程间通信(IPC)子系统。
对于Kblock,要求是:
finish-args
:
- --share=ipc
- --socket=x11
- --socket=wayland
- --socket=pulseaudio
- --device=dri
- --filesystem=xdg-config/kdeglobals:ro
这是最终的完整清单,使用URL作为源,因此您可以轻松地在自己的系统上尝试:
command
: kblocks
finish-args
:
- --share=ipc
- --socket=x11
- --socket=wayland
- --socket=pulseaudio
- --device=dri
- --filesystem=xdg-config/kdeglobals:ro
id
: org.kde.kblocks
modules :
- buildsystem
: cmake-ninja
name
: libkdegames
sources :
- sha256
: 83456cec44502a1f79c0be00c983090e32fd8aea5fec1461fbfbd37b5f8866ac
type
: archive
url
: https://download.kde.org/stable/applications/19.08.2/src/libkdegames-19.08.2.tar.xz
- buildsystem
: cmake-ninja
name
: kblocks
sources :
- sha256
: 8b52c949e2d446a4ccf81b09818fc90234f2f55d8722c385491ee67e1f2abf93
type
: archive
url
: https://download.kde.org/stable/applications/19.08.2/src/kblocks-19.08.2.tar.xz
rename-icon
: kblocks
runtime
: org.kde.Platform
runtime-version
: '5.13'
sdk
: org.kde.Sdk
要构建该应用程序,必须安装KDE平台和SDK Flatpaks(在撰写本文时为5.13版)。 构建应用程序后,可以使用--run
方法运行它,但是要查看该应用程序图标,必须安装它。
分发flatpaks通过存储库进行。
您可以在Flathub.org上列出您的应用程序, Flathub.org是一个社区网站,意味着Flatpaks在技术上是分散的(但本质上是中心位置)。 要提交Flatpak, 请将清单放入Git存储库,然后在Github上提交拉取请求 。
或者,您可以使用flatpak build-export
命令创建自己的存储库。
您也可以只在本地安装:
$ flatpak-builder --force-clean --install build-dir org.kde.Kblocks.yaml
安装完成后,打开“活动”或“应用程序”菜单并搜索Kblock。
Flatpak文档站点在构建您的第一个Flatpak方面有很好的演练。 即使您已阅读本文,也值得阅读。 除此之外,文档还提供了有关哪些平台和SDK的详细信息。
对于那些喜欢从示例中学习的人, Flathub上提供了每种应用程序的 清单 。
Flatpaks的构建和使用资源很多,Flatpak以及容器和沙盒应用程序可以说是未来 ,因此,请熟悉它们,开始将它们与Jenkins管道集成,并享受简单而通用的Linux应用程序打包。
翻译自: https://opensource.com/article/19/10/how-build-flatpak-packaging
flatpak