玖玖资源站亚洲av_日本乱偷中文字幕一二三区_久久这里只有精品98_亚洲特级黄片视频_男女很舒服爽视频免费_国产一二三四2021精字窝_国产高潮白浆一区_自拍日本高清三级_秘书高跟黑色丝袜国产在线_亚洲A v永久无码精品网站色欲

NEWS

新聞

了解優(yōu)麒麟最新資訊,關(guān)注社區(qū)和產(chǎn)品動(dòng)態(tài)。

NEWS

Learn about the latest news.

漲知識(shí):如何在優(yōu)麒麟和銀河麒麟社區(qū)版上構(gòu)建Linux跨平臺(tái)的snap/flatpak包?

2017-05-10 09:18:39

摘要:Snap和Flatpak是新一代的Linux打包格式,它們通過(guò)將軟件和依賴(lài)同時(shí)安裝在一個(gè)沙盒中,使得采用snap和flatpak的應(yīng)用,可以跨越不同的發(fā)行版,降低了開(kāi)發(fā)和維護(hù)成本,同時(shí)大大提高了系統(tǒng)的安全性。本文將通過(guò)實(shí)例,來(lái)介紹如何在優(yōu)麒麟/銀河麒麟社區(qū)版上構(gòu)建這兩種跨平臺(tái)的軟件包。 

漲知識(shí):如何在優(yōu)麒麟和銀河麒麟社區(qū)版上構(gòu)建Linux跨平臺(tái)的snap/flatpak包?

首先,我們使用gtk編寫(xiě)一個(gè)最簡(jiǎn)單的“hello world”窗口程序。

// 主程序main.c

#include 
static gboolean quit(GtkWidget *widget, gpointer data)
{

    gtk_widget_destroy(widget);

    gtk_main_quit();

    return FALSE;

} 

int main(int argc, char *argv[])

{

    gtk_init(&argc, &argv); 

    GtkWidget *main_win;

    GtkWidget *label; 

    main_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(main_win), "my window");

    gtk_window_set_default_size(GTK_WINDOW(main_win), 300, 100); 

    label = gtk_label_new("hello world!");

    gtk_container_add(GTK_CONTAINER(main_win), label); 

    g_signal_connect(G_OBJECT(main_win), "destroy", G_CALLBACK(quit), NULL); 

    gtk_widget_show_all(main_win);

    gtk_main(); 

    return 0;

} 

# CMake項(xiàng)目文件:CMakeLists.txt

project (hello)

cmake_minimum_required (VERSION 3.0.0) 

set (SRC_LIST main.c

) 

find_package (PkgConfig REQUIRED)

set (HELLO_DEPS

    gtk+-3.0

) 

pkg_check_modules (CACHED_HELLO_DEPS REQUIRED ${HELLO_DEPS})

include_directories (${CACHED_HELLO_DEPS_INCLUDE_DIRS})

link_directories (${CACHED_HELLO_DEPS_LIBRARY_DIRS})

add_executable (hello ${SRC_LIST})

target_link_libraries (hello ${CACHED_HELLO_DEPS_LIBRARIES})

install (TARGETS hello DESTINATION "bin") 

把這兩個(gè)文件放在hello目錄下,并將hello目錄壓縮成hello.tar.gz,放在主目錄下供之后調(diào)用:

$ tar cvfz hello.tar.gz hello 

其次,將其打包成snap格式。

snaps 是Ubuntu推出的新一代打包格式,它安裝迅速,創(chuàng)建方便,具有自動(dòng)進(jìn)行事務(wù)性更新的能力,可以在眾多 Linux 桌面、服務(wù)器、云或者設(shè)備上完美、安全地運(yùn)行。 

安裝snapd(運(yùn)行和管理snaps所需的服務(wù))和snapcraft(構(gòu)建snap包的工具)

$ sudo apt install snapd snapcraft

