Как наложить патч на исходный код при сборке 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

Это хорошо работает в случае с биткойнами. Но это всего лишь эксперимент, а не документированные лучшие практики. Так что комментарии и идеи, чтобы сделать его лучше, приветствуются.

Другие вопросы по тегам