sci

最果て風呂

Go でパッケージ作成

この記事に関連するお話です。

パッケージの雛形作成

go init のようなコマンドはなく、リポジトリの場所だけに気をつけておけば良いらしい。ディレクトリの構成は標準的な指針はないみたい。通常は $GOPATH/src/github.com/user_name/gomto/ に置くらしい。import "github..." という行があると、ここを見にくるそうなのです。

ローカルからのインストールはそのリポジトリ内で go install github.com/user_name/gomto とすれば良く、リモートから得てビルドするには go get github.com/user_name/gomto とするだけです。

プロジェクトの実装

main.go という名で作成するだけという簡単さ。mto.go をそのまま main.go という名前にして置くだけで go build ができました。

ファイルの分割

引数処理をする部分を main.go、辞書を作成する部分を dict.go、ファイルから受け取った文字列を置換する部分を subfile.go、標準入力から受け取った文字列を置換する部分をsubstdin.go という名前にして分割してみました。また、テストはそれぞれ dict_test.go, subfile_test.go という名前で作成しました。どれも package は main です。

go build, go test は問題なくできてしまい、かなりあっけなかったです。

テストをしやすいように内部辞書を返すように関数を変更してみました。この時、例えば次のように関数が返す型を明記してやらなければなりません。気をつけるのはそれくらい。

func dictCreator(jisyo string) {
func dictCreator(jisyo string) (dicarr [][]string) {

外部プログラムからのパッケージの利用

辞書を作成する部分をライブラリっぽく他のプログラムから使えるようにしてみました。ディレクトリの名前がパッケージの名前と関係しているようで、ディレクトリの名前と package の名前を同じにしました。具体的には、mto というディレクトリを作成し、下記のようにファイルを移動しました。

renamed: dict.go -> mto/dict.go
renamed: dict_test.go -> mto/dict_test.go
renamed: subfile.go -> mto/subfile.go
renamed: subfile_test.go -> mto/subfile_test.go
renamed: substdin.go -> mto/substdin.go
renamed: test/sample-jisyo -> mto/test/sample-jisyo
renamed: test/sample-text-car -> mto/test/sample-text-car
renamed: test/sample-text-cdr -> mto/test/sample-text-cdr

test ディレクトリはテストの際に _test.go から参照するパスが変わると面倒なので一緒に移動しました。

dict.go, dict_test.go, subfile.go, subfile_test.go, substdin.go はそれぞれ package mainpackage mto に変更。

関数名は dictCreator から DictCreator、stringCarReplacer から StringCarReplacer、stringCdrReplacer から StringCdrReplacer へと大文字に変更しました。こうしないと mto パッケージ以外から参照することができないらしいです。スコープの関係?

参照する側は import をしてから mto.DictCreator のように頭にパッケージ名 mto を付けて呼び出せば使えるようになりました。テストについては _test.go ファイルのある場所に移動して go test を実行しないとエラーになってしまうけれど、OK になりました。

試しに次のようなファイルを作成して go run hoge.go とすると、外部ファイルを読み込んで動作するようになりました。

package main

import (
  "fmt"
  "github.com/user_name/gomto/mto"
)

func main() {
  var indict = mto.DictCreator("絶対パス/辞書")
  var text = mto.StringCarReplacer(indict, "絶対パス/変換したいファイル")
       fmt.Println(text)
}

テストの作成

テストでの決まりはファイルの名前を _test.go とすること。同じディレクトリに置いておけば go test とするだけでテストしてくれます。go test ./... とすると、カレントディレクトリ以下にあるテストをサブディレクトリを掘って探し、実行してくれようです。

GitHub からのインストール

go get github.com/user_name/gomto とするだけ。実に簡単。