golang-基準/プロジェクト-レイアウト

翻訳:

  • 한국어 문서
  • 简体中文
  • 正體中文
  • 简体中文-???
  • フランス語
  • 日本語
  • ポルトガル語
  • Español

概要

これはGoアプリケーションプロジェクトの基本的なレイアウトです。 これはGoのコア開発チームによって定義された公式の標準ではありませんが、Goエコシステムの共通の歴史的および新興のプロジェクトレイアウトパターンのセットです。 これらのパターンのいくつかは他のものよりも人気があります。 また、十分な大きさの現実世界のアプリケーションに共通のいくつかのサポートディレクトリと一緒に小さな機能強化の数を持っています。

Goを学ぼうとしている場合、またはPoCやおもちゃのプロジェクトを自分で構築している場合、このプロジェクトレイアウトはやり過ぎです。 本当に単純なものから始めてください(単一のmain.govendorパターンは普遍的ではありません。

Go1.14Go ModulesGo Modulesを使用し、使用する場合は、project GOPATHとプロジェクトの配置場所を心配する必 リポジトリの基本的なgo.modファイルは、プロジェクトがGitHubでホストされていることを前提としていますが、要件ではありません。 モジュールパスは何でもかまいませんが、最初のモジュールパスコンポーネントには名前にドットが付いている必要があります(現在のバージョンのGoはそれを強制しませんが、少し古いバージョンを使用している場合は、ビルドがそれなしで失敗しても驚かないでください)。 詳細については、Issues3755432819を参照してください。

このプロジェクトレイアウトは意図的に汎用的であり、特定のGoパッケージ構造を強制しようとしません。これはコミュニティの努力です。

新しいパターンが表示された場合、または既存のパターンのいずれかを更新する必要があると思われる場合は、問題を開きます。名前付け、書式設定、スタイルのヘルプが必要な場合は、gofmtgolintを実行して開始します。 また、Goコードスタイルのガイドラインと推奨事項を必ずお読みください:

  • https://talks.golang.org/2014/names.slide
  • https://golang.org/doc/effective_go.html#names
  • https://blog.golang.org/package-names
  • https://github.com/golang/go/wiki/CodeReviewComments
  • Goパッケージのスタイルガイシrakyll/jbd)

追加の背景情報については、Go Project Layoutを参照してください。

パッケージの命名と整理、およびその他のコード構造の推奨事項についての詳細:

  • GopherCon EU2018:Peter Bourgon-Industrial Programmingのベストプラクティス
  • GopherCon Russia2018:Ashley McNamara+Brian Ketelsen-go best practices.
  • GopherCon2017: Edward Muller-Go Anti-Patterns
  • Gophercon2018:Kat Zien-Goアプリをどのように構造化しますか