(其他系統(tǒng)安裝方式請(qǐng)參見(jiàn):https://snapcraft.io/docs/core/install 

初始化:

$ mkdir hello_snap && cd hello_snap

$ snapcraft init 

這會(huì)在你的目錄下產(chǎn)生“snap/snapcraft.yaml”這個(gè)文件,而這個(gè)文件控制著snap包的構(gòu)建過(guò)程以及向用戶(hù)暴露的屬性。(在16.04系統(tǒng)上,比如銀河麒麟社區(qū)版和優(yōu)麒麟16.04,直接在本目錄下生成snapcraft.yaml文件,且默認(rèn)內(nèi)容也更簡(jiǎn)單) 

默認(rèn)產(chǎn)生的snapcraft.yaml是這樣的:

name: my-snap-name # you probably want to 'snapcraft register'

version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'

summary: Single-line elevator pitch for your amazing snap # 79 char long summary

description: |

  This is my-snap's description. You have a paragraph or two to tell the

  most important story about your snap. Keep it under 100 words though,

  we live in tweetspace and your description wants to look good in the snap

  store.

grade: devel # must be 'stable' to release into candidate/stable channels

confinement: devmode # use 'strict' once you have the right plugs and slots 

其中:

grade: 定義此snap的質(zhì)量等級(jí),“devel”表示開(kāi)發(fā)版本,“stable”表示穩(wěn)定版本。

confinement: 定義此snap的限制級(jí)別,“strict”,“devmode”或“classic”,每個(gè)等級(jí),軟件具有的權(quán)限不同,具體區(qū)別見(jiàn):https://snapcraft.io/docs/reference/confinement

parts:snaps的主要構(gòu)建部分,包括創(chuàng)建snap的源碼,包,壓縮包和組織步驟。

yaml文件完整語(yǔ)法規(guī)則在:https://snapcraft.io/docs/build-snaps/syntax

根據(jù)本例,修改默認(rèn)內(nèi)容為如下:

name: hello-snap

version: '0.1'

summary: Say hello.

description: |

     Open a window, and say hello to the world!

grade: devel

confinement: devmode

apps:

    hello:

    command: desktop-launch hello

    plugs: [x11]       #所需系統(tǒng)權(quán)限 

parts:

    gnu-hello:

    # 參見(jiàn) 'snapcraft plugins'

    source: /home/feng/snappy_flatpak/hello.tar.gz

    plugin: cmake

    stage-packages:

        - libmirclient9

after: [desktop-gtk3]  #提供了各種gtk庫(kù) 

對(duì)于銀河麒麟社區(qū)版或者優(yōu)麒麟16.04,由于snap版本更早,我們修改snapcraft.yaml為: 

//snapcraft.yaml

name: hello-snap

version: '0.1'

summary: Say hello.

description: |

     Open a window, and say hello to the world!

apps:

     hello:

     command: hello

     plugs: [x11]

parts:

     gnu-hello:

     # 參見(jiàn) 'snapcraft plugins'

     source: /home/feng/snappy_flatpak/hello.tar.gz

plugin: cmake

stage-packages:

     - libcanberra-gtk-module:amd64

     - libcanberra-gtk3-module:amd64

after: [desktop/gtk3]       #注意此處格式不一樣 

編譯:

$ snapcraft

此命令將會(huì)在本目錄下(hello-snap)生成hello-snap_0.1_amd64.snap文件。(對(duì)于銀河麒麟社區(qū)版,需要先把/etc/lsb-release中“DISTRIB_RELEASE=4.0.2”改為“ DISTRIB_RELEASE=16.04”) 

安裝運(yùn)行:

$ sudo snap install hello-snap_0.1_amd64.snap --devmode  // 以開(kāi)發(fā)者模式安裝

$ hello-snap.hello       // 最終的程序名構(gòu)成為“name”.“apps”

對(duì)于銀河麒麟社區(qū)版和優(yōu)麒麟16.04,通過(guò)以下命令打開(kāi):

$ /snap/bin/hello-snap.hello 

你可以將此snap包上傳至ubuntu 商店(可以通過(guò)snap find 查看ubuntu 商店中現(xiàn)有的軟件),或者直接發(fā)送到其他操作系統(tǒng)上,然后通過(guò)sudo snap install 安裝(需要先安裝snapd),非常方便。 

然后,將其打包成flatpak格式。

Flatpak是一種用于構(gòu)建,分發(fā),安裝和運(yùn)行應(yīng)用程序的技術(shù)。它主要針對(duì)的是Linux桌面,通過(guò)在沙箱中隔離應(yīng)用程序來(lái)提高Linux桌面的安全性,允許應(yīng)用程序安裝在任何Linux發(fā)行版上。 

我們先來(lái)了解幾個(gè)基本概念:

運(yùn)行時(shí)(runtimes)

“運(yùn)行時(shí)”提供應(yīng)用程序所需的基本依賴(lài)。有各種各樣的“運(yùn)行時(shí)”,比如“ Freedesktop 運(yùn)行時(shí)”,“ GNOME 運(yùn)行時(shí) ”。“ Freedesktop 運(yùn)行時(shí)”包含一系列必要的庫(kù)和服務(wù),包括 D-Bus, GLib, PulseAudio, X11 和 Wayland 等。“ GNOME 運(yùn)行時(shí)”基于“ FreeDesktop 運(yùn)行時(shí)”,增加了一些GNOME平臺(tái)相關(guān)的庫(kù),比如GStreamer, GTK+, GVFS等。必須針對(duì)運(yùn)行時(shí)構(gòu)建每個(gè)應(yīng)用程序,并且必須在主機(jī)系統(tǒng)上安裝此運(yùn)行時(shí)才能運(yùn)行應(yīng)用程序。用戶(hù)可以同時(shí)安裝多個(gè)不同的運(yùn)行時(shí),包括不同版本的同一個(gè)運(yùn)行時(shí)。 

SDK(軟件開(kāi)發(fā)套件)

SDK也是一個(gè)“運(yùn)行時(shí)”,是用于構(gòu)建應(yīng)用程序的特殊類(lèi)型的運(yùn)行時(shí),它包含了構(gòu)建和打包工具,如頭文件,編譯器和調(diào)試器。通常,SDK與“運(yùn)行時(shí)”配對(duì),由應(yīng)用程序使用。 

沙箱

使用Flatpak,每個(gè)應(yīng)用程序都是在孤立的環(huán)境中構(gòu)建和運(yùn)行的。默認(rèn)情況下,應(yīng)用程序只能“查看”自身及其“運(yùn)行時(shí)”,訪問(wèn)用戶(hù)文件,網(wǎng)絡(luò),graphics sockets,總線和設(shè)備上的子系統(tǒng)必須明確授予權(quán)限,訪問(wèn)其他內(nèi)容(如其他進(jìn)程)是不允許的。 

安裝Flatpak

對(duì)于優(yōu)麒麟16.04,銀河麒麟社區(qū)版:

$ sudo apt install software-properties-common elfutils

$ sudo vim /etc/apt/sources.list.d/alexlarsson.list

//往alexlarsson.list添加如下兩行:

deb http://ppa.launchpad.net/alexlarsson/flatpak/ubuntu xenial main

deb-src http://ppa.launchpad.net/alexlarsson/flatpak/ubuntu xenial main

$ sudo apt update

$ sudo apt install flatpak flatpak-builder  

對(duì)于優(yōu)麒麟17.04:

$ sudo apt install flatpak flatpak-builder 

安裝程序所需的“運(yùn)行時(shí)”和Sdk:

$ flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo

$ flatpak install gnome org.gnome.Platform//3.24 org.gnome.Sdk//3.24 

初始配置:

$ mkdir hello-flatpak && cd hello-flatpak

$ gedit com.kylin.Hello.json

添加以下內(nèi)容至com.kylin.Hello.json文件:

{

    "app-id": "com.kylin.Hello",

    "runtime": "org.gnome.Platform", ?。K琛斑\(yùn)行時(shí)”

    "runtime-version": "3.24",     

    "sdk": "org.gnome.Sdk",       #所需Sdk

    "command": "hello",

    "finish-args": ["--socket=x11"], ?。K柘到y(tǒng)權(quán)限

    "modules": [

        {

            "name": "hello",

            "cmake": true,

            "sources":[

                {

                    "type": "archive",

                    "path": "/home/feng/snappy_flatpak/hello.tar.gz"

                }

            ]

        }

    ]

}

json文件等同于前文snap的yaml文件,包含著構(gòu)建flatpak包的所有信息。 

編譯、安裝、運(yùn)行:

$ flatpak-builder --repo=repo hello com.kylin.Hello.json

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

$ flatpak --user install tutorial-repo com.kylin.Hello

$ flatpak run com.kylin.Hello 

你可以將程序打包成flatpak格式,分發(fā)出去:

$ flatpak build-bundle repo hello.flatpak com.kylin.Hello 

然后在另一個(gè)系統(tǒng)安裝這個(gè)程序(需要先安裝相應(yīng)“運(yùn)行時(shí)”和Sdk):

$ flatpak install --user --bundle hello.flatpak 

或者托管在倉(cāng)庫(kù)里(官方推薦方式),具體見(jiàn):http://docs.flatpak.org/en/latest/distributing-applications.html

更多詳細(xì)信息,可以點(diǎn)擊以下鏈接:

snap:https://www.ubuntu.com/desktop/snappy    

flatpak:http://flatpak.org/