Arch Packaging Standards(Русский)
From ArchWiki
| i18n |
|---|
| English |
| Русский |
| Español |
| 繁體中文 |
Contents |
[edit] Стандарты для создания пакетов Arch
Когда создаете пакет для Arch Linux, вы должны придерживаться стандарта по созданию пакетов Arch, который приведен ниже. Особенно если вы хотите добавить ваш пакет в Arch Linux.
[edit] Шаблон PKGBUILD
# Contributor: Your Name <youremail@domain.com>
pkgname=NAME
pkgver=VERSION
pkgrel=1
pkgdesc=""
arch=()
url=""
license=('GPL')
depends=()
makedepends=()
provides=()
conflicts=()
replaces=()
backup=()
groups=()
options=()
install=
source=($pkgname-$pkgver.tar.gz)
noextract=()
md5sums=(generate with makepkg -g)
build() {
cd $startdir/src/$pkgname-$pkgver
./configure --prefix=/usr
make || return 1
make DESTDIR=$startdir/pkg install || return 1
}
[edit] Железные правила создания пакетов
- Пакет никогда не должен инсталироваться в /usr/local
- Когда возможно, используйте
"|| return 1"в важных функциях сборки
patch -Np1 -i ../patchfile.patch || return 1 make || return 1 make DESTDIR=$startdir/pkg install || return 1
- Не добавляйте своих переменных в ваш сборочные скрипты, возможны конфликты с переменными, используемыми в makepkg. Если невозможно этого не делать, используйте подчёркивание как префикс (
_). Пример:_customvariable=
AUR не может определить использование ваших переменных и поэтому не может их использовать в заменах. Это часто можно наблюдать в ссылках на исходные тексты. Пример:
http://downloads.sourceforge.net/sourceforge/directxwine/$patchname.$patchver.diff.bz2
Этот недостаток сильно снижает функциональность AUR.
- Избегайте использования
/usr/libexec/. Используйте вместо этого/usr/lib/${pkgname}/
- Поле
packagerиз метафайла может быть исользовано сборщиком для соответствующей опции в файле/etc/makepkg.conf. Другой вариант - экспортировать переменнуюPACKAGERперед сборкой пакета с помощьюmakepkg:
# export PACKAGER="John Doe@your.email"
- Все важные сообщения должны печататься в течении инсталяции. Для этого используется файл .install. Например, если пакету нужна дополнительная настройка, инструкции должны быть в этом файле.
- Любые опциональные зависимости, которые не нужны для использования основной функциональности пакета не должны включаться, но должны быть соответствующие предупреждения в файле .install, они будут напечатаны при инсталяции. Например: "To enable SMB support, download the Samba package."
- Не пишите в описании пакета имя самого пакета. Например, вместо "Nedit - это текстовый редактор для X11" лучше написать "Текстовый редактор для X11". Также постарайтесь, чтобы описание не было длинее ~80 символов.
- Постарайтесь, чтобы длина строки в PKGBUILD не превышала ~100 символов.
- Не делайте пустых строк в
PKGBUILD
- Общая практика - сохранять порядок следования полей в
PKGBUILD, как показано выше. Однако, это не требование, только рекомендация в контексте корректного синтаксиса bash.
[edit] Названия пакетов
- Имя пакета должно состоять только из латинских букв и цифр; все буквы должны быть в нижнем регистре.
- Версия пакета должна совпадать с версией автора. Версии могут включать латинские буквы если это необходимо (например версия пакета nmap = 2.54BETA32). Версия не должна содержать знак переноса! Только латинские буквы, цифры и точку.
- Релиз пакета специфичен для пакетов Arch. Он позволяет пользователю отличать старую сборку пакета от более новой, даже если версия пакета одна и таже. Когда обновляется версия пакета, релиз пакета нужно сделать равным 1. Затем по мере улучшения/исправления пакета, очередная сборка пакета выкладывается со значением релиза, увеличенным на единицу. Когда выходит новая версия, счетчик релизов сбрасывается в единицу. Релиз пакета должен соответствовать тем же правилам, что и версия пакета.
[edit] Каталоги
- Файлы конфигурации должны размещаться в каталоге
/etc. Если таких файлов более одного можно использовать подкаталог чтобы не забивать/etc. Используйте имя/etc/{pkgname}/для подкаталога, где{pkgname}это имя вашего пакета (или разумная альтернатива, т.е. пакет apache использует/etc/httpd/).
- Файлы пакета должны соответствовать требованиям, приведенным ниже.
Общие правила для каталогов:
/etc |
Общесистемные файлы настроек |
/usr/bin |
Исполняемые файлы |
/usr/sbin |
Исполняемые файлы для пользователя root |
/usr/lib |
Библиотеки |
/usr/include |
Заголовочные файлы для програм на C |
/usr/lib/{pkg} |
Модули, плагины, расширения и т.д. |
/usr/share/man |
man-страницы |
/usr/share/{pkg} |
Архитектурнонезависимые данные приложения |
/etc/{pkg} |
Файлы настроек пакета {pkg} |
/opt |
Огромные приложения "замкнутые в себе", такие как KDE, Mozilla, Gnome и т.д. |
- Пакет не должен содержать нижепреведенных директорий:
- /dev
- /home
- /media
- /mnt
- /proc
- /root
- /selinux
- /sys
- /tmp
- /var/tmp
[edit] Обязанности makepkg
Когда вы запускаете команду makepkg для сборки пакета, она делает следующие вещи автоматически:
- Проверяет установлены ли зависимости
- Скачивает исходные файлы из Интернета
- Распаковывает те архивы, которые может (tar.gz, tar.bz2, zip...)
- Вносит необходимые исправления
- Собирает программу и устанавливает ее в fake root
- Удаляет
/usr/doc,/usr/info,/usr/share/doc, and/usr/share/infoиз пакета - Удаляет' все символы из исполняемых файлов
- Удаляет' отладочные символы из библиотек
- Создает метафайлы пакета, которые впоследствии будут в него включены
- Упаковывает содержимое fake root в пакет
- Сохраняет пакет в указанном каталоге (по умолчанию в текущем каталоге)
[edit] "Этикет" пакетов
- Пакеты не должны устанавливать файлы в
/usr/local
- Не вводите новые переменные в вашем
PKGBUILDскрипте, за исключением случаев, когда пакет не может быть собран без них, т.к. они могут конфликтовать с переменными которые использует makepkg.
_) Например _customvariable=
AUR не может отслеживать использование собственных переменных и не может их подставлять. Наиболее часто это можно встретить в массиве sources, например:
http://dl.sourceforge.net/sourceforge/directxwine/$_patchname.$_patchver.diff.bz2
Имена переменных не будут заменены на значения в веб-интерфейсе.
- Не используйте католог
/usr/libexec/. Используйте/usr/lib/{pkg}вместо него.
- Поле
packagerв метаинформации пакета может быть изменено в файле/etc/makepkg.conf, или установкой переменной окруженияPACKAGERперед сборкой пакета командойmakepkg:# export PACKAGER="John Doe@your.email"
- Все важные для установки замечания должны быть напечатаны при помощи .install файла. Например, если пакет требует дополнительных действий после установки для нормальной работы, инструкция должна быть включена в .install файл.
- Не обязательные зависимости, которые не нужны для запуска программы не должны включаться в поле depends. Однако следует напечатать соответствующее уведомление при помощи .install файла. Например: "To enable SMB support, download the Samba package." ("Если вы хотите использовать SMB протокол, установите пакет samba")
- При заполнении поля описание пакета не включайте имя пакета. Например: "Nedit is a text editor for X11" может быть сокращено до "A text editor for X11". Также старайтесь уместить описание в ~80 символов или меньше.
- Старайтесь придерживаться длины строки в PKGBUILD менее ~100 символов.
- Не используйте в PKGBUILD символов национальных алфавитов. Только ASCII (Латинские буквы, цифры и знаки препинания)
[edit] Лизенция
Пакет с лицензиями есть в репозитории current. Вы можете его использовать следующим образом:
- Пакет current/licenses содержит некоторое количество частоиспользуемых лицензий в директории /usr/share/licenses/common. Например, /usr/share/licenses/common/GPL. Если ваш пакет имеет одну из этих лицензий, переменная licenses должна быть установлена в PKGBUILD, например, license=("GPL")
- Если подходящей лицензии нет, можно сделать несколько вещей:
- Добавить в пакет директорию /usr/share/licenses/$pkgname/ с лицензией. Например /usr/share/licenses/dibfoo/COPYING.
- Если исходные тексты не содержат лицензии, скопируйте ее в сайта автора.
- Присвойте значение 'custom' переменной license. Также можно вместо 'custom' написать 'custom:"имя-лицензии"'.
- Если лицензия используется более чем одним пакетом из официальных репозитариев и [community], она добавляется в папку common.
- Лицензии MIT, BSD и Python - отдельный случай. Они не могут быть включены в пакет с общими лицензиями. Для переменной license - это выглядит как общие лицензии (license=("BSD"), license=("MIT") или license=("Python")), но со стороны файловой системы это custom лицензия, потому что каждый пакет имеет свою собственную строку с копирайтом. Каждый пакет с лицензиями MIT, BSD или Python должен содержать свою копию лицензии в /usr/share/licenses/$pkgname/.
- Некоторые пакеты не могут использовать одну лицензию. В таких случаях переменная license содержит массив, т.е. license=("GPL" "custom:some commercial license"). Для большинства пакетов эти лицензии применяются в разных случаях использования пакета. Когда pacman получит возможность фильтровать пакеты по лицензии (т.е. вы сможете сказать "Я хочу использовать только программы, лицензированные под GPL или BSD") две и более лицензии скорее всего будут обрабатываться используя операцию ИЛИ, а не операцию И, т.е. pacman будет рассматривать приведенный пример как ПО под GPL, а не под какой-то другой лицензией.
[edit] Загрузка пакетов
Перед загрузкой пакетов убедитесь, что:
- Присутствует корректное поле
md5sum, которое может быть сгенерировано при помощиmakepkg -g.
- Добавлен коментарий в первой строке
PKGBUILDв таком формате:
# Contributor: Ваше Имя <вам.e-mail>
- Все зависимости поставлены корректно (например, запустите
lddна выполняемых файлах чтобы узнать от чего они зависят...).
Команда доверенных пользователей настоятельно рекомендует использовать программу namcap, написанную Jason Chu (jason@archlinux.org), для проверки ваших пакетов. namcap расскажет вам о неверных правах доступа, зависимостях и других общих ошибках. Вы можете установить namcap с помощью pacman.
Помните, что namcap может проверять не только собраные пакеты pkg.tar.gz, но и PKGBUILD'ы.
- Зависимости - наиболее общая ошибка. Namcap может помочь в исправлении, но не всегда корректно. Проверьте зависимости еще раз, глядя в исходные тексты, документацию и на сайт автора.
- Не используйте replaces в вашем PKGBUILD если только вы не хотите переименовать пакет. Например Ethereal переименовался в Wireshark. Если вы просто сделали альтернативную версию уже существующего пакета, используйте conflicts (и provides если этот пакет используется в зависимостях других пакетов). Главное отличие в том, что после синхронизации (-Sy) pacman заменить установленные пакеты, 'предлагая' пакеты с подходящими полями replaces во всех репозиториях; conflicts напротив, обрабатывается только непосредственно при установке пакета.
- Все файлы загружаемые в AUR должны быть упакованы в tar.gz, который содержит каталог в
PKGBUILDи дополнительные файлы для сборки (патчи, .install-файл, ...).
foo/PKGBUILD foo/foo.install foo/foo_bar.diff foo/foo.rc.conf
Имя архива должно совпадать с именем пакета т.е. foo.tar.gz
Архив не должен содержать ни бинарный пакет, созданный makepkg, ни список файлов (filelist)
[edit] Дополнительные советы
Убедитесь, что прочитали это руководство. Важные моменты упомянутые здесь не будут повторены на нижеследующих страницах. Эти специальные стандарты разработаны как дополнение к этому документу.
[edit] CVS/SVN пакеты
Смотрите страницу Arch CVS & SVN PKGBUILD guidelines
[edit] Java пакеты
Смотрите страницу Java Package Guidelines