パッケージ指向設計ガイドラインとアーキテクチャ層に関する中国のポスト

  • 面向各アプリケーションのディレクトリ名は、必要な実行可能ファイルの名前と一致する必要があります(例:/cmd/myapp)。

    アプリケーションディレクトリに多くのコードを入れないでください。 コードをインポートして他のプロジェクトで使用できると思われる場合は、/pkg/internalディレクトリに配置します。 あなたは他の人が何をするのか驚かれることでしょうので、あなたの意図について明示的にしてください!p>

    小さなmain/internal/pkgディレクトリとそれ以外は何もありません。

    例については、/cmdディレクトリを参照してください。

    /internal

    プライベートアプリケーションとライブラリコード。 これは、他の人がアプリケーションやライブラリにインポートしたくないコードです。 このレイアウトパターンはGoコンパイラ自体によって強制されることに注意してください。 詳細については、Go1.4release notesinternalinternal/internal/app/internal/app/myapp/internal/pkgディレ

    /pkg

    外部アプリケーションで使用しても問題ないライブラリコード(例:,/pkg/mypubliclibinternalディ/pkgディレクトリは、そのディレクトリ内のコードが他の人が使用するのに安全であることを明示的に伝えるための良い方法です。 Travis JefferyによるI'll take pkg over internalpkginternalディレクトリの概要と、それらを使用することが理にかなってい

    ルートディレクトリにGo以外のコンポーネントやディレクトリがたくさん含まれている場合、Goコードを一箇所にグループ化する方法でもあり、さまざまなGoツールを実行しやすくなります(これらの講演で述べたように:Best Practices for Industrial ProgrammingFrom GopherCon EU2018,GopherCon2018:Kat Zien-GoアプリとGoLab2018をどのように構造化しますか-Massimiliano Pippi-Goのプロジェクトレイアウトパターン)。

    このプロジェクトレイアウトパターンを使用する人気のあるGo repoを確認したい場合は、/pkgディレクトリを参照してください。 これは一般的なレイアウトパターンですが、普遍的に受け入れられておらず、Goコミュニティの一部はそれをお勧めしません。あなたのアプリプロジェクトが本当に小さく、余分なレベルのネストがあまり価値を追加しない場合(本当に:-)したい場合を除き)、それを使用しな それが十分に大きくなり、ルートディレクトリがかなり忙しくなったときに考えてください(特に、Go以外のアプリコンポーネントがたくさんある場合)。

    /vendor

    アプリケーションの依存関係(手動で管理するか、新しい組み込みのGo Modulesgo mod vendor/vendorディレクトリを作成します。 デフォルトでオンになっているGo1.14を使用していない場合は、-mod=vendorgo buildコマンドに追加する

    ライブラリを構築する場合は、アプリケーションの依存関係をコミットしないでください。

    1.13Goはモジュールプロキシ機能も有効にしていることに注意してください(デフォルトではhttps://proxy.golang.orgherevendorディレクトリはまったく必要ありません。

    サービスアプリケーションディレクトリ

    /api

    OpenAPI/Swagger仕様、JSONスキーマファイル、プロトコル定義ファイル。

    例については/apiディレクトリを参照してください。

    Webアプリケーションディレクトリ

    /web

    Webアプリケーション固有のコンポーネント:静的webアセット、サーバー側テンプレート、およびSpa。

    共通アプリケーションディレクトリ

    /configs

    設定ファイルテンプレートまたはデフォルトのconfigs。p>

    あなたのconfdconsul-templateテンプレートファイルをここに置きます。システム初期化(systemd、upstart、sysv)およびプロセスマネージャ/スーパーバイザ(runit、supervisord)の設定。

    /scripts

    さまざまなビルド、インストール、分析などの操作を実行するスクリプト。

    これらのスクリプトは、ルートレベルのMakefileを小さくシンプルに保ちます(例:https://github.com/hashicorp/terraform/blob/master/Makefile)。

    例については、/scriptsディレクトリを参照してください。

    /build

    パッケージ化と継続的な統合。クラウド(AMI)、コンテナ(Docker)、OS(deb、rpm、pkg)のパッケージ構成とスクリプトを/build/packageディレクトリに配置します。CI(travis、circle、drone)の設定とスクリプトを/build/ciディレクトリに配置します。 いくつかのCIツール(例えば、Travis CI)は、設定ファイルの場所について非常にうるさいです。 設定ファイルを/build/ciディレクトリに配置して、CIツールが期待する場所にリンクしてみてください(可能な場合)。IaaS、PaaS、システムおよびコンテナオーケストレーションデプロイの構成とテンプレート(docker-compose、kubernetes/helm、mesos、terraform、bosh)。 一部のリポジトリ(特にkubernetesでデプロイされたアプリ)では、このディレクトリは/deployと呼ばれていることに注意してくださ

    /test

    追加の外部テストアプリとテストデータ。 とにかくあなたが望む/test/test/data/test/testdataを持つことができます。 Goは”で始まるディレクトリやファイルも無視することに注意してください。”または”_”なので、テストデータディレクトリに名前を付ける方法の面でより柔軟性があります。

    例については、/testディレクトリを参照してください。

    その他のディレクトリ

    /docs

    godocで生成されたドキュメントに加えて、デザインおよびユーザードキュメント。

    例については、/docsディレクトリを参照してください。

    /tools

    このプロジェクトのためのサポートツール。 これらのツールは、/pkg/internalディレクトリからコードをインポートできることに注意してください。

    例については、/toolsディレクトリを参照してください。

    /examples

    アプリケーションおよび/またはパブリックライブラリの例。

    例については、/examplesディレクトリを参照してください。

    /third_party

    外部ヘルパーツール、フォークされたコード、およびその他のサードパーティのユーティリティ(Swagger UIなど)。

    /githooks

    Gitフック。

    /assets

    リポジトリと一緒に移動する他のアセット(画像、ロゴなど)。GitHub pagesを使用していない場合、これはプロジェクトのwebサイトデータを配置する場所です。

    例については、/websiteディレクトリを参照してください。いくつかのGoプロジェクトにはsrcフォルダがありますが、通常は開発者がJavaの世界から来たときに発生します。 あなた自身がこのJavaパターンを採用しないようにするのを助けることができるならば。 GoコードやGoプロジェクトをJavaのように見せたくありません:-)

    プロジェクトレベルを混同しないでください/src/srcディレクトリGoはHow to Write Go Code$GOPATH環境変数は、(現在の)ワークスペースを指しています(デフォルトでは、windows以外のシステムでは$HOME/go/pkg/bin/src/src/srcディレクトリがある場合、プロ Go1であることに注意してください。11プロジェクトをGOPATHの外に置くことは可能ですが、このレイアウトパターンを使用することは良い考えではありません。Goレポートカード-コードをスキャンしますgofmtgo vetgocyclogolintgofmtgo vetgocyclogolintgolintgolintgolintmisspellgithub.com/golang-standards/project-layoutをプロジェクト参照に置き換えます。

    Go Report Card

  • GoDoc-GoDocで生成されたドキュメントのオンライン版を提供します。 プロジェクトを指すようにリンクを変更します。/p>

    Go Doc

  • Pkg.行けdev-Pkg.行けdevはGo discoveryの新しい宛先です&docs。 バッジ生成ツールを使用してバッジを作成できます。P>

    PkgGoDev

  • リリース-それはあなたのプロジェクトの最新のリリース番号が表示されます。 プロジェクトを指すようにgithubリンクを変更します。

    リリース

ノート

サンプル/再利用可能な設定、スクリプト、コードを持つより独断的なプロジェクトテンプレートはWIPです。

コメントを残す

メールアドレスが公開されることはありません。