1

这是我工作 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:脚本中使用环境变量,但我不知道我应该如何解决这个问题。

4

1 回答 1

2

Snapcraft 是一个构建时工具。install您在那里使用的scriptlet在创建快照时运行,而不是在安装快照时运行。

$SNAP_DATA及其种类($SNAP_COMMON,$SNAP_USER_DATA等)由 snapd 在运行时定义。换句话说,没有$SNAP_DATA定义 snapcraft 何时创建快照。

如果您想在$SNAP_DATA安装 snap 时将文件放入,您可以使用configure hook来实现,它在安装时运行(作为参考,这里是使用configurehook 进行健康检查的教程)。但是,由于configure钩子在服务启动后运行如果您将您更改app为守护程序,这将不起作用(假设您的服务在$SNAP_DATA启动之前需要文件)。

在这种情况下,另一个可行的选择是为您的二进制文件和/或服务创建 shell 脚本包装器,以便$SNAP_DATA在运行实际命令之前将必要的文件复制到其中。是在 Nextcloud snap 中用于执行类似操作的 Apache 示例包装器。然后你让你的library-sample应用程序调用,例如library_sample_wrapper而不是library_sample.

于 2017-04-19T20:11:31.637 回答