Как мне настроить таргетинг на $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,

Другие вопросы по тегам