在ubuntukylin上构建flatpak软件包

如何构建Flatpak软件包

  • 安装运行时和Sdk
  • 构建APP
  • 创建一个新的存储库
  • 安装应用
  • 运行应用
    • 生成flatpak文件
  • 附本文demo源码

安装运行时和Sdk

因为我需要运行qt程序,所以需要安装一个具有qt环境的runtime,在此选择kde的runtime,版本为5.12,此运行时由flathub存储库提供。
命令为:
添加flathub存储库

Flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

安装runtime 和Sdk

flatpak install flathub org.kde.Platform//5.12 org.freedesktop.Sdk//5.12

在ubuntukylin上构建flatpak软件包_第1张图片此过程安装较慢。
安装之后可以在/var/lib/flatpak/runtime/ 下查看
也可以用

//查看所有已安装的runtime和Sdk
flatpak list --runtime

在ubuntukylin上构建flatpak软件包_第2张图片

构建APP

此例用了简单的qt的widget和pushbutton,代码在文章结尾。
代码目录如下:
代码目录结构Flatpak软件包是有flatpak-builder构建的,所以需要
apt-get install flatpak-builder flatpak
Flatpak-builder会读取清单档,清单档描述了应用的关键属性以及构建方法。
在当前目录新建一个org.ubuntukylin.hello_qt.json档
内容如下:

{
    "app-id": "org.ubuntukylin.hello_qt",
    "runtime": "org.kde.Platform",
    "runtime-version": "5.12",
    "sdk": "org.kde.Sdk",
    "command": "hello_qt",
    "finish-args":[
    "--socket=x11"
    ],
    "modules": [
        {
            "name": "hello_qt",
            "no-autogen": true,
            "sources": [
                {
                    "type": "git",
                    "url": "https://github.com/whailiang/flatpak-hello-demo.git",
		    "branch":"master"
                },
		{
                    "type":"script",
                    "commands":[
                        "sed -i 's|/usr|/app|g' hello_qt.pro",
                        "qmake PREFIX=/app"
                    ],
		    "dest-filename":"configure"
                }
            ]
        }
    ]
}

其中包括应用的基本信息:
app-id app名字
Runtime app所使用的runtime名字
Runtime-version runtime版本
Sdk 与runtime匹配的Sdk
Command 应用的命令
Finish-args 应用的配置选项,使应用程序可以访问沙盒外的资源。

Modules: 这里描述了要作为构建过程中的每一个模块,其中一个模块始终是此应用程序。其他可以是应用程序的依赖库和应用程序捆绑在一起(自包含)。
模块可以有很多类型,包括tar.gz tar.xz的归档档 url 下载地址 ;目前可以理解为,这些都是依赖库的源码,url 为源码地址。

编译json文件

flatpak-builder --repo=kylin-repo hello org.ubuntukylin.hello_qt.json --force-clean

这个命令执行以下操作:

  • 创建一个名为hello的新档夹
  • 下载并验证字典源代码
  • 在SDK中而不是主机系统中构建并安装源代码
  • 通过设置权限来完成构建(在这个案例中,可以访问x11)
  • 创建一个名为kylin-repo的新存储库(如果它不存在)并将生成的构建导出到其中 flatpak-builder还会做一些其他有用的事情,比如创建一个可单独安装的调试运行时(本例中称为org.ubuntukylin.hello.debug)和一个可单独安装的翻译运行时(称为org.ubuntukylin.hello.locale)。

编译之后生成hello 目录 kylin-repo目录

在ubuntukylin上构建flatpak软件包_第3张图片

在ubuntukylin上构建flatpak软件包_第4张图片
其中hello目录 结构和此应用的沙盒环境中的目录结构是相同的。
Kylin-repo目录还需了解。

创建一个新的存储库

添加已创建的新存储库

flatpak --user remote-add --no-gpg-verify --if-not-exists kylin-repo kylin-repo

安装应用

flatpak --user install kylin-repo org.ubuntukylin.hello_qt

在ubuntukylin上构建flatpak软件包_第5张图片其中–user 是将应用以用户级应用安装到沙盒环境中,
可以–system 就是以系统级应用将应用安装到沙盒环境中。
我们可以通过 flatpak list --app 查看系统中flatpak应用的安装情况

其中installation列就是表明此应用是系统级应用还是用户级应用。

运行应用

flatpak run org.ubuntukylin.hello_qt
flatpak run --devel --command=bash org.ubuntukylin.hello_qt

这会提供一个安装在/app中的应用程序软件包的环境,以及它构建的安装在/usr中的sdk。你可以探索这两个目录来查看一个典型的flatpak的外观,以及sdk中包含的内容。

生成flatpak文件

flatpak build-bundle kylin-repo  hello.flatpak  org.ubuntukylin.hello_qt

其中kylin-repo 是应用安装到的存储库名字 hello.flatpak 是生成的flatpak文件名
org.ubuntukylin.hello_qt 是应用程序名

Flatpak档可以在其他机器上直接安装

flatpak install hello.flatpak

附本文demo源码

hello_qt.pro

#-------------------------------------------------
#
# Project created by QtCreator 2018-04-20T22:54:49
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = hello_qt
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
CONFIG += link_pkgconfig
CONFIG += c++11
#PKGCONFIG += dtkwidget
SOURCES += \
        main.cpp \
        dialog.cpp

HEADERS += \
        dialog.h

FORMS += \
        dialog.ui

isEmpty(PREFIX){
    PREFIX = /usr
}

target.path = $${PREFIX}/bin/


INSTALLS += target
GitVersion = $$system(git rev-parse HEAD)
DEFINES += GIT_VERSION=\\\"$$GitVersion\\\"

main.cpp

#include "dialog.h"
#include 
//#include 
//DWIDGET_USE_NAMESPACE
int main(int argc, char *argv[])
{
//    DApplication::loadDXcbPlugin();
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_btnAboutQt_clicked()
{
    qApp->aboutQt();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include 

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_btnAboutQt_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

dialog.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="1">
    <spacer name="verticalSpacer_2">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>20</width>
       <height>116</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="1" column="0">
    <spacer name="horizontalSpacer">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>125</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="1" column="1">
    <widget class="QLabel" name="label">
     <property name="font">
      <font>
       <pointsize>16</pointsize>
      </font>
     </property>
     <property name="text">
      <string>Hello World</string>
     </property>
    </widget>
   </item>
   <item row="1" column="2">
    <spacer name="horizontalSpacer_2">
     <property name="orientation">
      <enum>Qt::Horizontal</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>125</width>
       <height>20</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="2" column="1">
    <spacer name="verticalSpacer">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <property name="sizeHint" stdset="0">
      <size>
       <width>20</width>
       <height>116</height>
      </size>
     </property>
    </spacer>
   </item>
   <item row="2" column="2">
    <widget class="QPushButton" name="btnAboutQt">
     <property name="text">
      <string>About Qt</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

你可能感兴趣的:(linux,软件包格式,发flatpak,linux)