Go パッケージガイドライン
ナビゲーションに移動
検索に移動
パッケージ作成ガイドライン
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
Go は Arch Linux で十分にサポートされています。
go パッケージには (go fix
, go build
などを実行するための) go ツールが含まれています。また gcc-go は gccgo
を提供します。
go-makepkg ツールを使うことで手動で PKGBUILD ファイルを作成しなくても簡単に Go のプログラムをパッケージ化できます。
目次
一般的なガイドライン
命名
- Go で書かれたアプリケーションの場合、パッケージ名はアプリケーションの名前にしてください (小文字)。
- パッケージ名が既に使われている場合は何か別の名前を考案してください。
- Go で書かれたライブラリの場合、
go-modulename
という名前にしてください (小文字)。- ライブラリの名前に
go-
と付いている場合は、パッケージ名をgo-go-modulename
とせずgo-modulename
としてください。
- ライブラリの名前に
- パッケージをダウンロードするのに "go" ツールを使用する PKGBUILD の場合、tarball やタグ付きリリースからビルドされない場合にのみパッケージ名に "-git" を追加してください (trunk/HEAD からビルドされる場合)。
- mercurial のパッケージの場合でも、同じようにリリース版でないときにパッケージ名に "-hg" と追加してください。
- 他のバージョン管理システムでも同じようにしてください。
- どのブランチやタグを使用するべきか決めるときに go ツールには独自のロジックがあります。
go get --help
を見てください。
- 同じ名前のアプリケーションが複数ある場合はパッケージ名に開発者の名前を追加すると良いでしょう。例: dcpu16-kballardAUR。
- 一般的には、最も人気のあるパッケージが一番短くてわかりやすい名前を使用するべきです。
- プロジェクトの公式リリースが存在しない場合にパッケージ名に (
-hg
,-git
,-svn
などの) 文字列を付け加えるかは任意です。VCS からパッケージがダウンロードされる場合は付けるのが普通ですが、Go のプロジェクトの多くにはリリース tarball が存在せず、trunk でない場合に公式リリースとしてブランチやタグが付けられるリポジトリしかありません。また、Go のモジュールをインストールするときに使用する「公式」の手段であるgo get
はリポジトリを直接使用します。
パッケージ
- Go プロジェクトはライブラリファイルか実行ファイル、あるいはその両方です。適切な方法でパッケージ化してください。以下では複数の例を示します。
- Go アプリケーションやライブラリの中には最新バージョンの Go にあわせて更新されていないものがあります。
go build -fix
で大抵は動作しますが、修正は開発者が行うべきです。問題がある場合は上流に報告してください。
- Go プロジェクトの中にはバージョン番号やライセンスファイルを持たないものがあります。
- ライセンスファイルが存在しない場合は license=('unknown') を使用して開発者に問題を報告してください。
- バージョン番号が存在しない場合は "0.1", "1" あるいは git のリビジョン (あるいは他のバージョン管理システムの同等のバージョン) を使用してください。
- もしくは、バージョン番号として日付を使ってください。形式:
YYYYMMDD
。
- Go アプリケーションは基本的に静的コンパイルされるため、Go ライブラリをパッケージ化する理由はあまり多くありません。
サンプル PKGBUILD
Go で書かれたアプリケーションのサンプル PKGBUILD
# Maintainer: NAME <EMAIL> pkgname=PACKAGE NAME pkgver=1.2.3 pkgrel=1 pkgdesc="PACKAGE DESCRIPTION" arch=('x86_64' 'i686') url="http://SERVER/$pkgname/" license=('MIT') makedepends=('go') options=('!strip' '!emptydirs') source=("http://SERVER/$pkgname/$pkgname-$pkgver.tar.gz") sha256sums=('00112233445566778899aabbccddeeff') build() { cd "$pkgname-$pkgver" go build } package() { cd "$pkgname-$pkgver" install -Dm755 "$pkgname-$pkgver" "$pkgdir/usr/bin/$pkgname" install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" } # vim:set ts=2 sw=2 et:
サンプルパッケージ
ソースファイルがひとつしかない場合のサンプル PKGBUILD
# Maintainer: NAME <EMAIL> pkgname=PACKAGE NAME pkgver=1.2.3 pkgrel=1 pkgdesc="PACKAGE DESCRIPTION" arch=('x86_64' 'i686') url="http://SERVER/$pkgname/" license=('GPL3') makedepends=('go') options=('!strip' '!emptydirs') source=("http://SERVER/$pkgname/$pkgname.go") sha256sums=('00112233445566778899aabbccddeeff') build() { go build -o "$pkgname" } package() { install -Dm755 "$pkgname" "$pkgdir/usr/bin/$pkgname" } # vim:set ts=2 sw=2 et:
サンプルパッケージ
- gorunAUR
実行ファイルも含む Go ライブラリのサンプル PKGBUILD
go get を使う (推奨)
以下は go get を使用する方法です。
build() や package() 関数を修正する必要は全くありません。変数だけを修正してください (pkgname など)。
以下の方法が使えない場合、まずは go get をテストしてみてください。
# Maintainer: NAME <EMAIL> pkgname=codesearch pkgver=20120515 pkgrel=1 pkgdesc="Code indexing and search written in Go" arch=('x86_64' 'i686') url="https://github.com/google/codesearch" license=('BSD') depends=('go') makedepends=('mercurial') options=('!strip' '!emptydirs') _gourl=github.com/google/codesearch build() { GOPATH="$srcdir" go get -fix -v -x ${_gourl}/... } check() { GOPATH="$GOPATH:$srcdir" go test -v -x ${_gourl}/... } package() { mkdir -p "$pkgdir/usr/bin" install -p -m755 "$srcdir/bin/"* "$pkgdir/usr/bin" mkdir -p "$pkgdir/$GOPATH" cp -Rv --preserve=timestamps "$srcdir/"{src,pkg} "$pkgdir/$GOPATH" # Package license (if available) for f in LICENSE COPYING LICENSE.* COPYING.*; do if [ -e "$srcdir/src/$_gourl/$f" ]; then install -Dm644 "$srcdir/src/$_gourl/$f" \ "$pkgdir/usr/share/licenses/$pkgname/$f" fi done } # vim:set ts=2 sw=2 et:
上記の PKBUILD は Rémy Oudompheng が作成しました。
go get を使う
build() や package() 関数を修正する必要は全くありません。変数だけを修正してください (pkgname など)。
以下の方法が使えない場合、まずは go get をテストしてみてください。
# Maintainer: NAME <EMAIL> pkgname=PACKAGE NAME pkgver=1.2.3 pkgrel=1 pkgdesc="PACKAGE DESCRIPTION" arch=('x86_64' 'i686') url="http://SERVER/$pkgname/" license=('MIT') makedepends=('go' 'git') options=('!strip' '!emptydirs') _gourl=SERVER.NET/PATH/MODULENAME build() { export GOROOT=/usr/lib/go rm -rf build mkdir -p build/go cd build/go for f in "$GOROOT/"*; do ln -s "$f" done rm pkg mkdir pkg cd pkg for f in "$GOROOT/pkg/"*; do ln -s "$f" done platform=`for f in "$GOROOT/pkg/"*; do echo \`basename $f\`; done|grep linux` rm "$platform" mkdir "$platform" cd "$platform" for f in "$GOROOT/pkg/$platform/"*.h; do ln -s "$f" done export GOROOT="$srcdir/build/go" export GOPATH="$srcdir/build" go get -fix "$_gourl" # Prepare executable if [ -d "$srcdir/build/src" ]; then cd "$srcdir/build/src/$_gourl" go build -o "$srcdir/build/$pkgname" else echo 'Old sources for a previous version of this package are already present!' echo 'Build in a chroot or uninstall the previous version.' return 1 fi } package() { export GOROOT="$GOPATH" # Package go package files for f in "$srcdir/build/go/pkg/"* "$srcdir/build/pkg/"*; do # If it's a directory if [ -d "$f" ]; then cd "$f" mkdir -p "$pkgdir/$GOROOT/pkg/`basename $f`" for z in *; do # Check if the directory name matches if [ "$z" == `echo $_gourl | cut -d/ -f1` ]; then cp -r $z "$pkgdir/$GOROOT/pkg/`basename $f`" fi done cd .. fi done # Package source files if [ -d "$srcdir/build/src" ]; then mkdir -p "$pkgdir/$GOROOT/src/pkg" cp -r "$srcdir/build/src/"* "$pkgdir/$GOROOT/src/pkg/" find "$pkgdir" -depth -type d -name .git -exec rm -r {} \; fi # Package license (if available) for f in LICENSE COPYING; do if [ -e "$srcdir/build/src/$_gourl/$f" ]; then install -Dm644 "$srcdir/build/src/$_gourl/$f" \ "$pkgdir/usr/share/licenses/$pkgname/$f" fi done # Package executables if [ -e "$srcdir/build/$pkgname" ]; then install -Dm755 "$srcdir/build/$pkgname" \ "$pkgdir/usr/bin/$pkgname" fi } # vim:set ts=2 sw=2 et: