Today I released version 0.6.13 of flatpak which has a lot of nice new features. One that I’d like to talk a bit about is the new command line argument format.
The flatpak command line was always a bit low-level and hard to use. Partly this was because of lack of focus on this, and partly due to the fact that the expected UI for flatpak for most people would be a graphical user interface like gnome-software. However, with this new release this changed, and flatpak is now much nicer to use from the commandline.
So, what is new?
Before you can really use flatpak you have to configure it so it can find the applications and runtimes. This means setting up one or more remotes. Historically you did this by manually specifying all the options for the remote as arguments to the
flatpak remote-add command. To make this easier we added a file format (
.flatpakrepo) to describe a remote, and made it easy to use it.
The new canonical example to configure the gnome stable repositories is:
$ flatpak remote-add --from gnome \
$ flatpak remote-add --from gnome-apps \
Alternatively you can just click on the above links and they should open in gnome-software (if you have new enough versions installed).
Multiple arguments to install/update/uninstall
Another weakness of the command line has been that commands like install, uninstall and update only accepted one application name argument (and optionally a branch name). This made it hard to install multiple apps in one go, and the separate branch name made it hard to cut-and-paste from output of e.g.
Instead of the separate branch name all the commands now take multiple “partial refs” as arguments. These are partial versions of the OSTree ref format that flatpak uses internally. So, for an internal reference like
app/org.gnome.gedit/x86_64/stable, one can now specify one of these:
And flatpak will automatically fill in the missing part in a natural way, and give a detailed error if you need to specify more details:
$ flatpak install gnome org.gnome.Platform
error: Multiple branches available for org.gnome.Platform, you must specify one of: org.gnome.Platform//3.20, org.gnome.Platform//3.22, org.gnome.Platform//3.16, org.gnome.Platform//3.18
The other problem with the CLI has been that it is not aware of runtime dependencies. To run an app you generally had to know what runtime it used and install that yourself. The idea here was that the commandline should be simple, non-interactive and safe. If you instead use the graphical frontend it will install dependencies interactively so you can control where things get installed from.
However, this just made the CLI a pain to use, and you could easily end up in situations where things didn’t work. For instance, if you updated gedit from 3.20 to 3.22 it suddenly depended on a new runtime version, and if you weren’t aware of this it probably just stopped working.
Of course, we still can’t just install dependencies from wherever we find them, because that would be a security issue (any configured remote can supply a runtime for any applications). So, the solution here is for flatpak to become interactive:
$ flatpak update org.gnome.gedit
Looking for updates...
Required runtime for org.gnome.gedit/x86_64/stable (org.gnome.Platform/x86_64/3.22) is not installed, searching...
Found in remote gnome, do you want to install it? [y/n]: y
Installing: org.gnome.Platform/x86_64/3.22 from gnome
Installing: org.gnome.Platform.Locale/x86_64/3.22 from gnome
Updating: org.gnome.gedit/x86_64/stable from gnome-apps
Updating: org.gnome.gedit.Locale/x86_64/stable from gnome-apps
If you have remotes you never want to install dependencies from, you can install them with
--no-use-for-deps, and they will not be used. Flatpakrepo files for app-only repositories should set
Note that this is not a package-system-like dependency solver that can solve sudoku. It is still a very simple two-way split.
The primary way Flatpak is meant to be used is that you configure a few remotes that has most of the applications that you use, then you install from these either on the command line, or via a graphical installer. However, sometimes it is nice to have a single link you can put on a website to install your application. Flatpak now supports that via
.flatpakref files. These are very similar to flatpakrepo files, in that they describe a repository, but they additionally contain a particular application in that repository which will be installed.
Such files can be installed by just clicking on them in your web-browser (which will open them for installation in gnome-software) or on the command line:
flatpak install --from https://sdk.gnome.org/gedit.flatpakref
This will try to install the required runtime, so you first need to add the remote with the runtimes.
During development and testing it is often common to launch commands in a sandbox to experiment with how the runtime works. This was always possible by running a custom command in an application that used the runtime, like so:
$ flatpak run --command=sh org.gnome.gedit
sh-4.3$ ls /app
bin lib libexec manifest.json share
You can even specify a custom runtime with
--runtime. However, there really should be no need to have an application installed to do this, so the new version allows you to directly run a runtime:
$ flatpak run org.gnome.Platform//3.22
sh-4.3$ ls /app