背景
下記の意図があり、1レポジトリでマルチバイナリの構成にするためのディレクトリ構造を考えていた。
-
go get
で全てのバイナリがインストール出来ること - 共通で利用するコードが結構あるので、これをトップディレクトリに置いておきたい
- 開発時は、docker-composeで全部立ち上げたい
ディレクトリ構成
先にディレクトリ構成を晒す。
省略しているものがあるけど、実際のものと大体同じ。
├── Gopkg.lock
├── Gopkg.toml
├── Makefile
├── entity
├── contrib
│ ├── admin-server
│ │ ├── Dockerfile
│ │ ├── main.go
│ └── api-server
│ ├── Dockerfile
│ ├── main.go
├── docker-compose.yml
├── middleware
├── repository
├── service
└── vendor
こんな感じでcontrib
配下にディレクトリを掘って、管理画面とAPIサーバをそれぞれ内包しています。
開発時のdocker-compose
開発時は管理画面とAPIサーバ、あとMongoDBと管理用のmongo-expressも立ち上げるようにしている。
docker-compose.yml
version: '3'
services:
api:
build:
context: .
dockerfile: contrib/api-server/Dockerfile
volumes:
- .:/go/src/app
ports:
- 18080:18080
links:
- mongo
environment:
API_SERVER_STORE_URL: mongodb://mongo/example
admin:
build:
context: .
dockerfile: contrib/admin-server/Dockerfile
volumes:
- .:/go/src/app
ports:
- 19080:19080
links:
- mongo
environment:
ADMIN_SERVER_STORE_URL: mongodb://mongo/example
mongo:
image: mongo:3.4
volumes:
- store-data:/data/db
ports:
- 27017:27017
mongo-admin:
image: mongo-express:0.38
ports:
- 18081:8081
links:
- mongo
environment:
ME_CONFIG_MONGODB_ENABLE_ADMIN: "false"
volumes:
store-data:
driver: local
今のところこんなディレクトリ構成、docker-composeで開発は問題ない。
公開用Dockerイメージのビルドは、
$ docker build -f contrib/api-server/Dockerfile -t hoge:fuga .
$ docker build -f contrib/admin-server/Dockerfile -t hoge:fuga .
上記のようなコマンドを実行するタスクをMakefileに定義している。
go getで全てのバイナリをインストールするには
本記事でのレポジトリを仮に、
github.com/neko-neko/mutiple-binary
だとすると
$ go get -v -u github.com/neko-neko/mutiple-binary/contrib...
上記コマンド実行後、$GOPATH/bin/配下に
- api-server
- admin-server
が格納される。
最後に
APIサーバ / 管理画面 / 共通コード(この例だとentity
とかrepository
とかmiddleware
とかのセット)ごとにレポジトリを分ければ良いじゃんって思うけど、1人で全部メンテするのは面倒くさかったのよね。