自分が良く書いているPythonでやればちょいちょいでできそうな気がしますが、他の言語やフレームワークもう少し触ってみたい気持ちになったので、ちょっとやってみることにしました。
Ginとは?
Go言語のWebフレームワークで、まあまあ人気があるっぽいです。少し古い記事ですが、使うにあたってこのあたりの比較を見てみることにしました。
上記を見てGo自体もそんなに慣れているわけではないので、日本語ドキュメントがあることと、それなりに採択されているという情報があるGinにすることにしました。
公式ページはこちら。README見た感じでもある程度の機能が実現できそうなので、少し動かしながら試してます。とにかくシンプルで早そうですね。
まだ試せてない機能も多いので、もっと試していきたいですね。
また gin 周りの操作を楽にするための cli もあるようなので、そちらも合わせて使っています(名前が一緒なのすご、こんなの正しく動くのか?!とか思いましたが、出きるっぽい。確かにGoのimport文的に行けそうな気もするしね)
codegangsta/gin: Live reload utility for Go web servers
Dockerで動かす
正直なところ Docker ファイルを自分で書いていくのあまり得意ではないのですが、まあ下みたいなのを書いてみて、やってます。
FROM golang:latest COPY api /go/src/api/ WORKDIR /go/src/api/ RUN go get github.com/gin-gonic/gin \ && go get github.com/codegangsta/gin CMD ["gin", "-p", "37301", "-i", "run"]
docker-compose.yml としては下記。マジで最低限しか書いてない。
version: '3' services: api: build: context: . dockerfile: docker/api/Dockerfile ports: - 37301:37301 tty: true
今は api 配下にすべてのコードを置くような形にしてます。フォルダの構成は下記。
❯ tree . ├── README.md ├── api │ ├── controller │ │ ├── go.mod │ │ ├── go.sum │ │ └── pri.go │ ├── go.mod │ ├── go.sum │ └── main.go ├── docker │ └── api │ └── Dockerfile └── docker-compose.yml
これで docker-compose build
して docker-compose up -d
してるだけです。最初ディレクトリやパッケージのimportの関係でハマりましたが、その結果理解がはかどった気もします。
pri.go は雑に get 、post に対応する処理だけ書いてあります。
Dockerfileやdocker-compose.yml書くのはあまり知見がなかったので、このあたりを参考にしました。今は DB すら使わない最小構成なので、DB周りの設定は全部はがしてしまいましたが…。
- Docker + Go + Gin の開発環境を準備する - Qiita
- DockerComposeでGoのGinとMySqlの環境を作ってみた-第1弾 | w2ソリューション株式会社 TECH Media
- [Golang + Docker]GinをDocker上で試してみる | 会津ラボブログ | 会津ラボブログ
- DockerでGoの開発環境を構築する - Qiita
- Docker+Gin環境を作成する | Rice Doc
あと wsl で試していると、たまーに変なエラーが出たりします。下記を参考にしました
WSL2上のdocker-composeで認証エラー - roy-n-roy メモ
Go Modules ?
依存関係を正確に表すためのものらしく、ビルド時の再現性を担保するための仕組みらしい。 go.mod ファイルはそれを実現するためのものであるという認識を私はしている。
あとは相対的なインポートは推奨されないらしく、ローカルのリポジトリを正確に参照するために、下記のことを行った。慣れていないこともあるが、どうも import 周りでハマりがちな気がする。
Go Modules でインターネット上のレポジトリにはないローカルパッケージを import する方法 - Qiita
これで正しいのかどうかは少し疑問はあるが、いったん解決しているので次に進むことにする。一応、公式にも用意されている。
ほかに気にしてることとして
- ライブラリロード周り見てると Air って単語が良く出てくるが、これが何をしているのかよく知らない
- ちょっと古い記事を参考にして Docker 上で動かしてしまったので、直していきたい
- パッケージ構成をデファクトな感じにしていきたい。このリポジトリが参考になるらしい。
- サンプルとしてこういうのを動かしていきたい
まとめ
一旦長くなってきたので、メモとして残すことは終わりですが、import周りが未だによくわからないですね。うーん…
著名なライブラリとかをもう少し読んでみようかな。