Go言語でパッケージを作成して世界に公開する方法

 Go言語では簡単に独自のパッケージを作成する事ができます。とは言え、作業方法が分からなければどうしようもないのですが、中の人が親切にも動画を用意してくれています。英語が分からない人はこのブログを読むといいよ。

 ここでは、文字列をひっくり返すという簡単なサンプルコードを例にパッケージ化作業を進めて行きます。

package main

import (
	"fmt"
)

func reverse(s string) string {
	runes := []int(s)
	n, h := len(runes), len(runes)/2
	for i:= 0; i < h; i++ {
		runes[i], runes[n-1-i] = runes[n-1-i], runes[i]
	}
	return string(runes)
}

func main() {
	s := "My Test String"
	fmt.Println(s)
	fmt.Println(reverse(s))
}

 まずは、そのままビルドして動作することを確認しましょう。

$ 6g main.go
$ 6l main.6
$ ./6.out

以下のように表示されればok!

My Test String
gnirtS tseT yM

 main.goからパッケージ(ライブラリ)化したい部分と呼び出し部分とを分離します。

 今回は1ファイルだけなので、main.goをコピーしてmytools.goを作成してから、不要な部分を削り取ることにします。

$ cp main.go mytools.go

 パッケージ化したいmytools.goの方は、packageの行をmytoolsに変更(mytoolsというパッケージ名にする)して、reverse関数以外の行を削除します。パッケージでは、外部に公開する関数名は大文字から始めるというルールがあるので、reverse関数名をReverseに変更します。

package mytools

func Reverse(s stinrg) string {
	runes := []int(s)
	n, h := len(runes), len(runes)/2
	for i:= 0; i < h; i++ {
		runes[i], runes[n-1-i] = runes[n-1-i], runes[i]
	}
	return string(runes)
}

 呼び出し側のmain.goはreverse関数を削除し、import文に”./mytools”を追加します。

package main

import (
	"fmt"
	"./mytools"
)

func main() {
	s := "My Test String"
	fmt.Println(s)
	fmt.Println(mytools.Reverse(s))
}

 これで動くことを確認しておきます。

$ 6g mytools.go
$ 6g main.go
$ 6l main.6
$ ./6.out

 さっきと同じ表示がされればok!

 パッケージ化するために、新しくディレクトリを作成してそこに今、分離したmytools.goをコピーします。(ビルドしたバイナリmytools.6はゴミなので、一緒にコピーしていますが削除しても良いです)

$ mkdir mytools
$ mv mytools.* mytools
$ cd mytools/

 パッケージのビルド用にMakefileを作成を作成しますが、既存のパッケージのやつをコピーして来て必要な部分を修正した方が簡単です。MakefileがシンプルなioパッケージのMakefileをコピーします。

$ cp $GOROOT/src/pkg/io/Makefile .

 コピーしたMakefileを以下のように修正します。

# Copyright 2009 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

include $(GOROOT)/src/Make.inc

TARG=mytools
GOFILES=\
        mytools.go\

include $(GOROOT)/src/Make.pkg

$ make
$ make install

 個人で利用する場合にはこれで十分ですが、パッケージを作ったからには世界に公開したいですよね。ここからは、開発したパッケージをgithub経由で世界に発信する方法&それをimportする方法を書いて行きたいと思います。

 先ほど、make installを実行したディレクトリで以下のコマンドを実行します。

$ git init .

 READMEファイルを適当に作成して

$ echo “Some text processing tools…” > README

 githubにコミットします。gitやgithubの使い方が分からない人は他の詳しく説明されているサイトで学習してみて下さい。

$ git add README mytools.go Makefile
$ git commit -m “initial revision”
$ git remote add origin git@github.com:dddaisuke/mytools.git
$ git push origin master

 githubへの設置が終わったら、以下のコマンドを実行します。パッケージの利用者はここから作業を始める事になります。このコマンドは指定のリポジトリからソースコード一式をダウンロードして、さらにビルド&$GOROOT/pkg以下への自動配備も行ってくれます。

$ goinstall github.com/dddaisuke/mytools

 githubのパッケージをインストールできたら、main.goのimport文を以下のように修正します。

package main

import (
	"fmt"
	"github.com/dddaisuke/mytools"
)

func main() {
	s := "My Test String"
	fmt.Println(s)
	fmt.Println(mytools.Reverse(s))
}

$ 6g main.go
$ 6l main.6
$ ./6.out

 以下のように表示されれば、あなたのパッケージは全世界に公開された事になります。

My Test String
gnirtS tseT yM
Be Sociable, Share!

コメントを残す

メールアドレスが公開されることはありません。