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

Post on 04-Aug-2015

3.056 views 0 download

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

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

Go conference 2015 Summer

自己紹介

@fkm / 深見

モケラボ株式会社

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

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

Gocon 2015 SpringでGoにハマる

作ったもの

OpenInvoiceのバックエンド部分

パッケージ

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

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

なんでパッケージ

分けるんだっけ?

公開ライブラリ

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

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

package private

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

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

Goで何つくる?

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

githubで公開するとき

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

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

こんな時は

読め!

github.com/gorilla/mux/mux.go

1つずつ

リポジトリ

作るの。。。?

Dockerでは?

docker/api/server/server_linux.go

github.com/docker/docker/daemon

ライブラリを作る時

複数のパッケージを

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

大丈夫

GoでWebサーバー

REST層

Service層

Model層

よく言われること

実装と

インターフェースは

分けよう

こうやってみた

MySQLで動くようにしてよー

SQLiteで動くようにしてよー

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

これはどうだ?

ん?

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

試行錯誤のまとめ

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

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

もうちょっとだけ

パッケージの話

internal

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

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

パッケージ名判定

http://www.pkgname.com/

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

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

パッケージ名判定

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

https://github.com/aybabtme/pkgname

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