Difference between revisions of "Arch package guidelines (Русский)"
m (Change category) |
|||
(31 intermediate revisions by 20 users not shown) | |||
Line 1: | Line 1: | ||
+ | [[Category:Arch package guidelines (Русский)]] | ||
[[Category:Русский]] | [[Category:Русский]] | ||
− | [[ | + | [[en:Arch package guidelines]] |
− | [[ | + | [[es:Arch packaging standards]] |
− | + | [[fr:Standard paquetage]] | |
− | + | [[it:Arch packaging standards]] | |
− | + | [[ja:Arch パッケージングスタンダード]] | |
− | + | [[pt:Arch package guidelines]] | |
− | + | [[sr:Arch packaging standards]] | |
− | {{ | + | [[zh-hans:Arch packaging standards]] |
− | + | [[zh-hant:Arch packaging standards]] | |
− | + | {{Unmaintained (Русский)}} | |
− | = Стандарты для создания пакетов Arch = | + | == Стандарты для создания пакетов Arch == |
Когда создаете пакет для Arch Linux, вы '''должны придерживаться стандарта по созданию пакетов Arch''', который приведен ниже. Особенно если вы хотите '''добавить''' ваш пакет в Arch Linux. | Когда создаете пакет для Arch Linux, вы '''должны придерживаться стандарта по созданию пакетов Arch''', который приведен ниже. Особенно если вы хотите '''добавить''' ваш пакет в Arch Linux. | ||
− | == Шаблон PKGBUILD == | + | === Шаблон PKGBUILD === |
<pre> | <pre> | ||
− | # Contributor: | + | # Contributor: Ваше Имя <email собака domain точка com> |
+ | |||
pkgname=NAME | pkgname=NAME | ||
pkgver=VERSION | pkgver=VERSION | ||
pkgrel=1 | pkgrel=1 | ||
pkgdesc="" | pkgdesc="" | ||
− | arch=() | + | arch=('i686' 'x86_64') |
− | url="" | + | url="http://ADDRESS/" |
license=('GPL') | license=('GPL') | ||
+ | groups=() | ||
depends=() | depends=() | ||
makedepends=() | makedepends=() | ||
+ | optdepends=() | ||
provides=() | provides=() | ||
conflicts=() | conflicts=() | ||
replaces=() | replaces=() | ||
backup=() | backup=() | ||
− | |||
options=() | options=() | ||
install= | install= | ||
source=($pkgname-$pkgver.tar.gz) | source=($pkgname-$pkgver.tar.gz) | ||
noextract=() | noextract=() | ||
− | md5sums=(generate with makepkg -g | + | md5sums=() #generate with 'makepkg -g' |
build() { | build() { | ||
− | cd $ | + | cd $srcdir/$pkgname-$pkgver |
./configure --prefix=/usr | ./configure --prefix=/usr | ||
make || return 1 | make || return 1 | ||
− | make DESTDIR=$ | + | make DESTDIR=$pkgdir install || return 1 |
} | } | ||
</pre> | </pre> | ||
− | == Железные правила создания пакетов == | + | === Железные правила создания пакетов === |
* Пакет никогда не должен инсталироваться в /usr/local | * Пакет никогда не должен инсталироваться в /usr/local | ||
− | + | * <strong>Не добавляйте своих переменных</strong> в ваши сборочные скрипты, возможны <strong>конфликты</strong> с переменными, используемыми в makepkg. Если невозможно этого не делать, <strong>используйте подчёркивание как префикс </strong>(<code>_</code>). Пример: <pre>_customvariable=</pre> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | * <strong>Не добавляйте своих переменных</strong> в | ||
AUR не может определить использование ваших переменных и поэтому не может их использовать в заменах. Это часто можно наблюдать в ссылках на исходные тексты. Пример: | AUR не может определить использование ваших переменных и поэтому не может их использовать в заменах. Это часто можно наблюдать в ссылках на исходные тексты. Пример: | ||
Line 64: | Line 61: | ||
* <strong>Избегайте</strong> использования <code>/usr/libexec/</code>. Используйте вместо этого <code>/usr/lib/${pkgname}/</code> | * <strong>Избегайте</strong> использования <code>/usr/libexec/</code>. Используйте вместо этого <code>/usr/lib/${pkgname}/</code> | ||
− | * Поле <code>packager</code> из метафайла может быть <strong> | + | * Поле <code>packager</code> из метафайла может быть <strong>изменено</strong> сборщиком с помощью соответствующей опции в файле <code>/etc/makepkg.conf</code>. Другой вариант - экспортировать переменную <code>PACKAGER</code> перед сборкой пакета с помощью <code>makepkg</code>: |
<pre># export PACKAGER="John Doe@your.email"</pre> | <pre># export PACKAGER="John Doe@your.email"</pre> | ||
* Все важные сообщения должны печататься в течении инсталяции. Для этого используется <strong> файл .install</strong>. Например, если пакету нужна дополнительная настройка, инструкции должны быть в этом файле. | * Все важные сообщения должны печататься в течении инсталяции. Для этого используется <strong> файл .install</strong>. Например, если пакету нужна дополнительная настройка, инструкции должны быть в этом файле. | ||
− | * Любые <strong>опциональные зависимости</strong>, которые не нужны для использования основной функциональности пакета не должны включаться, но должны быть | + | * Любые <strong>опциональные зависимости</strong>, которые не нужны для использования основной функциональности пакета не должны включаться в массив depends, но должны быть в массиве optdepends. В этом случае они будут напечатаны при инсталяции. Например: |
+ | optdepends=('cups: printing support' | ||
+ | 'sane: scanners support' | ||
+ | 'libgphoto2: digital cameras support' | ||
+ | 'alsa-lib: sound support' | ||
+ | 'giflib: GIF images support' | ||
+ | 'libjpeg: JPEG images support' | ||
+ | 'libpng: PNG images support') | ||
+ | |||
* Не пишите <strong>в описании пакета</strong> имя самого пакета. Например, вместо "Nedit - это текстовый редактор для X11" лучше написать "Текстовый редактор для X11". Также постарайтесь, чтобы описание не было длинее ~80 символов. | * Не пишите <strong>в описании пакета</strong> имя самого пакета. Например, вместо "Nedit - это текстовый редактор для X11" лучше написать "Текстовый редактор для X11". Также постарайтесь, чтобы описание не было длинее ~80 символов. | ||
Line 78: | Line 83: | ||
* Общая практика - <strong>сохранять порядок следования полей</strong> в <code>PKGBUILD</code>, как показано выше. Однако, это не требование, только рекомендация в контексте <strong>корректного синтаксиса bash</strong>. | * Общая практика - <strong>сохранять порядок следования полей</strong> в <code>PKGBUILD</code>, как показано выше. Однако, это не требование, только рекомендация в контексте <strong>корректного синтаксиса bash</strong>. | ||
+ | |||
+ | * Не используйте в PKGBUILD символов национальных алфавитов. <strong>Только ASCII</strong> (Латинские буквы, цифры и знаки препинания) | ||
== Названия пакетов == | == Названия пакетов == | ||
Line 87: | Line 94: | ||
*Релиз пакета '''специфичен для пакетов Arch'''. Он позволяет пользователю отличать старую сборку пакета от более новой, даже если версия пакета одна и таже. Когда обновляется версия пакета, '''релиз пакета нужно сделать равным 1'''. Затем по мере улучшения/исправления пакета, очередная сборка пакета '''выкладывается со значением релиза, увеличенным на единицу'''. Когда выходит новая версия, счетчик релизов сбрасывается в единицу. Релиз пакета должен соответствовать '''тем же правилам, что и версия пакета'''. | *Релиз пакета '''специфичен для пакетов Arch'''. Он позволяет пользователю отличать старую сборку пакета от более новой, даже если версия пакета одна и таже. Когда обновляется версия пакета, '''релиз пакета нужно сделать равным 1'''. Затем по мере улучшения/исправления пакета, очередная сборка пакета '''выкладывается со значением релиза, увеличенным на единицу'''. Когда выходит новая версия, счетчик релизов сбрасывается в единицу. Релиз пакета должен соответствовать '''тем же правилам, что и версия пакета'''. | ||
− | == Каталоги == | + | === Каталоги === |
*'''Файлы конфигурации''' должны размещаться в каталоге <code>/etc</code>. Если таких файлов более одного можно '''использовать подкаталог''' чтобы не забивать <code>/etc</code>. Используйте имя <code>/etc/{pkgname}/</code> для подкаталога, где <code>{pkgname}</code> это имя вашего пакета (или разумная альтернатива, т.е. пакет apache использует <code>/etc/httpd/</code>). | *'''Файлы конфигурации''' должны размещаться в каталоге <code>/etc</code>. Если таких файлов более одного можно '''использовать подкаталог''' чтобы не забивать <code>/etc</code>. Используйте имя <code>/etc/{pkgname}/</code> для подкаталога, где <code>{pkgname}</code> это имя вашего пакета (или разумная альтернатива, т.е. пакет apache использует <code>/etc/httpd/</code>). | ||
Line 149: | Line 156: | ||
** /var/tmp | ** /var/tmp | ||
− | == Обязанности makepkg == | + | === Обязанности makepkg === |
Когда вы запускаете команду makepkg для сборки пакета, она делает следующие вещи автоматически: | Когда вы запускаете команду makepkg для сборки пакета, она делает следующие вещи автоматически: | ||
Line 157: | Line 164: | ||
#Вносит необходимые '''исправления''' | #Вносит необходимые '''исправления''' | ||
#'''Собирает''' программу и устанавливает ее в fake root | #'''Собирает''' программу и устанавливает ее в fake root | ||
− | #'''Удаляет''' <code>/usr/doc</code>, <code>/usr/info</code>, <code>/usr/share/doc</code>, | + | #'''Удаляет''' <code>/usr/doc</code>, <code>/usr/info</code>, <code>/usr/share/doc</code>, и <code>/usr/share/info</code> из пакета |
#''Удаляет''' все символы из исполняемых файлов | #''Удаляет''' все символы из исполняемых файлов | ||
#''Удаляет''' отладочные символы из библиотек | #''Удаляет''' отладочные символы из библиотек | ||
Line 164: | Line 171: | ||
#'''Сохраняет''' пакет в указанном каталоге (по умолчанию в текущем каталоге) | #'''Сохраняет''' пакет в указанном каталоге (по умолчанию в текущем каталоге) | ||
− | === | + | === Лицензия === |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Пакет с лицензиями есть в репозитории current. Вы можете его использовать следующим образом: | Пакет с лицензиями есть в репозитории current. Вы можете его использовать следующим образом: | ||
Line 208: | Line 188: | ||
*Некоторые пакеты не могут использовать одну лицензию. В таких случаях переменная license содержит массив, т.е. license=("GPL" "custom:some commercial license"). Для большинства пакетов эти лицензии применяются в разных случаях использования пакета. Когда pacman получит возможность фильтровать пакеты по лицензии (т.е. вы сможете сказать "Я хочу использовать только программы, лицензированные под GPL или BSD") две и более лицензии скорее всего будут обрабатываться используя операцию ИЛИ, а не операцию И, т.е. pacman будет рассматривать приведенный пример как ПО под GPL, а не под какой-то другой лицензией. | *Некоторые пакеты не могут использовать одну лицензию. В таких случаях переменная license содержит массив, т.е. license=("GPL" "custom:some commercial license"). Для большинства пакетов эти лицензии применяются в разных случаях использования пакета. Когда pacman получит возможность фильтровать пакеты по лицензии (т.е. вы сможете сказать "Я хочу использовать только программы, лицензированные под GPL или BSD") две и более лицензии скорее всего будут обрабатываться используя операцию ИЛИ, а не операцию И, т.е. pacman будет рассматривать приведенный пример как ПО под GPL, а не под какой-то другой лицензией. | ||
− | == Загрузка пакетов == | + | === Загрузка пакетов === |
Перед загрузкой пакетов убедитесь, что: | Перед загрузкой пакетов убедитесь, что: | ||
Line 216: | Line 196: | ||
*Добавлен коментарий в первой строке <code>PKGBUILD</code> в таком формате: | *Добавлен коментарий в первой строке <code>PKGBUILD</code> в таком формате: | ||
− | <pre># Contributor: Ваше Имя < | + | <pre># Contributor: Ваше Имя <ваш.e-mail></pre> |
*Все '''зависимости''' поставлены корректно (например, запустите <code>ldd</code> на выполняемых файлах чтобы узнать от чего они зависят...). | *Все '''зависимости''' поставлены корректно (например, запустите <code>ldd</code> на выполняемых файлах чтобы узнать от чего они зависят...). | ||
− | Команда доверенных пользователей настоятельно рекомендует использовать программу <code>namcap</code>, написанную | + | Команда доверенных пользователей настоятельно рекомендует использовать программу <code>namcap</code>, написанную [https://www.archlinux.org/fellows/#jason Jason Chu], для проверки ваших пакетов. <code>namcap</code> расскажет вам о неверных правах доступа, зависимостях и других общих ошибках. Вы можете установить <code>namcap</code> с помощью <code>pacman</code>. |
Помните, что <code>namcap</code> может проверять не только собраные пакеты pkg.tar.gz, но и PKGBUILD'ы. | Помните, что <code>namcap</code> может проверять не только собраные пакеты pkg.tar.gz, но и PKGBUILD'ы. | ||
Line 237: | Line 217: | ||
Архив '''не должен''' содержать ни бинарный пакет, созданный makepkg, ни список файлов (filelist) | Архив '''не должен''' содержать ни бинарный пакет, созданный makepkg, ни список файлов (filelist) | ||
− | = Дополнительные | + | == Дополнительные руководства == |
+ | |||
Убедитесь, что прочитали это руководство. Важные моменты упомянутые здесь не будут повторены на нижеследующих страницах. Эти специальные стандарты разработаны как дополнение к этому документу. | Убедитесь, что прочитали это руководство. Важные моменты упомянутые здесь не будут повторены на нижеследующих страницах. Эти специальные стандарты разработаны как дополнение к этому документу. | ||
− | + | {{Package guidelines (Русский)}} | |
− | |||
− | |||
− | |||
− |
Latest revision as of 10:08, 21 November 2018
Contents
Стандарты для создания пакетов Arch
Когда создаете пакет для Arch Linux, вы должны придерживаться стандарта по созданию пакетов Arch, который приведен ниже. Особенно если вы хотите добавить ваш пакет в Arch Linux.
Шаблон PKGBUILD
# Contributor: Ваше Имя <email собака domain точка com> pkgname=NAME pkgver=VERSION pkgrel=1 pkgdesc="" arch=('i686' 'x86_64') url="http://ADDRESS/" license=('GPL') groups=() depends=() makedepends=() optdepends=() provides=() conflicts=() replaces=() backup=() options=() install= source=($pkgname-$pkgver.tar.gz) noextract=() md5sums=() #generate with 'makepkg -g' build() { cd $srcdir/$pkgname-$pkgver ./configure --prefix=/usr make || return 1 make DESTDIR=$pkgdir install || return 1 }
Железные правила создания пакетов
- Пакет никогда не должен инсталироваться в /usr/local
- Не добавляйте своих переменных в ваши сборочные скрипты, возможны конфликты с переменными, используемыми в 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. Например, если пакету нужна дополнительная настройка, инструкции должны быть в этом файле.
- Любые опциональные зависимости, которые не нужны для использования основной функциональности пакета не должны включаться в массив depends, но должны быть в массиве optdepends. В этом случае они будут напечатаны при инсталяции. Например:
optdepends=('cups: printing support' 'sane: scanners support' 'libgphoto2: digital cameras support' 'alsa-lib: sound support' 'giflib: GIF images support' 'libjpeg: JPEG images support' 'libpng: PNG images support')
- Не пишите в описании пакета имя самого пакета. Например, вместо "Nedit - это текстовый редактор для X11" лучше написать "Текстовый редактор для X11". Также постарайтесь, чтобы описание не было длинее ~80 символов.
- Постарайтесь, чтобы длина строки в PKGBUILD не превышала ~100 символов.
- Не делайте пустых строк в
PKGBUILD
- Общая практика - сохранять порядок следования полей в
PKGBUILD
, как показано выше. Однако, это не требование, только рекомендация в контексте корректного синтаксиса bash.
- Не используйте в PKGBUILD символов национальных алфавитов. Только ASCII (Латинские буквы, цифры и знаки препинания)
Названия пакетов
- Имя пакета должно состоять только из латинских букв и цифр; все буквы должны быть в нижнем регистре.
- Версия пакета должна совпадать с версией автора. Версии могут включать латинские буквы если это необходимо (например версия пакета nmap = 2.54BETA32). Версия не должна содержать знак переноса! Только латинские буквы, цифры и точку.
- Релиз пакета специфичен для пакетов Arch. Он позволяет пользователю отличать старую сборку пакета от более новой, даже если версия пакета одна и таже. Когда обновляется версия пакета, релиз пакета нужно сделать равным 1. Затем по мере улучшения/исправления пакета, очередная сборка пакета выкладывается со значением релиза, увеличенным на единицу. Когда выходит новая версия, счетчик релизов сбрасывается в единицу. Релиз пакета должен соответствовать тем же правилам, что и версия пакета.
Каталоги
- Файлы конфигурации должны размещаться в каталоге
/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
Обязанности makepkg
Когда вы запускаете команду makepkg для сборки пакета, она делает следующие вещи автоматически:
- Проверяет установлены ли зависимости
- Скачивает исходные файлы из Интернета
- Распаковывает те архивы, которые может (tar.gz, tar.bz2, zip...)
- Вносит необходимые исправления
- Собирает программу и устанавливает ее в fake root
- Удаляет
/usr/doc
,/usr/info
,/usr/share/doc
, и/usr/share/info
из пакета - Удаляет' все символы из исполняемых файлов
- Удаляет' отладочные символы из библиотек
- Создает метафайлы пакета, которые впоследствии будут в него включены
- Упаковывает содержимое fake root в пакет
- Сохраняет пакет в указанном каталоге (по умолчанию в текущем каталоге)
Лицензия
Пакет с лицензиями есть в репозитории 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, а не под какой-то другой лицензией.
Загрузка пакетов
Перед загрузкой пакетов убедитесь, что:
- Присутствует корректное поле
md5sum
, которое может быть сгенерировано при помощиmakepkg -g
.
- Добавлен коментарий в первой строке
PKGBUILD
в таком формате:
# Contributor: Ваше Имя <ваш.e-mail>
- Все зависимости поставлены корректно (например, запустите
ldd
на выполняемых файлах чтобы узнать от чего они зависят...).
Команда доверенных пользователей настоятельно рекомендует использовать программу namcap
, написанную Jason Chu, для проверки ваших пакетов. 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)
Дополнительные руководства
Убедитесь, что прочитали это руководство. Важные моменты упомянутые здесь не будут повторены на нижеследующих страницах. Эти специальные стандарты разработаны как дополнение к этому документу.