Difference between revisions of "VCS PKGBUILD Guidelines/ru"
Views
Actions
Namespaces
Variants
Tools
(Created page with "==== Git ====") |
|||
(30 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
__TOC__ | __TOC__ | ||
[[Wikipedia:Revision_control|Version control systems]] | [[Wikipedia:Revision_control|Version control systems]] может использоваться для поиска исходного кода как обычных статически версионированных пакетов, так и последней (trunk) версии ветки разработки. В этой статье рассматриваются оба случая. | ||
== | == Руководство == | ||
* | * Суффиксы {{Ic|pkgname}} with {{Ic|-cvs}}, {{Ic|-svn}}, {{Ic|-hg}}, {{Ic|-darcs}}, {{Ic|-bzr}}, {{Ic|-git}} и тд, если только пакет не относится к определенному выпуску. | ||
* | * Если результирующий пакет отличается после изменения зависимостей, URL, источников и т.д., увеличение {{Ic|pkgrel}} является обязательным. Менять {{ic|pkgver}} необязательно. | ||
* {{Ic|--holdver}} | * {{Ic|--holdver}} можно использовать для предотвращения обновления [[makepkg]] в {{ic|pkgver}}. (см.: [https://www.archlinux.org/pacman/makepkg.8.html makepkg(8)]) | ||
* | * Укажите, с чем пакет конфликтует и что предоставляет (например, для {{AUR|fluxbox-git}}: {{Ic|1=conflicts=('fluxbox')}} и {{Ic|1=provides=('fluxbox')}}). | ||
* {{Ic|1=replaces=()}} | * {{Ic|1=replaces=()}} обычно вызывает ненужные проблемы и его следует избегать. | ||
* | * При использовании cvsroot используйте {{Ic|anonymous:@}}, а не {{Ic|anonymous@}}, чтобы избежать необходимости вводить пустой пароль или {{Ic|anonymous:password@}}, если он требуется. | ||
* | * Включите соответствующий инструмент VCS в {{Ic|1=makedepends=()}} ({{ic|cvs}}, {{ic|subversion}}, {{ic|git}}, ...). | ||
=== VCS | === Источники VCS === | ||
{{ | {{BoxInfo|Примечание|Pacman 4.1 поддерживает следующие источники VCS: {{ic|bzr}}, {{ic|git}}, {{ic|hg}} и {{ic|svn}}. Список поддерживаемых VCS см. в разделе {{ic|fragment}} в {{ic|man PKGBUILD}} или [https://www.archlinux.org/pacman/PKGBUILD.5.html PKGBUILD(5)].}} | ||
Начиная с {{ic|pacman}} 4.1, источники VCS должны быть указаны в массиве {{ic|1=source=()}} и будут рассматриваться как любой другой источник. {{ic||makepkg}} будет клонировать/выверять/разветвлять репозиторий в {{ic|$SRCDEST}} (то же, что и {{ic|$startdir}}, если не задано в [https://www.archlinux.org/pacman/makepkg.conf.5.html makepkg.conf(5)]) и скопирует его в {{ic|$srcdir}} (специфическим для каждой VCS способом). Локальный репозиторий остается нетронутым, таким образом отпадает необходимость в каталоге {{ic|-build}}. | |||
Общий формат массива VCS {{ic|1=source=()}} следующий: | |||
source=('[folder::][vcs+]url[#fragment]') | source=('[folder::][vcs+]url[#fragment]') | ||
* {{ic|folder}} ( | * {{ic|folder}} (необязательно) используется для изменения имени репо по умолчанию на что-то более подходящее (например, чем {{ic|trunk}}) или для сохранения предыдущих источников | ||
* {{ic|vcs+}} | * {{ic|vcs+}} необходим для URL, которые не отражают тип VCS, например, {{ic|git+http://some_repo}}. | ||
* {{ic|url}} | * {{ic|url}} - это URL удаленного или локального репозитория. | ||
* {{ic|#fragment}} ( | * {{ic|#fragment}} (необязательно) необходим для извлечения конкретной ветки или коммита. Смотрите {{ic|man PKGBUILD}} для получения дополнительной информации о фрагментах, доступных для каждого VCS. | ||
Пример массива источника Git: | |||
source=('project_name::git+http://project_url#branch=project_branch') | source=('project_name::git+http://project_url#branch=project_branch') | ||
=== | === Функция pkgver() === | ||
Автопереход {{ic|pkgver}} теперь осуществляется с помощью специальной функции {{ic|pkgver()}}. Это позволяет лучше контролировать {{ic|pkgver}}, и сопровождающие должны отдавать предпочтение {{ic|pkgver}}, которая имеет значение. | |||
Рекомендуется иметь следующий формат версии: ''RELEASE.rREVISION'', где ''REVISION'' - монотонно возрастающее число, уникально идентифицирующее дерево источника (это делают ревизии VCS). Последний тег VCS может быть использован для ''RELEASE''. Если нет публичных релизов и тегов репозиториев, то в качестве номера релиза можно использовать ноль или полностью отказаться от ''RELEASE'' и использовать номер версии, который выглядит как ''rREVISION''. Если есть публичные релизы, но репозиторий не имеет тегов, то разработчик должен получить версию релиза каким-то иным образом, например, путем разбора файлов проекта. | |||
Ниже приведены примеры, показывающие "предполагаемый" вывод: | |||
==== Git ==== | ==== Git ==== | ||
Используя аннотированный тег последнего коммита: | |||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
Line 53: | Line 53: | ||
}} | }} | ||
Использование неаннотированного тега последнего коммита: | |||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
Line 62: | Line 62: | ||
}} | }} | ||
Если тегов нет, то используйте количество ревизий с начала истории: | |||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
Line 71: | Line 71: | ||
}} | }} | ||
{{ | {{BoxInfo|Примечание|SHA1 (в данном случае {{ic|a17a017}}) не используется при сравнении версий и может быть опущен, хотя он позволяет быстро определить точную используемую ревизию и может быть полезен при отладке.}} | ||
==== | ==== Подверсия ==== | ||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
cd "$srcdir/repo" | cd "$srcdir/repo" | ||
Line 82: | Line 82: | ||
}} | }} | ||
{{ | {{BoxInfo|Примечание|Если у проекта есть релизы, вы должны использовать их вместо {{ic|0.}}.}} | ||
==== | ==== Непостоянная ==== | ||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
cd "$srcdir/repo" | cd "$srcdir/repo" | ||
Line 92: | Line 92: | ||
}} | }} | ||
==== | ==== Базис ==== | ||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
cd "$srcdir/repo" | cd "$srcdir/repo" | ||
Line 100: | Line 100: | ||
}} | }} | ||
==== | ==== Запасной вариант ==== | ||
Текущая дата может быть использована в случае, если из репозитория не удалось извлечь удовлетворительный {{ic|pkgver}}: | |||
{{hc|<nowiki>pkgver() { | {{hc|<nowiki>pkgver() { | ||
Line 109: | Line 109: | ||
}} | }} | ||
Хотя он не позволяет однозначно определить состояние исходного дерева, поэтому по возможности избегайте его. | |||
== Советы == | == Советы == | ||
Line 154: | Line 154: | ||
} | } | ||
=== Git | === Подмодули Git === | ||
Git | Подмодули Git немного сложнее. Идея заключается в том, чтобы добавить URL-адреса самих подмодулей непосредственно в массив sources, а затем ссылаться на них во время prepare(). Это может выглядеть следующим образом: | ||
source=("git://somewhere.org/something/something.git" | source=("git://somewhere.org/something/something.git" |
Latest revision as of 04:46, 1 March 2023
Version control systems может использоваться для поиска исходного кода как обычных статически версионированных пакетов, так и последней (trunk) версии ветки разработки. В этой статье рассматриваются оба случая.
Руководство
- Суффиксы
pkgname
with-cvs
,-svn
,-hg
,-darcs
,-bzr
,-git
и тд, если только пакет не относится к определенному выпуску.
- Если результирующий пакет отличается после изменения зависимостей, URL, источников и т.д., увеличение
pkgrel
является обязательным. Менятьpkgver
необязательно.
--holdver
можно использовать для предотвращения обновления makepkg вpkgver
. (см.: makepkg(8))
- Укажите, с чем пакет конфликтует и что предоставляет (например, для fluxbox-git:
conflicts=('fluxbox')
иprovides=('fluxbox')
).
replaces=()
обычно вызывает ненужные проблемы и его следует избегать.
- При использовании cvsroot используйте
anonymous:@
, а неanonymous@
, чтобы избежать необходимости вводить пустой пароль илиanonymous:password@
, если он требуется.
- Включите соответствующий инструмент VCS в
makedepends=()
(cvs
,subversion
,git
, ...).
Источники VCS
Начиная с pacman
4.1, источники VCS должны быть указаны в массиве source=()
и будут рассматриваться как любой другой источник. <codemakepkg> будет клонировать/выверять/разветвлять репозиторий в $SRCDEST
(то же, что и $startdir
, если не задано в makepkg.conf(5)) и скопирует его в $srcdir
(специфическим для каждой VCS способом). Локальный репозиторий остается нетронутым, таким образом отпадает необходимость в каталоге -build
.
Общий формат массива VCS source=()
следующий:
source=('[folder::][vcs+]url[#fragment]')
folder
(необязательно) используется для изменения имени репо по умолчанию на что-то более подходящее (например, чемtrunk
) или для сохранения предыдущих источниковvcs+
необходим для URL, которые не отражают тип VCS, например,git+http://some_repo
.url
- это URL удаленного или локального репозитория.#fragment
(необязательно) необходим для извлечения конкретной ветки или коммита. Смотритеman PKGBUILD
для получения дополнительной информации о фрагментах, доступных для каждого VCS.
Пример массива источника Git:
source=('project_name::git+http://project_url#branch=project_branch')
Функция pkgver()
Автопереход pkgver
теперь осуществляется с помощью специальной функции pkgver()
. Это позволяет лучше контролировать pkgver
, и сопровождающие должны отдавать предпочтение pkgver
, которая имеет значение.
Рекомендуется иметь следующий формат версии: RELEASE.rREVISION, где REVISION - монотонно возрастающее число, уникально идентифицирующее дерево источника (это делают ревизии VCS). Последний тег VCS может быть использован для RELEASE. Если нет публичных релизов и тегов репозиториев, то в качестве номера релиза можно использовать ноль или полностью отказаться от RELEASE и использовать номер версии, который выглядит как rREVISION. Если есть публичные релизы, но репозиторий не имеет тегов, то разработчик должен получить версию релиза каким-то иным образом, например, путем разбора файлов проекта.
Ниже приведены примеры, показывающие "предполагаемый" вывод:
Git
Используя аннотированный тег последнего коммита:
pkgver() { cd "$srcdir/repo" git describe --long | sed -E 's/([^-]*-g)/r\1/;s/-/./g' }
2.0.r6.ga17a017
Использование неаннотированного тега последнего коммита:
pkgver() { cd "$srcdir/repo" git describe --long --tags | sed -E 's/([^-]*-g)/r\1/;s/-/./g' }
0.71.r115.gd95ee07
Если тегов нет, то используйте количество ревизий с начала истории:
pkgver() { cd "$srcdir/repo" printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" }
r1142.a17a017
Подверсия
pkgver() { cd "$srcdir/repo" local ver="$(svnversion)" printf "r%s" "${ver//[[:alpha:]]}" }
r8546
Непостоянная
pkgver() { cd "$srcdir/repo" printf "r%s.%s" "$(hg identify -n)" "$(hg identify -i)" }
r2813.75881cc5391e
Базис
pkgver() { cd "$srcdir/repo" printf "r%s" "$(bzr revno)" }
r830
Запасной вариант
Текущая дата может быть использована в случае, если из репозитория не удалось извлечь удовлетворительный pkgver
:
pkgver() { date +%Y%m%d }
20130408
Хотя он не позволяет однозначно определить состояние исходного дерева, поэтому по возможности избегайте его.
Советы
A sample Git PKGBUILD
# Maintainer: Dave Reisner <d@falconindy.com> # Contributor: William Giokas (KaiSforza) <1007380@gmail.com> pkgname=expac-git pkgver=0.0.0 pkgrel=1 pkgdesc="Pacman database extraction utility" arch=('i686' 'x86_64') url="https://github.com/falconindy/expac" license=('MIT') depends=('pacman') makedepends=('git') conflicts=('expac') provides=('expac') # The git repo is detected by the 'git:' or 'git+' beginning. The branch # '$pkgname' is then checked out upon cloning, expediating versioning: #source=('git+https://github.com/falconindy/expac.git' source=("$pkgname"::'git://github.com/falconindy/expac.git' 'expac_icon.png') # Because the sources are not static, skip Git checksum: md5sums=('SKIP' '020c36e38466b68cbc7b3f93e2044b49') pkgver() { cd "$srcdir/$pkgname" # Use the tag of the last commit git describe --long | sed -E 's/([^-]*-g)/r\1/;s/-/./g' } build() { cd "$srcdir/$pkgname" make } package() { cd "$srcdir/$pkgname" make PREFIX=/usr DESTDIR="$pkgdir" install install -Dm644 "$srcdir/expac_icon.png" "$pkgdir/usr/share/pixmaps/expac.png" }
Подмодули Git
Подмодули Git немного сложнее. Идея заключается в том, чтобы добавить URL-адреса самих подмодулей непосредственно в массив sources, а затем ссылаться на них во время prepare(). Это может выглядеть следующим образом:
source=("git://somewhere.org/something/something.git" "git://somewhere.org/mysubmodule/mysubmodule.git") prepare() { cd something git submodule init git config submodule.mysubmodule.url $srcdir/mysubmodule git submodule update }