如何在 snapcraft 构建时对上游源代码应用补丁?

如何在 snapcraft 构建时对上游源代码应用补丁?

我曾经构建过 Debian 软件包 (quilt),它支持在构建过程中应用补丁。补丁存储在debian/patches文件夹中,通常用于添加尚未提交给上游源的修复或添加特定平台调整。

我的情况是一个需要自定义构建命令的包:

make build; make install_api; make install_desktop

而不是标准方式:

make; make install

目前提出的解决方案是:

  • 修改Makefile和添加default:install:条目。

snapcraft --no-parallel-build不修改源的情况下运行时出现错误:

make install DESTDIR=/home/username/Desktop/sandbox/alfanous-snap/parts/alfanous-git/install
make: *** No rule to make target 'install'.  Stop.
Command '['/bin/sh', '/tmp/tmp_f_u1ktl', 'make', 'install', 
 'DESTDIR=/home/username/Desktop/sandbox/alfanous-snap/parts/alfanous-git/install']'
 returned non-zero exit status 2

那么,有没有办法向 snapcraft build 添加补丁?我愿意接受任何其他解决方案/解决方法。

答案1

这听起来是个好例子snapcraft“脚本”。该build:节将允许您用自己的 shell 命令替换构建步骤 ( make build; make install_api; make install_desktop)。

答案2

在理想情况下,snap 会在上游进行维护,因此他们最好接受上游的补丁,也许会调整它们以使其更通用。

如果上游不想维护 snap,而你作为社区贡献者在做这件事,我建议对原始项目进行分叉,并在其中应用补丁。对我来说,分叉似乎比保留一组补丁更清晰。这是 github 的方式,我更喜欢它而不是 debian 的方式。

但当然,这只是一个主观意见,Snapcraft 应该足够灵活,让您可以遵循您认为最适合您项目的任何流程。因此,我们利用比特币 snap 对修补进行了一些探索。您可以在此处找到 snap 元数据:https://github.com/elopio/blockchain-snaps/tree/master/bitcoin/snap

在 snapcraft.yaml 中,你会发现补丁。该命令只是将补丁目录复制到 stage 目录中,并确保这些文件不会出现在 snap 中。如果你检查该目录,你会发现一个用 git diff 生成的 .patch 文件。

然后,在 snapcraft.yaml 中你还会发现比特币部分应用了补丁准备脚本

重要部分snapcraft.yaml

parts:
  bitcoin:
    source: https://github.com/bitcoin/bitcoin
    source-type: git
    prepare: git apply $SNAPCRAFT_STAGE/default_data_dir.patch

  patches:
    source: snap/patches
    plugin: dump
    prime:
      - -*

Snap 文件夹结构:

.
├── patches
│   └── default_data_dir.patch
└── snapcraft.yaml

在比特币案例中,这种方法效果很好。但这只是一个实验,尚未成为记录在案的最佳实践。因此,欢迎提出意见和想法,让这种方法更加完善。

相关内容