Go パッケージガイドライン

提供: ArchWiki
2016年11月7日 (月) 23:22時点におけるKusakata (トーク | 投稿記録)による版 (翻訳)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

Go は Arch Linux で十分にサポートされています。

go パッケージには (go fix, go build などを実行するための) go ツールが含まれています。また gcc-gogccgo を提供します。

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:

サンプルパッケージ

実行ファイルも含む Go ライブラリのサンプル PKGBUILD

go get を使う (推奨)

以下は go get を使用する方法です。

build() や package() 関数を修正する必要は全くありません。変数だけを修正してください (pkgname など)。

以下の方法が使えない場合、まずは go get をテストしてみてください。

ノート: PKGBUILD でパッケージの作成が失敗する場合は /... を削除してください。
# 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: