Snap 包:"staging" 和 "priming" 步骤的目的是什么?

Snap packages: What is the purpose of the "staging" and "priming" steps?

我已经成功创建并上传了一个快照包(教程很棒)。但是,我想知道在每个构建步骤中到底发生了什么,以及我如何利用它们。

过程好像是pull -> build -> stage -> prime -> snap.

据我观察,似乎 "pull" 将文件放入 parts/<part name>/src/ 文件夹,"build" 将文件放入 parts/<part name>/build/ 文件夹,"stage" 将文件放入在 stage/ 文件夹中,"prime" 将文件放入 prime/parts/<part name>/install/ 文件夹中。

作为新手,我会告诉你我从一个 snapcraft.yaml 文件开始,我调用 snapcraft 然后我得到了一个快照;一个步骤的过程。我知道每个 "part" 都有一个 stage:prime: 部分,但我不知道如何或为什么要利用这些步骤。我发现唯一有用的是 install: 以及 snapcraft.yaml 文件可用的 $SNAPCRAFT_PART_INSTALL 环境变量。

stage:prime: 部分允许我做哪些 install:$SNAPCRAFT_PART_INSTALL 无法实现的事情?

As a novice, I would tell you I start with a snapcraft.yaml file, I call snapcraft and I get a snap; a one step process.

这很公平,如果您的快照相对简单,这可能就是您所需要的!但是您在确定生命周期步骤时是正确的:它们是按顺序排列的;

  1. pull 这一步发生在每个部分。这是使用 source*sourcesource-tag 等)属性的地方。如果 source 指向 git 存储库,它将克隆它,等等

  2. 建造

    build 这一步发生在每个部分。这是构建上一步中拉取的源代码的地方。这是在特定于部分的目录中完成的,因此它是独立发生的,但是如果您具有部分间依赖性(使用 after 关键字告诉 snapcraft 在构建依赖部分之前需要暂存依赖。

  3. 阶段

    stage 这一步发生在每个部分。这是第一次将构成快照的所有不同部分实际放置在同一区域("stage" 目录)。如果多个部件提供具有不同内容的同一文件,Snapcraft 不知道您想要哪一个。 这就是 stage 关键字发挥作用的地方。您可以将来自该部分的文件列入白名单或黑名单,以避免在将这些部分暂存在一起时发生冲突(或者出于任何其他原因您可能不希望这些文件位于暂存区域)。

  4. 总理

    prime 步骤也针对每个部分进行。这与 stage 步骤非常相似,但文件进入启动区域而不是暂存区域。之所以存在,是因为暂存区可能包含头文件和构建依赖部分所需的类似内容,但人们可能不希望这些文件出现在最终快照中。 为此,您有另一个名为 prime 的过滤关键字,用于为来自待准备部分的文件创建白名单或黑名单。

  5. 快照

    snap 步骤不是针对每个部分的。此步骤 运行 会在所有部件都准备就绪后完成,此时 prime 目录包含 运行 所需的所有数据和元数据。这一步实际上只是为您在主目录上调用 mksquashfs

请注意,这些生命周期步骤中的每一个都可以 运行 单独用于所有或单个部件,并且它们也可以被清洁。

  • 运行所有部分的具体步骤:snapcraft <step>,例如snapcraft build.
  • 运行单个部分的具体步骤:snapcraft <step> <part>
  • 清洁所有部分的具体步骤:snapcraft clean -s <step>,例如snapcraft clean -s build
  • 清洁单个零件的具体步骤:snapcraft clean <part> -s <step>

我希望这回答了你的问题。有关详细信息,请参阅 Snapcraft lifecycle documentation. The stage and prime keywords are also further explained in the parts metadata 文档。