Skip to content
Latchkey

GoReleaser vs nFPM: リリース vs パッケージ build

両者は重なりますがスコープが異なります。nFPM はネイティブなツールチェーンなしにシンプルな設定から Linux パッケージ (deb、rpm、apk) を build し、GoReleaser はリリース全体 (build、archive、package、checksum、publish) を自動化し、パッケージングステップでは内部で nFPM を使います。

GoReleaser と nFPM はどちらも Go プロジェクト (およびそれ以外) で人気ですが、ソフトウェア出荷の異なる部分を担います。nFPM は絞り込まれた依存のない packager で、dpkg や rpmbuild をインストールせずに 1 つの YAML ファイルから deb、rpm、apk パッケージを生成します。GoReleaser はエンドツーエンドのリリースツールで、クロスプラットフォームのバイナリをコンパイルし、archive と checksum を作成し、(nFPM 経由で) パッケージを build し、GitHub/registry に公開します。

GoReleasernFPM
スコープ完全なリリース pipelineパッケージ build のみ
出力バイナリ、archive、パッケージ、リリースdeb、rpm、apk パッケージ
クロスコンパイルあり (build を管理)なし (ファイルは自分で用意)
公開GitHub、registry、Homebrew などなし (パッケージを生成するだけ)
必要なネイティブツール不要不要 (純粋な実装)
関係内部で nFPM を使用ビルディングブロック

それぞれが本当に優れている点

nFPM はパッケージングだけが必要な場合に優れます。既存のバイナリとファイルを、ディストロ固有のツールをインストールせずに deb/rpm/apk へ変換でき、最小限の CI イメージに最適です。GoReleaser はリリース全体を自動化したい場合に優れます。クロスコンパイル、archive、checksum、changelog、署名、そして GitHub Releases、コンテナ registry、パッケージマネージャーへの公開を、すべて 1 つの設定から処理します。

CI では

GoReleaser は CI 向けに作られています。tag 付きのリリースが goreleaser release をトリガーし、あらゆる artifact を生成して公開します。多くの場合、単一の workflow ステップとして行われます。パッケージだけが必要な場合 (例えば build が別の方法ですでにバイナリを生成する場合)、nFPM は CI ステップを小さくツールチェーン不要に保ちます。多くの pipeline は、シンプルなパッケージ出力には nFPM を直接使い、完全なリリースオーケストレーションが欲しいときに GoReleaser を使います。

正直な注意点

GoReleaser は広範ですが Go プロジェクトで最も使いやすく、他の言語で使うのは動作はしますが慣用的ではなく、設定が大きくなることがあります。nFPM は意図的に狭く、build も、署名と公開も、リリース管理も行わないため、それらのステップは自分で配線します。nFPM を選ぶということは、pipeline のより多くを手動で組み立てることを意味します。

結論

ネイティブなツールなしに deb/rpm/apk パッケージだけが必要なら nFPM を使いましょう。完全なリリース自動化 (build、package、sign、publish) が欲しいなら、パッケージング部分で nFPM に依存していることを念頭に置きつつ GoReleaser を使いましょう。

関連ガイド