web-dev-qa-db-ja.com

Debian用のGoアプリケーションのパッケージ化

GoバイナリをDebianパッケージに入れるにはどうすればよいですか? Goは静的にリンクされているので、実行ファイルは1つだけです-複雑なプロジェクトのメタデータ情報をあまり必要としません。 debuildのトラウマを経由せずに実行可能ファイルとリソースファイルをパッケージ化する簡単な方法はありますか?

私は既存の質問をすべて調べました。ただし、私のすべての調査では、golang開発環境を含む.debファイル(つまり、Sudo apt-get install golang-go)。

38
weberc2

上手。 debuildの唯一の「トラウマ」は、パッケージのビルド後にlintianを実行することであり、lintianがパッケージの問題を見つけようとすることです。

したがって、状況に対処するには2つの方法があります。

  • debuildは使用しないでください。このツールは、実際に必要なパワーリフティングを実行するdpkg-buildpackageを呼び出すだけです。バイナリパッケージをビルドするための通常の呼び出しはdpkg-buildpackage -us -uc -bです。 debuild cleanなどの他の目的でdebuildを呼び出すこともできます。
  • いわゆる "lintian override" を追加して、lintianselectedの問題をあなたが主張するあなたのパッケージは問題ではありません。

どちらのアプローチも、パッケージ化ツールによってアプリケーションをビルドしようとせず、パッケージにラップされたblobとして扱うことを意味します。これには、通常のdebian/rulesの動作を少し控える必要があります(何も構築しないようにするため)。

/可能性のある別の解決策(実際には、Debianっぽい方法です)は、gcc-go(リンクにgoldを使用)を試すことです):GCCフロントエンドなので、このツールは動的にリンクされたアプリケーション(libgoまたはこのようなものに対してリンクする)を生成します。私は個人的にはまだそれを使ったことがなく、パッケージをDebian本体にプッシュしようとする場合にのみ使用することを検討します。

Debian向けのGoプログラムのパッケージ化に関する一般的な質問については、次のリソースが役立つかもしれません。

  • このスレッド Go for Debianパッケージャーの1人がgo-nutsで始めました。
  • 特に、そのスレッドの最初の投稿はdebian-develの この議論 にリンクしています。
  • 2番目のスレッド 同じ問題に関してdebian-develで(これは前のスレッドの論理的な続きです)。

2015-10-15の更新

(この投稿はまだ検索および発見され、研究されているようですので、現状をよりよく反映するように更新することにしました。)

それ以来、Goアプリとパッケージのパッケージ化の状況は劇的に改善され、gcc-goではなく「クラシック」Go(Googleに由来するいわゆるgcスイート)を使用してDebianパッケージを構築することが可能になりました。 。また、パッケージには優れたインフラストラクチャも存在します。

Goプログラムをdebian化するときに使用する主要なツールはdh-golangです ここ で説明されています。

22
kostix

私はこれを自分で調べたところ、基本的にそこにいます。

あらすじ

Canonicalの既存のGoプロジェクトの1つから「package」ブランチから「借用」することにより、dpkg-buildpackageを使用してパッケージをビルドできます。

  1. 依存関係をインストールし、別のリポジトリから「パッケージ」ブランチを取得します。

    _ # 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
    _
  2. メタデータを編集します。

    • debian/controlファイル(名前、バージョン、ソース)を編集します。 golang-stableの依存関係をgolang-goに変更する必要がある場合があります。
    • debian/control ファイルがマニフェストです。 「ビルドの依存関係」(Build-Depends: debhelper (>= 7.0.50~), golang-stable)と3つのアーキテクチャに注意してください。 Ubuntu(gophers ppaなし)を使用して、golang-stableをgolang-goに変更する必要がありました。
    • debian/rulesファイルを編集します(cobzrの代わりにパッケージ名を入力してください)。
    • debian/rules ファイルは基本的に「make」ファイルであり、パッケージのビルド方法を示します。この場合、彼らはdebhelperに大きく依存しています。ここでGOPATHを設定し、「go install」を呼び出します。これが魔法の「go install」行です。

    cd $(GOPATH)/src && find * -name '*.go' -exec dirname {} \; | xargs -n1 go install

    • 著作権ファイル、readme、ライセンスなども更新します。
  3. ソースをsrcフォルダーに入れます。例えば.

    _ git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
    _

    または例2

    _ cp .../yourpackage/ src/
    _
  4. パッケージをビルドする

    _ # -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サポートをユーティリティに追加したいと思っていますが、最初にこのタスクを具体化する必要があります。

幸運を。進捗があった場合は、私の回答を更新するか、コメントを追加してください。ありがとう

16
laher

Goアプリケーションからのdebまたはrpmパッケージのビルドも、fpmを使用すると非常に簡単です。

Rubygemsから取得します。

gem install fpm

バイナリをビルドした後、 foob​​ar、次のようにパッケージ化できます:

fpm -s dir -t deb -n foobar -v 0.0.1 foobar=/usr/bin/

fpmは、あらゆる種類の高度なパッケージオプションをサポートしています。

5
tex

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:行で依存関係を指定します(依存関係のパッケージ化については上記を参照)。

2
alexei