「Go パッケージガイドライン」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(翻訳)
 
 
(同じ利用者による、間の8版が非表示)
1行目: 1行目:
 
[[Category:パッケージ開発]]
 
[[Category:パッケージ開発]]
 
[[en:Go package guidelines]]
 
[[en:Go package guidelines]]
  +
[[pt:Go package guidelines]]
  +
[[zh-hans:Go package guidelines]]
 
{{Package Guidelines}}
 
{{Package Guidelines}}
  +
このドキュメントでは、[[Go]] の [[PKGBUILD]] の作成に関する標準とガイドラインについて説明します。
   
  +
== 一般的なガイドライン ==
[[Wikipedia:ja:Go (プログラミング言語)|Go]] は Arch Linux で十分にサポートされています。
 
   
  +
=== パッケージの命名 ===
{{Pkg|go}} パッケージには ({{Ic|go fix}}, {{Ic|go build}} などを実行するための) '''go''' ツールが含まれています。また {{Pkg|gcc-go}} は {{Ic|gccgo}} を提供します。
 
   
  +
パッケージが Go エコシステムと強く結合したプログラムを提供する場合は、{{ic|go-''modulename''}} を使用します。他のアプリケーションの場合は、プログラム名のみを使用します。
[https://github.com/seletskiy/go-makepkg go-makepkg] ツールを使うことで手動で PKGBUILD ファイルを作成しなくても簡単に Go のプログラムをパッケージ化できます。
 
   
  +
{{Note|パッケージ名は完全に小文字にする必要があります}}
== 一般的なガイドライン ==
 
   
=== 命名 ===
+
== ビルド ==
* Go で書かれたアプリケーションの場合、パッケージ名はアプリケーションの名前にしてください (小文字)。
 
** パッケージ名が既に使われている場合は何か別の名前を考案してください。
 
* Go で書かれたライブラリの場合、{{Ic|go-''modulename''}} という名前にしてください (小文字)。
 
** ライブラリの名前に {{Ic|go-}} と付いている場合は、パッケージ名を {{Ic|go-''go-modulename''}} とせず {{Ic|go-''modulename''}} としてください。
 
* パッケージをダウンロードするのに "go" ツールを使用する PKGBUILD の場合、tarball やタグ付きリリースからビルドされない場合にのみパッケージ名に "-git" を追加してください (trunk/HEAD からビルドされる場合)。
 
** mercurial のパッケージの場合でも、同じようにリリース版でないときにパッケージ名に "-hg" と追加してください。
 
** 他のバージョン管理システムでも同じようにしてください。
 
** どのブランチやタグを使用するべきか決めるときに go ツールには独自のロジックがあります。{{Ic|go get --help}} を見てください。
 
* 同じ名前のアプリケーションが複数ある場合はパッケージ名に開発者の名前を追加すると良いでしょう。例: {{AUR|dcpu16-kballard}}。
 
** 一般的には、最も人気のあるパッケージが一番短くてわかりやすい名前を使用するべきです。
 
* プロジェクトの公式リリースが存在しない場合にパッケージ名に ({{Ic|-hg}}, {{Ic|-git}}, {{Ic|-svn}} などの) 文字列を付け加えるかは任意です。VCS からパッケージがダウンロードされる場合は付けるのが普通ですが、Go のプロジェクトの多くにはリリース tarball が存在せず、''trunk'' でない場合に公式リリースとしてブランチやタグが付けられるリポジトリしかありません。また、''Go'' のモジュールをインストールするときに使用する「公式」の手段である {{Ic|go get}} はリポジトリを直接使用します。
 
   
=== パッケージ ===
+
=== 依存関係 ===
* Go プロジェクトはライブラリファイルか実行ファイル、あるいはその両方です。適切な方法でパッケージ化してください。以下では複数の例を示します。
 
* Go アプリケーションやライブラリの中には最新バージョンの Go にあわせて更新されていないものがあります。
 
** {{Ic|go build -fix}} で大抵は動作しますが、修正は開発者が行うべきです。問題がある場合は上流に報告してください。
 
* Go プロジェクトの中にはバージョン番号やライセンスファイルを持たないものがあります。
 
** ライセンスファイルが存在しない場合は license=('unknown') を使用して開発者に問題を報告してください。
 
** バージョン番号が存在しない場合は "0.1", "1" あるいは git のリビジョン (あるいは他のバージョン管理システムの同等のバージョン) を使用してください。
 
** もしくは、バージョン番号として日付を使ってください。形式: {{Ic|YYYYMMDD}}。
 
* Go アプリケーションは基本的に静的コンパイルされるため、Go ライブラリをパッケージ化する理由はあまり多くありません。
 
   
  +
Go 1.11 では、[https://github.com/golang/go/wiki/Modules go modules] の初期サポートが導入されました。これにより、Go のアップストリームコードで依存関係を宣言し、特定のプロジェクトバージョンに固定できるようになります。現在、私たちのパッケージ化作業では、これをベンダー依存関係に利用しています。
== サンプル PKGBUILD ==
 
   
=== Go で書かれたアプリションのサンル PKGBUILD ===
+
==== Go モジュールを使用しないストリーロジェクト ====
   
  +
Go モジュールを使用しないアップストリームコードの場合は、次の回避策があります。アップストリームで問題を提出することを検討してください。
{{bc|<nowiki># Maintainer: NAME <EMAIL>
 
   
  +
{{hc|PKGBUILD|2=
pkgname=PACKAGE NAME
 
  +
<nowiki>
pkgver=1.2.3
 
  +
url=https://github.com/upstream_user/upstream_project
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() {
+
prepare() {
 
cd "$pkgname-$pkgver"
 
cd "$pkgname-$pkgver"
  +
go mod init "${url#https://}" # strip https:// from canonical URL
 
go build
+
go mod tidy
 
}
 
}
  +
</nowiki>
  +
}}
   
  +
{{Note|このようなハッキングを行うと、パッケージのビルド間でモジュールが変更されるため、パッケージが再現できなくなります。}}
package() {
 
cd "$pkgname-$pkgver"
 
   
  +
=== フラグとビルドオプション ===
install -Dm755 "$pkgname-$pkgver" "$pkgdir/usr/bin/$pkgname"
 
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
 
}
 
   
  +
go アプリケーション用に書かれたほとんどの Makefile は、{{ic|GOFLAGS}} を上書きしたり、ビルドシステムが提供するビルドフラグを尊重していません。このため、コンパイラのために {{ic|CGO_CFLAGS}} と {{ic|CGO_LDFLAGS}} が設定されている必要があるので、Go バイナリが [https://www.redhat.com/en/blog/hardening-elf-binaries-using-relocation-read-only-relro RELRO] でコンパイルされません。これを Makefile にパッチするか、Makefile を省略する必要があります。
# vim:set ts=2 sw=2 et:</nowiki>}}
 
   
  +
{{bc|1=
==== サンプルパッケージ ====
 
  +
export CGO_CPPFLAGS="${CPPFLAGS}"
* {{Pkg|gendesk}}
 
  +
export CGO_CFLAGS="${CFLAGS}"
* {{AUR|dcpu16}}
 
  +
export CGO_CXXFLAGS="${CXXFLAGS}"
  +
export CGO_LDFLAGS="${LDFLAGS}"
  +
export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
   
  +
# or alternatively you can define some of these flags from the CLI options
=== ソースファイルがひとつしかない場合のサンプル PKGBUILD ===
 
  +
go build \
  +
-trimpath \
  +
-buildmode=pie \
  +
-mod=readonly \
  +
-modcacherw \
  +
-ldflags "-linkmode external -extldflags \"${LDFLAGS}\"" \
  +
.
  +
}}
   
  +
==== フラグの意味 ====
{{bc|<nowiki># Maintainer: NAME <EMAIL>
 
   
  +
* {{ic|1=-buildmode=pie}} バイナリ強化のために [[Wikipedia:ja:位置独立コード|PIE コンパイル]] を有効にします。
pkgname=PACKAGE NAME
 
  +
* {{ic|-trimpath}} [[再現性のあるビルド]] にとって重要であるため、完全なビルドパスとモジュールパスは埋め込まれません。
pkgver=1.2.3
 
  +
* {{ic|1=-mod=readonly}} どの go アクションでもモジュールファイルが更新されていないことを確認してください。
pkgrel=1
 
  +
* {{ic|-modcacherw}} は重要ではありませんが、これにより go モジュールが書き込み可能なパスを作成することが保証されます。デフォルトは読み取り専用です。
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')
 
   
  +
{{Tip|パッケージソースに {{ic|modules.txt}} を含む {{ic|vendor}} ディレクトリが含まれている場合、{{ic|-mod}} フラグを次のように安全に変更できます。{{ic|1=-mod=vendor}}.}}
build() {
 
go build -o "$pkgname"
 
}
 
   
  +
{{Warning|ビルドフラグがコンパイラに正しく渡されたことを確認するのはパッケージャーの責任です。{{ic|Makefile}} がある場合はそれを読みます。}}
package() {
 
install -Dm755 "$pkgname" "$pkgdir/usr/bin/$pkgname"
 
}
 
   
  +
==== デバッグパッケージのサポート ====
# vim:set ts=2 sw=2 et:</nowiki>}}
 
   
  +
ソースリストと適切なシンボルルックアップを使用してデバッグパッケージを有効にするには、デフォルトのビルドフラグをいくつか変更する必要があります。
==== サンプルパッケージ ====
 
* {{AUR|gorun}}
 
   
  +
* ソースパスがバイナリで確実に書き換えられるようにするため、{{ic|-trimpath}} を削除
=== 実行ファイルも含む Go ライブラリのサンプル PKGBUILD ===
 
  +
* 現在のツールは圧縮ヘッダーをサポートしていないため、DWARF ヘッダーを確実に解析できるように、{{ic|1=-compressdwarf=false}} を {{ic|-ldflags}} に含めます。
  +
* Go が使用する内部リンカーとして {{ic|1=-linkmode=external}} がバイナリにビルド ID を埋め込まないようにしてください。
  +
* {{ic|1=GOPATH="${srcdir}"}} を含めると、''makepkg'' にすべてのモジュールのソースコードを含めることができます。
   
  +
上記のオプションは、適切に分離されたシンボルとソースリストを持つデバッグパッケージを生成し、デバッガがそれをピックアップできるようにします。
==== ''go get'' を使う (推奨) ====
 
   
  +
{{bc|1=
以下は go get を使用する方法です。
 
  +
export CGO_CPPFLAGS="${CPPFLAGS}"
  +
export CGO_CFLAGS="${CFLAGS}"
  +
export CGO_CXXFLAGS="${CXXFLAGS}"
  +
export CGO_LDFLAGS="${LDFLAGS}"
  +
export GOPATH="${srcdir}"
  +
export GOFLAGS="-buildmode=pie -mod=readonly -modcacherw"
   
  +
go build -ldflags "-compressdwarf=false -linkmode external" .
build() や package() 関数を修正する必要は全くありません。変数だけを修正してください (pkgname など)。
 
  +
}}
   
  +
=== 出力ディレクトリ ===
以下の方法が使えない場合、まずは go get をテストしてみてください。
 
   
  +
現在、プロジェクト内のすべての Go バイナリをビルドする方法はいくつかあります。
{{Note|PKGBUILD でパッケージの作成が失敗する場合は {{Ic|/...}} を削除してください。}}
 
   
  +
{{bc|
{{bc|<nowiki># Maintainer: NAME <EMAIL>
 
  +
build(){
  +
cd "$pkgname-$pkgver"
  +
go build -o output-binary .
  +
}
  +
}}
   
  +
{{ic|...}} は、コンパイラがディレクトリに再帰的に降りてすべてのバイナリを検索するための省略表現です。出力ディレクトリと組み合わせて使用​​し、すべてをビルドできます。
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
 
   
  +
{{bc|
build() {
 
  +
prepare(){
GOPATH="$srcdir" go get -fix -v -x ${_gourl}/...
 
  +
cd "$pkgname-$pkgver"
  +
mkdir -p build
 
}
 
}
   
check() {
+
build(){
  +
cd "$pkgname-$pkgver"
GOPATH="$GOPATH:$srcdir" go test -v -x ${_gourl}/...
 
  +
go build -o build ./cmd/...
 
}
 
}
  +
}}
   
  +
== サンプル PKGBUILD ==
package() {
 
mkdir -p "$pkgdir/usr/bin"
 
install -p -m755 "$srcdir/bin/"* "$pkgdir/usr/bin"
 
   
  +
{{bc|<nowiki>
mkdir -p "$pkgdir/$GOPATH"
 
  +
pkgname=foo
cp -Rv --preserve=timestamps "$srcdir/"{src,pkg} "$pkgdir/$GOPATH"
 
  +
pkgver=0.0.1
  +
pkgrel=1
  +
pkgdesc='Go PKGBUILD Example'
  +
arch=('x86_64')
  +
url="https://example.org/$pkgname"
  +
license=('GPL')
  +
makedepends=('go')
  +
source=("$url/$pkgname-$pkgver.tar.gz")
  +
sha256sums=('1337deadbeef')
   
  +
prepare(){
# Package license (if available)
 
  +
cd "$pkgname-$pkgver"
for f in LICENSE COPYING LICENSE.* COPYING.*; do
 
  +
mkdir -p build/
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:</nowiki>}}
 
 
上記の PKBUILD は Rémy Oudompheng‎ が作成しました。
 
 
==== ''go get'' を使う ====
 
 
build() や package() 関数を修正する必要は全くありません。変数だけを修正してください (pkgname など)。
 
 
以下の方法が使えない場合、まずは go get をテストしてみてください。
 
 
{{bc|<nowiki># 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() {
 
build() {
  +
cd "$pkgname-$pkgver"
export GOROOT=/usr/lib/go
 
  +
export CGO_CPPFLAGS="${CPPFLAGS}"
  +
export CGO_CFLAGS="${CFLAGS}"
  +
export CGO_CXXFLAGS="${CXXFLAGS}"
  +
export CGO_LDFLAGS="${LDFLAGS}"
  +
export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
  +
go build -o build ./cmd/...
  +
}
   
  +
check() {
rm -rf build
 
  +
cd "$pkgname-$pkgver"
mkdir -p build/go
 
cd build/go
+
go test ./...
 
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() {
 
package() {
  +
cd "$pkgname-$pkgver"
export GOROOT="$GOPATH"
 
  +
install -Dm755 build/$pkgname "$pkgdir"/usr/bin/$pkgname
  +
}
  +
</nowiki>}}
   
  +
== パッケージ例 ==
# 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
 
}
 
   
  +
* {{Pkg|podman}}
# vim:set ts=2 sw=2 et:</nowiki>}}
 
  +
* {{Pkg|k9s}}
  +
* {{Pkg|helm}}

2023年6月30日 (金) 03:54時点における最新版

このドキュメントでは、GoPKGBUILD の作成に関する標準とガイドラインについて説明します。

一般的なガイドライン

パッケージの命名

パッケージが Go エコシステムと強く結合したプログラムを提供する場合は、go-modulename を使用します。他のアプリケーションの場合は、プログラム名のみを使用します。

ノート: パッケージ名は完全に小文字にする必要があります

ビルド

依存関係

Go 1.11 では、go modules の初期サポートが導入されました。これにより、Go のアップストリームコードで依存関係を宣言し、特定のプロジェクトバージョンに固定できるようになります。現在、私たちのパッケージ化作業では、これをベンダー依存関係に利用しています。

Go モジュールを使用しないアップストリームプロジェクト

Go モジュールを使用しないアップストリームコードの場合は、次の回避策があります。アップストリームで問題を提出することを検討してください。

PKGBUILD
url=https://github.com/upstream_user/upstream_project

prepare() {
  cd "$pkgname-$pkgver"
  go mod init "${url#https://}" # strip https:// from canonical URL
  go mod tidy
}
ノート: このようなハッキングを行うと、パッケージのビルド間でモジュールが変更されるため、パッケージが再現できなくなります。

フラグとビルドオプション

go アプリケーション用に書かれたほとんどの Makefile は、GOFLAGS を上書きしたり、ビルドシステムが提供するビルドフラグを尊重していません。このため、コンパイラのために CGO_CFLAGSCGO_LDFLAGS が設定されている必要があるので、Go バイナリが RELRO でコンパイルされません。これを Makefile にパッチするか、Makefile を省略する必要があります。

export CGO_CPPFLAGS="${CPPFLAGS}"
export CGO_CFLAGS="${CFLAGS}"
export CGO_CXXFLAGS="${CXXFLAGS}"
export CGO_LDFLAGS="${LDFLAGS}"
export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"

# or alternatively you can define some of these flags from the CLI options
go build \
    -trimpath \
    -buildmode=pie \
    -mod=readonly \
    -modcacherw \
    -ldflags "-linkmode external -extldflags \"${LDFLAGS}\"" \
    .

フラグの意味

  • -buildmode=pie バイナリ強化のために PIE コンパイル を有効にします。
  • -trimpath 再現性のあるビルド にとって重要であるため、完全なビルドパスとモジュールパスは埋め込まれません。
  • -mod=readonly どの go アクションでもモジュールファイルが更新されていないことを確認してください。
  • -modcacherw は重要ではありませんが、これにより go モジュールが書き込み可能なパスを作成することが保証されます。デフォルトは読み取り専用です。
ヒント: パッケージソースに modules.txt を含む vendor ディレクトリが含まれている場合、-mod フラグを次のように安全に変更できます。-mod=vendor.
警告: ビルドフラグがコンパイラに正しく渡されたことを確認するのはパッケージャーの責任です。Makefile がある場合はそれを読みます。

デバッグパッケージのサポート

ソースリストと適切なシンボルルックアップを使用してデバッグパッケージを有効にするには、デフォルトのビルドフラグをいくつか変更する必要があります。

  • ソースパスがバイナリで確実に書き換えられるようにするため、-trimpath を削除
  • 現在のツールは圧縮ヘッダーをサポートしていないため、DWARF ヘッダーを確実に解析できるように、-compressdwarf=false-ldflags に含めます。
  • Go が使用する内部リンカーとして -linkmode=external がバイナリにビルド ID を埋め込まないようにしてください。
  • GOPATH="${srcdir}" を含めると、makepkg にすべてのモジュールのソースコードを含めることができます。

上記のオプションは、適切に分離されたシンボルとソースリストを持つデバッグパッケージを生成し、デバッガがそれをピックアップできるようにします。

export CGO_CPPFLAGS="${CPPFLAGS}"
export CGO_CFLAGS="${CFLAGS}"
export CGO_CXXFLAGS="${CXXFLAGS}"
export CGO_LDFLAGS="${LDFLAGS}"
export GOPATH="${srcdir}"
export GOFLAGS="-buildmode=pie -mod=readonly -modcacherw"

go build -ldflags "-compressdwarf=false -linkmode external" .

出力ディレクトリ

現在、プロジェクト内のすべての Go バイナリをビルドする方法はいくつかあります。

build(){
    cd "$pkgname-$pkgver"
    go build -o output-binary .
}

... は、コンパイラがディレクトリに再帰的に降りてすべてのバイナリを検索するための省略表現です。出力ディレクトリと組み合わせて使用​​し、すべてをビルドできます。

prepare(){
    cd "$pkgname-$pkgver"
    mkdir -p build
}

build(){
    cd "$pkgname-$pkgver"
    go build -o build ./cmd/...
}

サンプル PKGBUILD

pkgname=foo
pkgver=0.0.1
pkgrel=1
pkgdesc='Go PKGBUILD Example'
arch=('x86_64')
url="https://example.org/$pkgname"
license=('GPL')
makedepends=('go')
source=("$url/$pkgname-$pkgver.tar.gz")
sha256sums=('1337deadbeef')

prepare(){
  cd "$pkgname-$pkgver"
  mkdir -p build/
}

build() {
  cd "$pkgname-$pkgver"
  export CGO_CPPFLAGS="${CPPFLAGS}"
  export CGO_CFLAGS="${CFLAGS}"
  export CGO_CXXFLAGS="${CXXFLAGS}"
  export CGO_LDFLAGS="${LDFLAGS}"
  export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
  go build -o build ./cmd/...
}

check() {
  cd "$pkgname-$pkgver"
  go test ./...
}

package() {
  cd "$pkgname-$pkgver"
  install -Dm755 build/$pkgname "$pkgdir"/usr/bin/$pkgname
}

パッケージ例