「VCS パッケージガイドライン」の版間の差分
(Created page with "[[Category:パッケージ開発] en:VCS PKGBUILD Guidelines it:VCS PKGBUILD Guidelines zh-CN:VCS PKGBUILD Guidelines zh-TW:VCS PKGBUILD Guidelines ...") |
細 (1版 をインポートしました) |
(相違点なし)
|
2015年1月9日 (金) 23:11時点における版
[[Category:パッケージ開発]
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
バージョン管理システムは通常の安定版のパッケージと最新の (trunk) 開発版のブランチ、どちらのソースコードの取得にも使うことができます。この記事では両方のケースを説明しています。
目次
プロトタイプ
Arch Build System の abs パッケージは CVS, SVN, Git, Mercurial, Darcs の PKGBUILD のプロトタイプを提供しています。abs をインストールしたら、/usr/share/pacman
にプロトタイプが入っています。最新のバージョンは ABS Git リポジトリの prototypes ディレクトリにあります。
ガイドライン
pkgname
の末尾に-cvs
,-svn
,-hg
,-darcs
,-bzr
,-git
などを付けて下さい。パッケージが特定のリリースを取得する場合は別です。
- 依存関係, URL, ソースなどの変更を行なったことで作られるパッケージが異なるようになった時は
pkgrel
の値を増やして下さい。pkgver
を変える必要はありません。
--holdver
を使うことで makepkg がpkgver
を更新するのを止めることができます (参照: makepkg(8))
- パッケージに conflicts と provides を含めて下さい (例えば fluxbox-gitAUR なら:
conflicts=('fluxbox')
とprovides=('fluxbox')
)。
replaces=()
は一般的に不必要な問題を起こすので使わないで下さい。
- cvsroot を使う場合、空のパスワードや
anonymous:password@
を入力するのを避けるためにanonymous@
ではなくanonymous:@
を使って下さい。
makedepends=()
に適当な VCS ツールを含めて下さい (cvs, subversion, git, ...)。
VCS ソース
pacman 4.1 から、VCS ソースは source=()
に指定することになり他のソースと同じように扱われるようになりました。makepkg
はリポジトリを $SRCDEST
(makepkg.conf(5) の設定がない場合は $startdir
と同じ) に複製・チェックアウト・ブランチして $srcdir
にコピーします (それぞれの VCS に合わせた方法を使います)。ローカルリポジトリは変更がされないので、-build
ディレクトリを作る必要はありません。
VCS の source=()
の一般的なフォーマットは:
source=('[folder::][vcs+]url[#fragment]')
folder
(任意) はデフォルトのリポジトリ名を (trunk
など) 無関係な名前から他の名前に変更するため、もしくは以前のソースを維持するために使われます。vcs+
は VCS のタイプを表さない URL で必要です (例:git+http://some_repo
)。url
はリモートやローカルのリポジトリの URL です。#fragment
(任意) は特定のブランチやコミットを pull するのに必要です。各 VCS で使えるフラグメントの詳細はman PKGBUILD
を見て下さい。
Git の source の例:
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
Subversion
pkgver() { cd "$srcdir/repo" local ver="$(svnversion)" printf "r%s" "${ver//[[:alpha:]]}" }
r8546
Mercurial
pkgver() { cd "$srcdir/repo" printf "r%s.%s" "$(hg identify -n)" "$(hg identify -i)" }
r2813.75881cc5391e
Bazaar
pkgver() { cd "$srcdir/repo" printf "r%s" "$(bzr revno)" }
r830
Fallback
リポジトリから pkgver
が全く得られない場合は、現在の日付を使うことができます:
pkgver() { date +%Y%m%d }
20130408
ソースツリーの状態を一意に示しているのではないので、出来る限り使わないで下さい。
Tips
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 を直接 source に加えて、それから 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 }