In the tutorial How to create a snap for how2 (stackoverflow from the terminal) in Ubuntu 16.04 we saw how to create a snap with snapcraft for the CLI utility called how2. That was a software based on nodejs.
In this post we will repeat the process for another CLI utility called howdoi by Benjamin Gleitzman, which does a similar task with how2 but is implemented in Python and has a few usability differences as well. howdoi does not have yet a package in the repositories of Ubuntu, either.
Since we covered already the details in How to create a snap for how2 (stackoverflow from the terminal) in Ubuntu 16.04, this post would be more focused, and shorter. 🙂
Reading through https://github.com/gleitz/howdoi we see that howdoi
- is software based on Python (therefore: plugin: python)
- requires networking (therefore: plugs: [network])
- and has no need to save files (therefore it does not need access to the filesystem)
Crafting with snapcraft
Let’s start with snapcraft.
$ mkdir howdoi $ cd howdoi/ $ snapcraft init Created snap/snapcraft.yaml. Edit the file to your liking or run `snapcraft` to get started
Now we edit snap/snapcraft.yaml and here are our changes (in bold) from the initial generated file.
$ cat snap/snapcraft.yaml name: howdoi # you probably want to 'snapcraft register <name>' version: '20170207' # just for humans, typically '1.2+git' or '1.3.2' summary: instant coding answers via the command line # 79 char long summary description: | Are you a hack programmer? Do you find yourself constantly Googling for how to do basic programing tasks? Suppose you want to know how to format a date in bash. Why open your browser and read through blogs (risking major distraction) when you can simply stay in the console and ask howdoi. grade: stable # must be 'stable' to release into candidate/stable channels confinement: strict # use 'strict' once you have the right plugs and slots apps: howdoi: command: howdoi plugs: [network] parts: howdoi: plugin: python source: https://github.com/gleitz/howdoi.git
First, we selected to use the name howdoi because again, it’s not a reserved name :-). Also, we registered it with snapcraft,
$ snapcraft register howdoi Registering howdoi. Congratulations! You're now the publisher for 'howdoi'.
Second, we did not notice a particular branch or tag for howdoi, therefore we put the date of the snap creation.
Third, the summary and the description are just pasted from the Readme.md of the howdoi repository.
Fourth, we select the grade stable and enforce the strict confinement.
The apps: howdoi: command: howdoi is the standard sequence to specify the command that will be exposed to the user. The user will be typing howdoi and the command howdoi inside the snap will be invoked.
The parts: howdoi: plugin: python source: … is the standard sequence to specify that the howdoi that was referenced just earlier, is software written in Python and the source comes from this github repository.
Let’s craft the snap.
$ snapcraft Preparing to pull howdoi ... Pulling howdoi ... Preparing to build howdoi Building howdoi ... Successfully built howdoi ... Installing collected packages: howdoi, cssselect, Pygments, requests, lxml, pyquery, requests-cache Successfully installed Pygments-2.2.0 cssselect-1.0.1 howdoi-1.1.9 lxml-3.7.2 pyquery-1.2.17 requests-2.13.0 requests-cache-0.4.13 Staging howdoi Priming howdoi Snapping 'howdoi' | Snapped howdoi_20170207_amd64.snap $ snap install howdoi_20170207_amd64.snap --dangerous howdoi 20170207 installed $ howdoi format date bash DATE=`date +%Y-%m-%d` $ _
Beautiful! It worked!
Publish to the Ubuntu Store
Let’s publish the snap to the Ubuntu Store. We are going to push the file howdoi_20170207_amd64.snap and then check that it has passed the automatic checking. Once it has done so, we release to the stable channel.
$ snapcraft push howdoi_20170207_amd64.snap Pushing 'howdoi_20170207_amd64.snap' to the store. Uploading howdoi_20170207_amd64.snap [=============================================================] 100% Ready to release!| Revision 1 of 'howdoi' created.
Just a reminder: We can release the snap to the stable channel simply by running snapcraft release howdoi 1 stable. The alternative to this command, is to do all the following through the Web.
We log in into https://myapps.developer.ubuntu.com/ to check whether snap is ready to publish. In the following screenshots, you would click where the arrows are showing. See the captions for explanations.