Is there a way to expose a directory, containing static libraries files or document other than specifying every one if the files? Example, for a software repo that has this structure:
program
+---- myProgram # expose as /usr/bin/myProgram using snapcraft command
|
+---- vendors/ # expose as /libs/myProgramLib for its descendants
+---- companyA
| +---- data.txt
+---- companyB # automatically exposed as /libs/myProgramLib/companyB
| +---- data.txt # exposed as /libs/myProgramLib/companyB/data
+---- companyC
+---- data.txt
I’m aware one way is to “tar” the vendors
folder and have a single command to “untar” it to the /libs/myProgramLib
, however, I have a feeling that this is a hackish way of doing things. Those files are static non-executable files mainly for read.
The reason for exposing a single folder is mainly to isolate each companies from mangling with the snapcraft.yaml
each time anyone of them adds a data file, which has the tendency to disrupt the build process.
Attempts
Snapcraft doesn’t allow exposing a folder as a command. It will return the following error in particular:
...
IsADirectoryError: [Errno 21] Is a directory: '[targeted_command]'
Once those files are in the snap you reference them with $SNAP
as a prefix: $SNAP/path/inside/snap
. Getting those files into the snap is part of your build process, so you could for example use the dump
plugin to copy the files verbatim.
1 Like
Thanks for the guide! I’ll run a test using the dump plugin. Quick question, from user standpoint, will they see the data file, say companyB as
$SNAP/path/inside/snap
or
/libs/myProgramLib/companyB/data
based on the example?
If your build process puts the files in libs/myProgramLib
then that’s where you reference them from. If your build process puts the files elsewhere then you reference them in that location instead.
I managed to implement $SNAP
environment variable within the command application and implemented the dump
plugin. Pretty cool one. Basically, the myProgram
can read the contents insides its own snap using $SNAP
.
What about exposing the vendors
folder like a command? I want to let user access and read the data files inside those sub-directories, without specifically create command pointing to each data.txt
file?
Or am I missing something?
Do you mean access the files from outside the snap, or do you mean access the files from a different snap?
For accessing from outside, the files are all viewable (but not writable!) at /snap/<snapname>/current/...
.
To access the files from another snap you can use the content
interface by defining a slot which tells snapd which directory to expose:
slots:
vendors-slot: # this is arbitrary
content: vendors # this is the name a plug connects to
read:
- $SNAP/vendors # this is the folder you want to provide read access to
Note that files in $SNAP
are readonly due to snap filesystems being immutable because they use squashfs as the backing file format.
Outside the snap for user, apart from poking into the snap body like the one you mentioned. E.g. User can do:
$ cat /libs/myProgramLib/companyB/data.txt # for $SNAP/vendors/companyB/data.txt
Read access is sufficient. Is this type of export possible?