在今天的文章中,我们来介绍如何snap Shadowsocks应用,并发布到Ubuntu商店.
1)创建snapcraft.yaml文件
我们可以在github的地址https://github.com/shadowsocks/shadowsocks-qt5找到这个项目的源码.这是一个Qt的项目.为此,我们创建了一个如下的snapcraft.yaml文件:
snapcraft.yaml
name: ss-qt # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: Shadowsocks
description: |
This is shadowsocks snap app
grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots
apps:
ss-qt:
command: desktop-launch $SNAP/usr/bin/ss-qt5
plugs: [home,opengl,network,unity7,browser-support,network-bind]
parts:
ss:
plugin: qmake
source: https://github.com/shadowsocks/shadowsocks-qt5
source-type: git
qt-version: qt5
stage-packages:
- libzbar-dev
- libappindicator-dev
- libbotan1.10-dev
- libqrencode-dev
- libqtshadowsocks-dev
- libqtshadowsocks
after: [desktop/qt5]
在我们创建这个snapcraft.yaml的文件时,我们可以使用:
$ snapcraft init
命令来创建这个template. 关于这个项目所需要的stage-packages,我们可以参照项目所在的debian包的依赖:
https://github.com/shadowsocks/shadowsocks-qt5/blob/master/debian/control
Source: shadowsocks-qt5
Section: net
Priority: extra
Maintainer: Symeon Huang <hzwhuang@gmail.com>
Build-Depends: debhelper (>= 9),
pkg-config,
qt5-qmake,
qtbase5-dev,
libqrencode-dev,
libqtshadowsocks-dev (>= 1.9.0),
libzbar-dev,
libappindicator-dev,
libbotan1.10-dev
Standards-Version: 3.9.6
Homepage: https://github.com/librehat/shadowsocks-qt5
Vcs-Git: https://github.com/librehat/shadowsocks-qt5.git
Vcs-Browser: https://github.com/librehat/shadowsocks-qt5
Package: shadowsocks-qt5
Architecture: any
Depends: ${shlibs:Depends},
libqtshadowsocks (>= 1.9.0)
Description: A cross-platform shadowsocks GUI client
Shadowsocks-Qt5 is a native and cross-platform shadowsocks GUI client
with advanced features.
在这个项目中,我们也使用了一个叫做"desktop/qt5"的remote part.这个remote part是由别人已经做好的.我们直接来使用.这是因为这个项目是一个Qt项目,所以我们需要desktop-launch来启动该应用.关于所有的remote part我们可以参阅连接remote part(https://wiki.ubuntu.com/snapcraft/parts).当然,我们也可以直接通过如下的命令来查看:
$ snapcraft update
$ snapcraft search
liuxg@liuxg:~/snappy/desktop/ss$ snapcraft search
PART NAME DESCRIPTION
checkbox Part that supplies the latest stable version of the Checkbox t...
checkbox-dev Part that supplies the latest stable version of the Checkbox t...
checkbox-ng-dev Part that supplies the latest stable version of the Checkbox t...
checkbox-support-dev Part that supplies the latest stable version of the Checkbox t...
curl A tool and a library (usable from many languages) for client s...
desktop-glib-only Helpers for glib minimal launchers.
desktop-gtk2 Helpers for gtk2 minimal launchers.
desktop-gtk3 Helpers for gtk3 minimal launchers.
desktop-qt4 Helpers for qt4 minimal launchers.
desktop-qt5 Helpers for qt5 minimal launchers.
desktop/glib-only Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/gtk2 Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/gtk3 Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/qt4 Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
desktop/qt5 Helpers for gtk2, gtk3, qt4 and qt5 or glib minimal launchers.
dnsmasq Network infrastructure swiss-army knife
ffmpeg This sets up ffmpeg for projects.
gtkconf This sets up the GTK environment for GTK-based projects
modemmanager Part providing access to the ModemManager client utilities nam...
mongodb A document-oriented database
mqtt-paho-python2 mqtt-paho for python.
mqtt-paho-python3 mqtt-paho for python.
mqtt-paho/python2 mqtt-paho for python.
mqtt-paho/python3 mqtt-paho for python.
networkmanager Part providing access to the NetworkManager client utilities n...
openssh OpenSSH is the premier connectivity tool for remote login with...
plainbox-dev Part that supplies the latest stable version of the Checkbox t...
plainbox-provider-docker Tests to certify the correct functioning of Docker containers ...
plainbox-provider-ipdt Tests to certify the correct functioning of devices running re...
plainbox-provider-snappy Tests to certify the correct functioning of devices running re...
plainbox-provider-snappy-resource Resource jobs are that are used to gather information about a ...
plainbox-provider-tpm2 Tests to certify the correct functioning of TPM2 devices
qt4conf This sets up qt4.conf for projects using qml and other qt4 com...
qt57 Qt 5.7 part. Lets you use newer Qt than what is available in U...
qt5conf This sets up qt5.conf for projects using qml and other qt5 com...
simple-make-filesets The filesets test from the integration test suite.
tpm-tools Part containing utilities to interact with a TPM chip being pa...
tpm2-tss Implementation of the TPM 2.0 Software Stack (TSS). See https:...
wafdemo Waf c Demo
由于我们需要"desktop/qt5",然后才能编译我们的"ss"part,所有我们使用了关键词after.关于snapcraft的更多syntax的介绍,我们可以参阅http://snapcraft.io/docs/build-snaps/syntax,最终,我们的源码可以在如下的地址找到:
https://github.com/liu-xiao-guo/ss-qt
我们在我们的snapcraft.yaml文件所在的目录中,打入如下的命令:
$ snapcraft
如果顺利的话,我们就可以在我们的当前的目录中找到最终生产的.snap包文件:
liuxg@liuxg:~/snappy/desktop/ss$ tree -L 1
.
├── parts
├── prime
├── setup
├── snapcraft.yaml
├── ss-qt_0.1_amd64.snap
└── stage
这里的parts,stage及prime都是在编译过程中所生产的中间文件目录.其中prime目录中的所有文件就是我们最终安装到电脑系统中所有的文件:
liuxg@liuxg:~/snappy/desktop/ss/prime$ tree -L 2
.
├── bin
│ └── desktop-launch
├── command-ss-qt.wrapper
├── etc
│ ├── drirc
│ ├── fonts
│ ├── gss
│ ├── gtk-2.0
│ ├── gtk-3.0
│ ├── init.d
│ ├── profile.d
│ ├── ucf.conf
│ ├── X11
│ └── xdg
├── flavor-select
├── lib
│ └── x86_64-linux-gnu
├── meta
│ ├── gui
│ └── snap.yaml
├── usr
│ ├── bin
│ ├── include
│ ├── lib
│ ├── sbin
│ └── share
└── var
└── lib
从上面可以看出来,在prime目录中,它包含了一个snap运行所需要的所有的文件(包括运行库).一个snap包被称作为self-contained,也即它不依赖于OS所提供的任何库.如果需要OS的资源的话,它必须是通过interfaces来完成的.
为了能够使得我们的应用在dash中可以被启动,我们在我们的根目录下创建一个setup/gui的目录,并把我们所需要的图标放入到该目录中.这样在最终的snap包中,就含有desktop所需要的信息.这个信息可以在上面所示的meta/gui中找到.
我们的.snap文件在本地,所以我们可以通过如下的命令:
$ sudo snap install *.snap --dangerous
来完成我们的安装.等安装完后,我们可以在我们的Desktop的dash中看到:
点击上面的图标,我们就可以启动我们的Shadowsocks应用了.这个snap应用可以使用所有支持snapd的Linux的发行版.用户一旦安装,不需要再安装任何其它的依赖库.
2)发布我们的应用
在这一节中,我们来介绍如何发布一个应用到我们的应用商店.
为了能够在Ubuntu商店中发布我们的应用,我们必须在地址 https://myapps.developer.ubuntu.com/注册我们的账号.在创建的过程中,我们必须选一个我们自己独有的"developer namespace".这个namespace将成为我们发布应用名称的一部分.比如针对我的情况,我的namespace是"xiaoguo".
首先在我们的项目的根目录中(.snap文件所在的目录),打入如下的命令:
我们通过snapcraft login命令来登陆我们的商店.我们使用如下的snap register命令来为我们的应用注册一个名字:
在这里,我们选择"ss-qt"来作为我们的应用名称.我们使用snapcraft push命令来把我们的应用上传到商店.最后,我们使用snapcraft release命令来发布我们的应用.
等我们发布完我们的应用后,我们可以通过如下的命令来进行安装我们的应用.
$ sudo snap find ss-qt
$ sudo snap install ss-qt
从上面可以看出来,我的namespace "xiaoguo"在上面作为Developer列出来了.至此,我们的应用已经发布到我们的商店了.可以供其它的使用者进行使用了.
这个应用可以在其它许多的Linux发行版中安装并运行.我们可以参照http://snapcraft.io/docs/core/install来安装到其它的Linux发行版中。