12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Golang - ディレクトリ構成と独自パッケージのimportについて

Last updated at Posted at 2019-09-27

追記:GoModules(バージョン管理)を使用した場合の方法を整理しましたのでGoのバージョンが1.11以上の方はそちらを参照してください
Golang - Go Modulesで開発環境の用意する

はじめに

環境作成の際に、深く考えず環境変数 $GOPATH~/go を設定していましたが、作業していると自身で定義したパッケージの参照でエラーが発生し、保存時にフォーマットかけるようにしてるためimportが消えたりと思ったような動作をしなかったため構成を見直すことにしました。

GOPATH

パッケージをimportするときの解決先や、go getgo installをしたときのパッケージやバイナリのインストール先がGOPATHで指定したディレクトリになります。GOPATH配下は以下の三つのディレクトリで構成されます。

ちなみにGOPATHが未指定の場合は$HOME/goになります。

./GOPATH
├── ./bin    // 実行ファイルが格納されるディレクトリ(go installコマンドで自動生成されます)
├── ./pkg    // ビルドしたパッケージオブジェクトが格納されるディレクトリ(go buildをはじめとする各種コマンドで自動生成されます)
└── ./src    // パッケージごとのソースコードを配置するディレクトリ

ディレクトリ構成

src配下にプロジェクトのディレクトリを配置することろまでは間違いなさそうですが、どうやらsrc/github.com/username/projectで作成するのが良さそうです。
ずっと悩んでいたのですが以下の記事のおかげで解決できました!!

独自パッケージのインポート

githubに公開されている外部パッケージを取得する際にgo get github.com/XXXXXXコマンドで取得できますが
そうするとディレクトリの構成が上記のsrc/github.com/username/repositoryになるようですね!

ということでできた構成が以下の通りです
プロジェクトのディレクトリ配下は Standard Go Project Layout を参考にしました。

└── GolangProjects                          // GOPATHに設定
     ├── bin
     ├── pkg
     └── src
         └── github.com
             └── github-username            // githubのユーザー
                 └── project-sample         // プロジェクトごとのディレクトリ
                     ├── Makefile
                     ├── api
                     ├── assets
                     ├── build
                     ├── cmd
                     ├── configs
                     ├── deployments
                     ├── docs
                     ├── examples
                     ├── githooks
                     ├── init
                     ├── internal
                     ├── pkg
                     ├── scripts
                     ├── test
                     ├── third_party
                     ├── tools
                     ├── vendor
                     ├── web
                     └── website

import

上記の構成にした場合、独自パッケージのimportは以下の通りです

import "github.com/github-username/project-sample/パッケージ名"

いくつか参考にgithubで公開されているフレームワークを見てみましたが上記の通りになっていました

Docker環境の場合

私は以下の環境で開発を行おうかと思っているのですが、そこでもう一点ハマりました。

Golang - DockerとVSCodeで開発環境を用意する

上記構成のproject-sampleで
Remote-Containers: Add Development Container Configuration Files
してしまうと以下の理由から独自パッケージのimportでエラーが発生しました

  • 仮想環境上のワークスペースがproject-sample以下になってしまう
    (github.com/user-name/が参照できない)

リポジトリに反映してgo getすれば、GOPATHにパッケージがインストールされるのでエラーは解消しますが、それはかなりめんどくさそうと思ったので以下の通りに対応することでとりあえずエラーは回避できました

  • GolangProjectsディレクトリで
    Remote-Containers: Add Development Container Configuration Files

  • Docker上のGOPATHにローカルのGOPATHをマウント(workspaceFolderも合わせて変更しています)

devcontainer.json
	"workspaceFolder": "/go",
	"workspaceMount": "src=ローカルの$GOPATH,dst=/go,type=bind",

今回かなり手探りで調査したので誤っている点や、もっとこういう構成の方がいいよー!って構成があればぜひ教えていただきたいです!!

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?