Как наложить патч на исходный код при сборке 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? Я открыт для любого другого решения / обходного пути.
2 ответа
Это звучит как хороший случай для "скриплетов" из snapcraft. build:
Станза позволит вам заменить шаг сборки вашими собственными командами оболочки (make build; make install_api; make install_desktop
).
В идеальном случае привязка поддерживается в восходящем направлении, поэтому в их интересах принять исправления в восходящем направлении, возможно, скорректировав их для более общего подхода.
Если апстрим не хочет поддерживать оснастку, а вы делаете это как участник сообщества, я бы предложил сделать развилку оригинального проекта и применить там свои патчи. Мне вилка кажется более понятной, чем держать ряд патчей вокруг себя. Это способ GitHub, и я предпочитаю его способу Debian.
Но, конечно, это субъективное мнение, и Snapcraft должен быть достаточно гибким, чтобы позволить вам следовать любому процессу, который вы считаете лучшим для вашего проекта. Итак, с помощью биткойнов мы немного изучили патчи. Вы можете найти метаданные привязки здесь: https://github.com/elopio/blockchain-snaps/tree/master/bitcoin/snap
В snapcraft.yaml вы найдете часть для патчей. Он просто копирует каталог патчей в каталог stage и следит за тем, чтобы эти файлы не попали в оснастку. Если вы проверите этот каталог, вы найдете один файл.patch, сгенерированный с помощью git diff.
Затем, также в 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:
- -*
Структура моментальной папки:
.
├── patches
│ └── default_data_dir.patch
└── snapcraft.yaml
Это хорошо работает в случае с биткойнами. Но это всего лишь эксперимент, а не документированные лучшие практики. Так что комментарии и идеи, чтобы сделать его лучше, приветствуются.