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: