如何向snapcraft添加自定义PPA

时间:2017-04-12 11:55:00

标签: snapcraft

基本问题/目标:

我希望能够使用一些共享库,这些库应该在自定义PPA的cmake步骤(插件)之前获取。

snapcraft.yaml:

name: mraa-blink-example
version: 'Latest' 
summary: mraa for snapcraft
description: |
  Blink Example from MRAA lib

grade: stable #devel # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots

apps:
  blinkapp:
    command: bin/blink    

parts:
  blink:
    plugin: cmake
    build-packages:
      - libmraa1 
      - libmraa-dev 
      - mraa-tools 
      - python-mraa 
      - python3-mraa

的CMakeLists.txt

cmake_minimum_required(VERSION 2.8.9)
project (MRAA)

file(GLOB SOURCES "src/*.cpp")

#For the shared library:
set ( PROJECT_LINK_LIBS libmraa.so )
add_executable(blink ${SOURCES})
target_link_libraries(blink ${PROJECT_LINK_LIBS} )
install(TARGETS blink DESTINATION /bin)

因为构建包来自自定义PPA,所以我收到错误:

  

无法在' build-packages'中找到所需的包:"缓存有   没有名为' libmraa-dev'"

的软件包

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

<强>背景

努力将Gnome Libraries抽象为一个独立的平台&#34;使用Ubuntu桌面团队的Gnome-3-26 PPA在Launchpad上构建的snap。 PPA包含编译的gnome平台,以适应Ubuntu Xenial(16.04)的运行时环境,该环境允许针对较新的Gnome构建快照,而不是构建环境通常包含的。但这需要在构建环境中使用自定义PPA,并且像我一样努力解决如何执行此操作。

一旦您启用了gnome-platform PPA,您仍然需要将捕捉链接到运行时捕捉。通过添加连接到gnome-3-26-1604的插件并使用desktop-gnome-platform帮助程序来处理此问题

我的解决方案:

我决定使用多部分构建,主要应用程序&#34;部分&#34;取决于宣称使用&#34; nil&#34;插件意味着它实际上并没有做任何事情。然后我添加了一个&#34;准备&#34;编写nil部分的脚本,用于添加PPA,它的PGP密钥,以及强制更新/升级周期。

我认为这需要是一个单独的部分,而不是作为主应用程序的准备脚本,因为在运行准备脚本之前获取构建包,这意味着它将无法找到依赖项的包并且死有一个很好的错误消息。这是通过执行多部分方法来解决的。我用它来构建几天前代表Snapcrafters努力宣布的gnome-twitch快照。

示例:

下面是gnome-twitch snapcraft.yaml的不完整粘贴,用于解释我是如何做到的:

parts:
  prepare:
    plugin: nil
    prepare: |
      echo "deb http://ppa.launchpad.net/ubuntu-desktop/gnome-3-26/ubuntu xenial main" | tee /etc/apt/sources.list.d/gnome-3-24.list
      apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 399B698EEA9EF163B6F9A0F62CC98497A1231595
      apt update
      apt upgrade -yy
    prime: [-*]
  ...
  gnome-twitch:
    after: [prepare, desktop-gnome-platform]
    ...

plugs:
  gnome-3-26-1604:
    interface: content
    content: gnome-3-26-1604
    target: gnome-platform
    default-provider: gnome-3-26-1604

apps:
  gnome-twitch:
    command: desktop-launch $SNAP/usr/bin/gnome-twitch
    plugs:
      - ... # all the plugs required
      - gnome-3-26-1604

答案 1 :(得分:0)

不幸的是,以上答案不再适用于最近对snapcraft的更改。根据上面Daniel的回答,当前有效的设置如下:

首先,在根范围内,我们需要设置体系结构以匹配PPA中已构建的软件包:

architectures:
  - build-on: amd64
    run-on: amd64

我们需要software-properties-commondirmngr才能访问aptapt-key

build-packages:
  [... other packages ...]
  - software-properties-common
  - dirmngr

通过覆盖 pull阶段:

parts:
  add-ppa:
    plugin: nil
    override-pull: |
      echo "deb http://ppa.launchpad.net/[... your ppa ...]/ubuntu bionic main" | tee /etc/apt/sources.list.d/custom.list
      apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [... your key ...]
      apt update
      apt upgrade -yy

最后,我们将add-ppa部分添加为“主要”部分的依赖项:

parts:
  [... other parts ...]

  core:
    after: [add-ppa]