Snapcraft:多应用客户端-服务端snap开发教程

by liam zheng on 31 March 2020

在过去几个月我们发布了一些如何使用RustJavaC/C++和其他语言来开发snap桌面应用的文章。在这些从入门到精通的教程中,我们以一个代表性的snapcraft.yaml文件来介绍开发构建snap所需的具体细节。

今天,我们希望脱离这一过程,而将重点放在服务器端。我们将为你提供一个包含两个有趣组件的snapcraft.yaml的概述:a)它将拥有多个应用程序; 通常,snap包含一个应用程序。b)它具有简单的后台服务,其他应用程序可以连接到该服务。 我们一起来看一下。

Snapcraft yaml

以下是snapcraft.yaml文件的内容:

apps:
  borg:
    command: bin/borg
    daemon: simple
    restart-condition: on-abnormal
    plugs:
      - home
      - network
      - network-bind
  locutus:
    command: bin/locutus
    plugs:
      - home
      - network

里面的内容是什么?

首先,我们申明了一个名为borg应用程序的服务端bundle。 它是一个简单的服务,重启条件是on-abnormal”(一个基于systemd返回值的systemd状态)。

其次,为了让服务能工作,它需要能够于网络端口绑定。因此,我们定义了network-bind接口。请主义如果你的应用程序需要绑定特殊权限的端口,你需要使用sudo来让它能正常运行。snaps的使用不会改变底层的安全要求。

我们也定义了home目录和网络的访问权(以便于服务可以立即读取一个配置文件),使得应用程序可以使用网络。除声明绑定外,这些是必需的,除非你的服务被设计为仅在本机上运行和监听。

在第二部分,我们申明了客户端的bundle,即仅需要访问home目录(配置文件、证书等等)和网络。通过上述操作,你可以在各种系统上以一种经典客户端-服务端的模型来运行snap的组件应用。

如何调用一个多应用的snap程序?

你可能有关于单个snap内包含多个应用程序调用的疑问,以及用户如何运行他们。当一个应用程序名称符合snap名称时,例如: igor,那么你只需要运行“igor”或者“/snap/bin/igor”。在这里,调用稍微有些不同。我们以名为“picard”的snap举例,基于上述内容,要运行服务端,操作命令为:

picard.borg

相似地,要运行客户端,命令为:

picard.locutus

用户也可以手动创建aliases来使用上应用程序。同时,在没有明显的名称空间冲突的情况下,开发者可以要求Snap应用商店团队为其软件自动创建别名。这也能达到一种顺畅和无缝的用户体验。在这个例子中,borg会被映射成picard.borg,locutus也会被映射成picard.locutus。

总结

我们希望今天的教程能把如何开发snap的过程和包括多应用程序和客户端-服务器方案变得更简易清楚。当然,创建snapcraft.yaml只是开发工作中一个部分,你也需要确保你的软件组件能互相正常工作。不过,现在你已经了解了snapcraft部分的内容了。

如何你有其他的评论或者需要更多相关可以帮助到你的内容,请加入我们的论坛与我们一起探讨。

封面图片来自于: Marlon CoronaUnsplash

Newsletter Signup

Related posts

Snapcraft development tips: how to troubleshoot snaps with services

In the past, we have discussed various ways on how to debug and troubleshoot potential issues during snap development. The ability to quickly iterate, resolve build process hurdles and publish the application in a timely manner is essential to a robust, positive development experience. Today, we would like to outline a few basic tips and […]