2017-04-19 18 views
1

,目標$ 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: scriptlet中可用的,但我不知道應該如何解決此問題。

回答

2

Snapcraft是一個構建時間工具。您正在使用的install scriptlet在創建管理單元時運行,而不是安裝管理單元時。

$SNAP_DATA及其種類($SNAP_COMMON$SNAP_USER_DATA,等)由在snapd 運行時定義。換句話說,當snapcraft創建捕捉時,沒有定義$SNAP_DATA

如果你想在安裝卡扣時將文件放入$SNAP_DATA,您可以通過利用configure hook,其安裝後運行,這樣做(僅供參考,here是使用configure鉤接受健康檢查的教程)。不過,由於服務啓動後,configure鉤子運行,所以如果您將app更改爲守護進程,這將不起作用(假定您的服務在啓動之前需要$SNAP_DATA中的文件)。

在這種情況下工作的另一種方法是在運行真實命令之前,爲您的二進制文件和/或服務創建shell腳本包裝以將必要文件複製到$SNAP_DATAHere是在Nextcloud快照中用於執行類似操作的Apache的示例包裝器。然後,您可以撥打library-sample應用,例如library_sample_wrapper而不是library_sample

+0

謝謝你的指針!我將在嘗試執行此檢查之前嘗試執行此操作。 – Zak