GOPATHの外部のGoプロジェクトのソースコードを持っているのは悪い考えです


32

私はGoを使用して新しいプロジェクトに取り組んでおり、私たちは全員Goに新しいです。標準のgoディレクトリ構造に従い、すべてのコードを

$ GOPATH / src / github.com / companyname / projectname

gitリポジトリのルートでもあります

標準の推奨パスレイアウトは、特にGoベースのrest / httpバックエンドやhtml / javascriptフロントエンドなどの多言語プロジェクトで作業している場合、少し奇妙に見えます。その場合、プロジェクト構造を次のようにしたいと思うでしょう。

/
  doc/
  src/
    server/
      main.go
      module1/
        module.go
    client/
      index.html
  Makefile

しかし、実際にはGOPATH内にコードを配置する必要がありますか?

試みとして、ソースコードがGOPATHの外にある小さなプログラムを作成しました。プロジェクトをパッケージに簡単に分割できるので、mainパッケージはを使用fooしてfoo/フォルダー内のパッケージを参照できますimport "./foo"

私が見る限り、これが私を許さない2つのことがあります:

  • 他のコードはこのコードをインポートできません。これは、企業向けのサービスを構築しているため、問題ではありません。
  • go installインストールに使用できません。これも問題ではありません。ビルドパイプラインはツールをインストールします。

ただし、ビルドサーバーはワークスペースをGOPATH内に配置できません。

そのようなアプローチは推奨されませんか?もしそうなら、なぜそうですか?

リストした2つ以外のマイナスの副作用はありますか?

これは企業のプライベートプロジェクトであり、公開のオープンソースコードではないことに注意してください。

GOPATHから実際のプロジェクトを切り離すのは魅力的ですが、Shuステージにいるときはルールを破る際には注意が必要です。

回答:


12

GOPATHを使用する必要はありませんが、goコマンドから得られるすてきなツールをすべて逃してしまいます。彼らはすべて、コードが標準のGOPATH階層にあることを期待しています。

あなたが言及go installしましたが、またgo test(そして素敵なgo test -coverカバレッジツール)は動作しません。go getリモートコードをダウンロードしてGOPATHにすべてを書き込むことができるので、コピーする必要があります。

もちろん、すべてをmake / scons / cmake / whateverに置き換えて、物事を成し遂げることができgoます。それはおそらくあなたの環境では機能しますが、その余分な作業はツールで実行できます。


9

(免責事項:私はこのようなものを設計するのが好きですが、私はGoが初めてなので、実際には試していません)

アイデア:なぜ両方ではないのですか?

シンボリックリンクを考慮する場合、2つの極オプションが利用できます。

(A)ワークスペースにシンボリックリンクされたsrcのコード

/
  doc/
  src/
    server/
      projectname/
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname -> ../../../src/server/projectname
      github.com/
        someone/
          library/
    bin/
    pkg/
  Makefile

(B)ワークスペース内のコード、srcにシンボリックリンク

/
  doc/
  src/
    server/
      projectname -> ../../go_workspace/src/companyname/projectname
    client/
      index.html
  go_workspace/
    src/
      companyname/
        projectname/
      github.com/
        someone/
          somelib/
    bin/
    pkg/
  Makefile

私は「A」に寄りかかった。なぜなら:

  • すべてのソースが物理的に近くに住んでいる、
  • projectname 独自のリポジトリを簡単に作成できます。または、プロジェクト全体に対して1つのリポジトリを作成できます。
  • 全体のgo_workspaceバージョン管理をせずに、makeステップを使用して初期化できます(godepプロジェクトをシンボリックリンクしてから)

1
「B」で「go install:GOPATHの外にディレクトリ{dir}のインストール場所がありません」と文句を言うので、「A」でなければなりません。
OJフォード

2

2019アップデート

GOPATHもうプロジェクトを保存する必要はありません。

以外のディレクトリに置いてくださいGOPATH。次に入力します:

go mod init github.com/youruser/yourproject

あなたは行ってもいいでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.