40

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

既存の質問をすべて調べました。ただし、私の調査ではすべて、golang 開発環境を含む .deb ファイルに関する質問/回答が見つかりました (つまり、これを実行すると何が得られるかsudo apt-get install golang-go)。

4

5 に答える 5

24

良い。の唯一の「トラウマ」は、パッケージをビルドした後debuildに実行されることと、パッケージの問題を見つけようとすることだと思います。lintianlintian

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

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

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

Go プログラムを Debian 用にパッケージ化する際の一般的な質問については、次のリソースが役立つ場合があります。


2015 年 10 月 15 日の更新

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

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

Go プログラムを debianizing するときに使用する主要なツールについては、こちらdh-golangで説明しています。

于 2013-02-27T07:50:34.620 に答える
16

私はこれを自分で調べてきましたが、基本的にはそこにいます。

あらすじ

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
    

    またはeg2

     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/controldebian/rulesです。「ソースの参照」にリンクしています。

ついに

私がカバーしていないのは、パッケージをクロスコンパイルすることです (3 の他の 2 つのアーキテクチャ、386/arm/amd64 に)。go ではクロスコンパイルはそれほど難しくありません (ターゲット プラットフォームごとにツールチェーンをビルドし、「go build」中にいくつかの ENV 変数を設定する必要があります)。最終的にはユーティリティに .deb サポートを追加したいと考えていますが、最初にこのタスクを具体化する必要があります。

幸運を。何か進展があれば、私の回答を更新するか、コメントを追加してください。ありがとう

于 2013-02-28T10:19:02.213 に答える
6

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

rubygems から取得します。

gem install fpm

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

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

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

于 2015-02-09T09:03:13.697 に答える
3

Go のパッケージ化手順を説明する公式の Debian ポリシー ドキュメントがあります: https://go-team.pages.debian.net/packaging.html

ライブラリの場合: dh-make-golangを使用してパッケージのスケルトンを作成します。-devgolang-github-lib-pq-dev のように、サフィックスを付けて、インポート パスから派生した名前でパッケージに名前を付けます。依存関係Depends:を行に指定します。(Go はすべてのソースを静的にリンクするため、これらはビルド用のソース依存関係であり、実行用のバイナリ依存関係ではありません。)

ライブラリ パッケージをインストールすると、そのソース コードが にインストール/usr/share/golang/srcされます (おそらく、コンパイルされたライブラリは に入る可能性があります.../pkg)。Go パッケージに依存するビルドでは、これらのシステム全体の場所からアーティファクトが使用されます。

実行可能ファイルの場合: dh-golangを使用してパッケージを作成します。依存関係をインラインで指定しBuild-Depends:ます (依存関係のパッケージ化については上記を参照してください)。

于 2016-05-12T23:12:02.303 に答える
-2

私は最近https://packager.io/を発見しました- 私は彼らがしていることにとても満足しています。パッケージの 1 つを開いて、何をしているのかを確認してみてはいかがでしょうか。

于 2015-09-09T15:42:33.690 に答える