Как мне настроить таргетинг на $SNAP_DATA из snapcraft.yaml
Вот важные части моей работы snapcraft.yaml
...
name: my-lib
apps:
library-sample:
command: library_sample $SNAP/arg_file.json
parts:
library:
source: https://github.com/the/sample.git
plugin: cmake
install: |
cp -r samples/library_sample $SNAPCRAFT_PART_INSTALL/
cp -r ../src/samples/src/arg_file.json $SNAPCRAFT_PART_INSTALL/
cp --parents modules/dep_lib1/libdep_lib1.so $SNAPCRAFT_PART_INSTALL/
cp --parents modules/dep_lib2/libdep_lib2.so $SNAPCRAFT_PART_INSTALL/
В конечном счете, я хотел бы arg_file.json
Быть в $SNAP_DATA
вот я и поменяла
cp -r ../src/samples/src/arg_file.json $SNAPCRAFT_PART_INSTALL/
в
cp -r ../src/samples/src/arg_file.json $SNAP_DATA/
Тем не менее, это приводит к исчезновению файла из моего install
каталог (и в конечном итоге из моей установленной оснастки). Я уверен, что это потому, что $SNAP_DATA
переменная окружения недоступна для меня из install:
скриптлет, но я не знаю, как мне обойти это иначе.
1 ответ
Snapcraft - это инструмент времени сборки. install
Используемый там скриптлет запускается при создании оснастки, а не при ее установке.
$SNAP_DATA
и своего рода ($SNAP_COMMON
, $SNAP_USER_DATA
и т. д.) определяются Snapd во время выполнения. Другими словами, нет $SNAP_DATA
определяется, когда snapcraft создает моментальный снимок.
Если вы хотите поместить файлы в $SNAP_DATA
когда оснастка установлена, вы можете сделать это, используя ловушку configure, которая запускается после установки (для справки, вот руководство по использованию configure
крючок для проверки здоровья). Тем не менее, так как configure
после запуска сервисов, если вы измените app
чтобы быть демоном, это не сработает (при условии, что вашей службе нужны файлы в $SNAP_DATA
до того, как он запустится).
Другим вариантом, который будет работать в этом случае, будет создание оболочек сценариев оболочки для ваших двоичных файлов и / или сервисов для копирования необходимых файлов в $SNAP_DATA
перед запуском реальных команд. Вот пример оболочки для Apache, используемой в оснастке Nextcloud для выполнения чего-то подобного. Тогда вы делаете свой library-sample
например, вызов приложения library_sample_wrapper
вместо library_sample
,