layout | title |
---|---|
base |
Plugins |
Plugins are pieces of Python code that tell Snapcraft how to build the content of a snap's parts. There are a variety of plugins already included with snapcraft. You can find the current list from $ snapcraft list-plugins
, and you should find plugins covering Python 2 and 3, Go, Java, cmake- and autotools-based projects, and more. These supplied plugins will usually be adequate for building most snaps.
See the Plugins reference for the full list of implemented ones.
Snapcraft plugins implement a lifecycle over the following steps:
pull
: retrieve the source for the part from the specified locationbuild
: drive the build system determined by the choice of pluginstage
: consolidate desireable files from all the parts in one treeprime
: distill down to only the files which will go into the snapsnap
: compress the prime tree into the installable snap file
These steps correspond to snapcraft commands. So when you initiate a snapcraft pull
you will invoke the respective plugin for each part in the snap, in sequence, to handle the source pull. Each part will then have a fully populated parts/<part-name/>/src/
directory. Similarly, if you then say snapcraft build
you will invoke the plugin responsible for each part in turn, to build the part.
Snapcraft also allows you to add your own plugins written in Python.
You can find a lot of custom plugins in this repository of examples contributed by the community (such as Intellij Idea, Kylin icon theme, MirageOS).
To illustrate how a plugin is created, let's consider adding support for a custom build-tool named "Crafty". The goal of this plugin is to pass a configurable target to the crafty sometarget
command inside the src/crafty
source directory.
Relative to the directory of snapcraft.yaml
, create snap/plugins/x-crafty.yaml
containing:
options:
source:
required: true
source-type:
source-tag:
source-branch:
crafty-target:
required: true
and snap/plugins/x_crafty.py
containing:
import snapcraft
class XCraftyPlugin(snapcraft.BasePlugin):
def build(self):
return self.run([‘crafty’, self.options.crafty_target])
def pull(self):
return self.handle_source_options()
Note that to avoid collisions with official part plugins, the names are prefixed with "x": x_crafty
, and x-crafty
.
This part plugin is then used in snapcraft.yaml
with:
parts:
crafted-bits:
plugin: x-crafty
source: src/crafty
crafty-target: sometarget
New part plugins are placed in the snap's source directory along snapcraft.yaml
as they mature, then submitted as patches to the Snapcraft project for everyone to use.
If you would like to explore plugins further, here are a couple of plugin examples and basic building details:
Get more info from:
$ snapcraft help autotools
$ snapcraft help make
Get more info from:
$ snapcraft help go