以下是 工作 K
的重要部分......
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
scriptlet无法使用$SNAP_DATA
环境变量,但我不知道如何解决这个问题。
答案 0 :(得分:2)
Snapcraft是一种构建时工具。您正在使用的install
scriptlet在创建快照时运行 ,而不是在安装快照时运行。
$SNAP_DATA
及其类型($SNAP_COMMON
,$SNAP_USER_DATA
等)由snapd在运行时定义。换句话说,当snapcraft创建快照时,没有定义$SNAP_DATA
。
如果要在安装快照时将文件放入$SNAP_DATA
,可以使用安装时运行的configure hook来实现此目的(作为参考,here是一个教程使用configure
挂钩进行健康检查)。但是,由于{/ 1>}挂钩在服务启动后运行,如果您将configure
更改为守护程序,这将无法正常工作(假设您的服务需要文件) app
才能启动它。
在这种情况下可以使用的另一个选项是为二进制文件和/或服务创建shell脚本包装器,以便在运行实际命令之前将必要的文件复制到$SNAP_DATA
。 Here是在Nextcloud snap中用于执行类似操作的Apache的示例包装器。然后,您就可以进行$SNAP_DATA
个应用调用,例如library-sample
代替library_sample_wrapper
。