我曾经构建过 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
在比特币案例中,这种方法效果很好。但这只是一个实验,尚未成为记录在案的最佳实践。因此,欢迎提出意见和想法,让这种方法更加完善。