goのパッケージ構成で 試行錯誤してみた話 ~ gocon 2015 summer

30
Goのパッケージ構成で 試行錯誤してみた話 Go conference 2015 Summer

Upload: hirokazu-fukami

Post on 04-Aug-2015

3.056 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

Goのパッケージ構成で試行錯誤してみた話

Go conference 2015 Summer

Page 2: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

自己紹介

@fkm / 深見

モケラボ株式会社

代表取締役(最近作った)Androidアプリを受託で作ったり

Goでサーバーサイド書いたり

Gocon 2015 SpringでGoにハマる

Page 3: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

作ったもの

OpenInvoiceのバックエンド部分

Page 4: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

パッケージ

● フォルダ=パッケージ● フォルダ名がパッケージ名● import時に別名をつけることができる

○ 名前がぶつかってもあんまり困らない○ とはいえ面倒

Page 5: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

なんでパッケージ

分けるんだっけ?

Page 6: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

公開ライブラリ

githubなどで公開されているものをそのまま指定できる

例)import ( "github.com/gorilla/mux")

Page 7: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

package private

● 同じパッケージ内のみアクセスできる● Goでは小文字ではじまる名前がこれ● 外部には見せたくないけど共通の処理

● 往々にしてこういう関数ほどテストを書きたくなる

Page 8: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

Goで何つくる?

● ライブラリ● ツール● Webサーバー

Page 9: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

githubで公開するとき

● リポジトリ名がパッケージ名になる○ "github.com/gorilla/mux"

● ライブラリが複数パッケージで構成される場合は?○ なるべく分けずに1つに詰め込む?○ 依存するパッケージも1つずつリポジトリ作る?

Page 10: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

こんな時は

読め!

Page 11: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

github.com/gorilla/mux/mux.go

Page 12: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

1つずつ

リポジトリ

作るの。。。?

Page 13: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

Dockerでは?

docker/api/server/server_linux.go

Page 14: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

github.com/docker/docker/daemon

Page 15: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

ライブラリを作る時

複数のパッケージを

1つのリポジトリにいれても

大丈夫

Page 16: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

GoでWebサーバー

REST層

Service層

Model層

Page 17: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

よく言われること

実装と

インターフェースは

分けよう

Page 18: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

こうやってみた

Page 19: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

MySQLで動くようにしてよー

SQLiteで動くようにしてよー

Page 20: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

どこに追加するんだ。。。?

Page 21: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

これはどうだ?

Page 22: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

ん?

Page 23: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

Javaってこうやってたような?

Page 24: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

試行錯誤のまとめ

● ライブラリは、1リポジトリに複数パッケージいれても大丈夫○ ライブラリ内での参照も可能

● アプリでのパッケージ分けは、他の言語と同様、基本に忠実に。

Page 25: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

もうちょっとだけ

パッケージの話

Page 26: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

internal

● Go 1.4で追加● service/impl/internal ● importできるのはツリー上にいるパッケージの

み● github上のパッケージでは、使えない。。

Page 27: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

パッケージ名判定

http://www.pkgname.com/

● パッケージ名がGoらしいかどうかを判定してくれるツール○ go-libのような-をつけるのはダメぽん などを指摘○ githubで公開する前に確認しよう

Page 28: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Page 29: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

な、なくなってる。。。。

Page 30: Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer

パッケージ名判定

かろうじてソースはあった

https://github.com/aybabtme/pkgname

近日中に弊社サイトで動くようにしてみます