GoバイナリをDebianパッケージに入れるにはどうすればよいですか? Goは静的にリンクされているので、実行ファイルは1つだけです-複雑なプロジェクトのメタデータ情報をあまり必要としません。 debuild
のトラウマを経由せずに実行可能ファイルとリソースファイルをパッケージ化する簡単な方法はありますか?
私は既存の質問をすべて調べました。ただし、私のすべての調査では、golang開発環境を含む.debファイル(つまり、Sudo apt-get install golang-go
)。
上手。 debuild
の唯一の「トラウマ」は、パッケージのビルド後にlintian
を実行することであり、lintian
がパッケージの問題を見つけようとすることです。
したがって、状況に対処するには2つの方法があります。
debuild
は使用しないでください。このツールは、実際に必要なパワーリフティングを実行するdpkg-buildpackage
を呼び出すだけです。バイナリパッケージをビルドするための通常の呼び出しはdpkg-buildpackage -us -uc -b
です。 debuild clean
などの他の目的でdebuild
を呼び出すこともできます。lintian
にselectedの問題をあなたが主張するあなたのパッケージは問題ではありません。どちらのアプローチも、パッケージ化ツールによってアプリケーションをビルドしようとせず、パッケージにラップされたblobとして扱うことを意味します。これには、通常のdebian/rules
の動作を少し控える必要があります(何も構築しないようにするため)。
/可能性のある別の解決策(実際には、Debianっぽい方法です)は、gcc-go
(リンクにgold
を使用)を試すことです):GCCフロントエンドなので、このツールは動的にリンクされたアプリケーション(libgo
またはこのようなものに対してリンクする)を生成します。私は個人的にはまだそれを使ったことがなく、パッケージをDebian本体にプッシュしようとする場合にのみ使用することを検討します。
Debian向けのGoプログラムのパッケージ化に関する一般的な質問については、次のリソースが役立つかもしれません。
2015-10-15の更新。
(この投稿はまだ検索および発見され、研究されているようですので、現状をよりよく反映するように更新することにしました。)
それ以来、Goアプリとパッケージのパッケージ化の状況は劇的に改善され、gcc-go
ではなく「クラシック」Go(Googleに由来するいわゆるgc
スイート)を使用してDebianパッケージを構築することが可能になりました。 。また、パッケージには優れたインフラストラクチャも存在します。
Goプログラムをdebian化するときに使用する主要なツールはdh-golang
です ここ で説明されています。
私はこれを自分で調べたところ、基本的にそこにいます。
Canonicalの既存のGoプロジェクトの1つから「package」ブランチから「借用」することにより、dpkg-buildpackageを使用してパッケージをビルドできます。
依存関係をインストールし、別のリポジトリから「パッケージ」ブランチを取得します。
_ # I think this list of packages is enough. May need dpkg-dev aswell.
Sudo apt-get install bzr debhelper build-essential golang-go
bzr branch lp:~niemeyer/cobzr/package mypackage-build
cd mypackage-build
_
メタデータを編集します。
Build-Depends: debhelper (>= 7.0.50~), golang-stable
)と3つのアーキテクチャに注意してください。 Ubuntu(gophers ppaなし)を使用して、golang-stableをgolang-goに変更する必要がありました。cd $(GOPATH)/src && find * -name '*.go' -exec dirname {} \; | xargs -n1 go install
ソースをsrcフォルダーに入れます。例えば.
_ git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
_
または例2
_ cp .../yourpackage/ src/
_
パッケージをビルドする
_ # -us -uc skips package signing.
dpkg-buildpackage -us -uc
_
これにより、ご使用のアーキテクチャーのバイナリー.debファイルに加えて、「ソースdeb」(。tgz)とソースdeb記述ファイル(.dsc)が生成されます。
それで、Canonical(Ubuntuの人々)がGoを使用していて、一部のGoプロジェクトの.debパッケージをビルドしていることに気付きました。 UbuntuはDebianに基づいているため、ほとんどの場合、同じアプローチを両方のディストリビューションに適用する必要があります(依存関係の名前は多少異なる場合があります)。
UbuntuのLaunchpadリポジトリには、Goベースのパッケージがいくつかあります。これまでのところ、 cobzr (bzrのgitスタイルの分岐)と juju-core (Pythonから移植されたdevopsプロジェクト)を見つけました。
これらのプロジェクトにはどちらも「トランク」と「パッケージ」の両方のブランチがあり、パッケージブランチ内の_debian/
_フォルダーを確認できます。ここで最も重要な2つのファイルは debian/control および debian/rules です-「参照ソース」にリンクしています。
私がカバーしていないことの1つは、パッケージをクロスコンパイルすることです(3、386/arm/AMD64の他の2つのアーキテクチャに)。クロスコンパイルはgoでそれほど難しくありません(各ターゲットプラットフォームのツールチェーンをビルドしてから、 'go build'中にいくつかのENV変数を設定する必要があります)。私はクロスコンパイラユーティリティを自分で開発しています。最終的には.debサポートをユーティリティに追加したいと思っていますが、最初にこのタスクを具体化する必要があります。
幸運を。進捗があった場合は、私の回答を更新するか、コメントを追加してください。ありがとう
Goアプリケーションからのdebまたはrpmパッケージのビルドも、fpmを使用すると非常に簡単です。
Rubygemsから取得します。
gem install fpm
バイナリをビルドした後、 foobar、次のようにパッケージ化できます:
fpm -s dir -t deb -n foobar -v 0.0.1 foobar=/usr/bin/
fpmは、あらゆる種類の高度なパッケージオプションをサポートしています。
Goのパッケージ化手順を説明する公式のDebianポリシードキュメントがあります: https://go-team.pages.debian.net/packaging.html
librariesの場合: dh-make-golang を使用してパッケージスケルトンを作成します。インポートパスから派生した名前に-dev
サフィックスを付けて、パッケージに名前を付けます。 golang-github-lib-pq-dev。依存関係をDepends:
行に指定します。 (Goがすべてのソースを静的にリンクしているため、これらは実行用のバイナリ依存ではなく、ビルド用のソース依存です。)
ライブラリパッケージをインストールすると、そのソースコードが/usr/share/golang/src
にインストールされます(コンパイルされたライブラリが.../pkg
に入る可能性があります)。依存するGoパッケージをビルドすると、システム全体の場所にあるアーティファクトが使用されます。
executablesの場合: dh-golang を使用してパッケージを作成します。 Build-Depends:
行で依存関係を指定します(依存関係のパッケージ化については上記を参照)。