红联Linux门户
Linux帮助

在Ubuntu Desktop上开发classic snap应用

发布时间:2017-01-07 09:39:37来源:ubuntutouch作者:ubuntutouch
在最新的snapd 2.20中,它开始支持一个叫做classic模式的snap 应用开发.这种classic可以使得我们的应用开发者能够快速地开发我们所需要的应用,这是因为我们不必要对我们的现有的应用做太多的改变.在classic模式下的应用,它可以看见host系统的所有的位于"/"下的文件,就像我们目前正常的应用一样.但是在安装我们的应用后,它的所有文件将位于/snap/foo/current下.它的执行文件将位于/snap/bin目录下,就像我们目前的所有其它的snap应用一样.
当我们安装我们的classic模式下的snap应用时,我们需要使用--classic选项.在上传我们的应用到Ubuntu Core商店时,也需要人工检查.它可以看见位于/snap/core/current下的所有的文件,同时也可以对host里的任何位置的文件进行操作.这样做的目的是为了能够使得开发者快速地发布自己的以snap包为格式的应用,并在以后的开发中逐渐运用Ubuntu Core的confinement以得到完善.在目前看来,classic模式下的应用在可以遇见的将来不能够安装到all-snap系统中,比如Ubuntu Core 16.
对于classic模式的应用来说,它的"/"目录对应于host系统的"/".更多的信息可以参阅地址:http://snapcraft.io/docs/reference/confinement
 
安装
在开发之前,我们在desktop上安装core而不是ubuntu-core.我们可以用snap list命令来查看:
liuxg@liuxg:~$ snap list  
Name          Version  Rev  Developer  Notes  
core          16.04.1  714  canonical  -  
firefox-snap  0.1      x1              classic  
hello         1.0      x1              devmode  
hello-world   6.3      27   canonical  -
如果你的系统里是安装的ubuntu-core的话,建议大家使用devtool中的reset-state来使得我们的系统恢复到最初的状态(没有任何安装的snap).在以后的snapd发布中,我们将不再有ubuntu-core这个snap了.
在今天的教程中,我们来做一个例程来进行将讲解:
https://github.com/liu-xiao-guo/helloworld-classic
在上面的例程中,它的snapcraft.yaml的文件如下:
 
snapcraft.yaml
name: hello  
version: "1.0"  
summary: The 'hello-world' of snaps  
description: |  
This is a simple snap example that includes a few interesting binaries  
to demonstrate snaps and their confinement.  
* hello-world.env  - dump the env of commands run inside app sandbox  
* hello-world.evil - show how snappy sandboxes binaries  
* hello-world.sh   - enter interactive shell that runs in app sandbox  
* hello-world      - simply output text  
grade: stable  
confinement: classic  
type: app  #it can be gadget or framework  
apps:  
env:  
command: bin/env  
evil:  
command: bin/evil  
sh:  
command: bin/sh  
hello-world:  
command: bin/echo  
createfile:  
command: bin/createfile  
createfiletohome:  
command: bin/createfiletohome  
listhome:  
command: bin/listhome  
showroot:  
command: bin/showroot  
parts:  
hello:  
plugin: dump  
source: . 
从上面的例程中,我们可以看出来,我们在confinement的位置定义为:
confinement: classic
这定义了我们的这个snap应用是一个classic的应用.我们安装时也必须使用--classic的选项来进行安装.细心的开发者会发现,在我们的应用中,我们没有定义任何的plug,也就是我们没有使用任何的interface.大家可以和我们的另外一个项目https://github.com/liu-xiao-guo/helloworld-demo进行比较一下.
就像我们之前所说的,我们只希望能尽快把我们的应用以snap形式发布,在classic模式下,我们暂时不考虑安全的问题.
我们可以打包我们的应用,并以如下的命令来进行安装:
$ sudo snap install hello_1.0_amd64.snap --classic --dangerous
我们的脚本showroot内容如下:
#!/bin/bash  
cd /  
echo "list all of the content in the root:"  
ls  
echo "show the home content:"  
cd home  
ls
当我们运行我们的应用showroot时,我们可以看到:
liuxg@liuxg:~/snappy/desktop/helloworld-classic$ hello.showroot   
list all of the content in the root:  
bin    core  home        lib     media  proc  sbin  sys  var  
boot   dev   initrd.img      lib64   mnt    root  snap  tmp  vmlinuz  
cdrom  etc   initrd.img.old  lost+found  opt    run   srv   usr  vmlinuz.old  
show the home content:  
liuxg  root.ini  
liuxg@liuxg:~/snappy/desktop/helloworld-classic$ ls /  
bin    core  home            lib         media  proc  sbin  sys  var  
boot   dev   initrd.img      lib64       mnt    root  snap  tmp  vmlinuz  
cdrom  etc   initrd.img.old  lost+found  opt    run   srv   usr  vmlinuz.old
显然,它可以看到我们整个host系统的文件目录.这个应用时间上可以对它所看到的文件及目录进行操作.
当然,我们也可以运行evil脚本:
#!/bin/sh  
set -e  
echo "Hello Evil World!"  
echo "This example demonstrates the app confinement"  
echo "You should see a permission denied error next"  
echo "Haha" > /var/tmp/myevil.txt  
echo "If you see this line the confinement is not working correctly, please file a bug"
运行结果如下:
liuxg@liuxg:~/snappy/desktop/helloworld-classic$ hello.evil  
Hello Evil World!  
This example demonstrates the app confinement  
You should see a permission denied error next  
If you see this line the confinement is not working correctly, please file a bug
显然在我们没有使用interface的情况下,我们可以想其它的任何目录进行操作,并写入我们想要的数据.confinement在classic模式下不起任何的作用.对于我们开发者来说,我们只需要快速地把我的应用打包为snap即可.
最后,作为一个速成的例子,我们通过classic模式来快速地把Firefox打包为一个snap:
 
Firefox snapcraft.yaml
name: firefox-snap  
version: '0.1'  
summary: "A Firefox snap"  
description: "Firefox in a classic confined snap"  
grade: devel  
confinement: classic  
apps:  
firefox-snap:  
command: firefox  
aliases: [firefox]  
parts:  
firefox:  
plugin: dump  
source: https://download.mozilla.org/?product=firefox-50.1.0-SSL&os=linux64&lang=en-US  
source-type: tar
在这里,我们直接下载我们需要的版本,并进行打包.安装并运行我们的Firefox应用:
在Ubuntu Desktop上开发classic snap应用
整个项目的源码在地址:https://github.com/liu-xiao-guo/firefox-snap
 
本文永久更新地址:http://www.linuxdiyf.com/linux/27585.html