いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-04 (ライブラリの公開と利用, go get, go mod)

概要

Goの文法とか進める前に、先にパッケージの公開の仕方と利用方法についてメモメモ。。

Goは最近の言語なので、ライブラリ(モジュール)の公開の仕方がとても楽です。

外部パッケージの取得は、go get コマンドを使って行うのですが

go get は、githubやbitbucketなどに置かれているリポジトリにデフォルトで対応しています。

なので、自分でライブラリを公開したいと思ったら、githubとかにリポジトリ作って、そこにPUSHしておいたらオッケイということになります。これは楽ですねー。

公開用のライブラリ作る

例として公開用のパッケージ作ってみます。こんなの。

github.com

package helloworld

import (
    "fmt"
    "time"
)

func yyyyMMddHHmmss(t time.Time) string {
    const layout = "2006-01-02 15:04:05"
    return t.Format(layout)
}

// Hello は、挨拶を返します.
//
// 引数 t が指定されている場合、メッセージの後ろに指定された日付を付与します. (yyyy-MM-dd HH:mm:ss)
// t が nil の場合、現在時刻を付与します.
func Hello(t *time.Time) (string, error) {
    now := time.Now()
    if t != nil {
        now = *t
    }

    return fmt.Sprintf("Hello World at %s", yyyyMMddHHmmss(now)), nil
}

何の役にも立ちませんね。こんなクソライブラリw

まあ、サンプルってことで。

プロジェクトの作り方は、前回書いた内容と同じで

以下のように、どこかにディレクトリ作って、その中に入って

go mod 有効にして、ソース書きます。作ったらgithubにアップするのでgitもinit。

$ mkdir helloworldgo
$ cd helloworldgo
$ go mod init github.com/devlights/helloworldgo
$ git init

で、あとはPUSHするだけです。これで終わりです。

モジュールのバージョン管理する場合は、バージョンタグ振ったりするのですが今回は割愛。

Goではセマンティックバージョニング (semver) という規約を適用します。

semver.org

モジュールのバージョンについては、以下に書かれています。

github.com

公開されているライブラリを利用する

次は、上で公開したライブラリを利用する側です。

同じようにして、サンプル用のプロジェクト作ります。

ついでに、これもgithubにあげておきました。

github.com

package main

import (
    "fmt"

    "github.com/devlights/helloworldgo/pkg/helloworld"
)

func main() {
    message, _ := helloworld.Hello(nil)
    fmt.Println(message)
}

先程と同じく、何の役にも立ちませんw

プロジェクト作るやり方は先ほどと同じです。

$ mkdir helloworldclient
$ cd helloworldclient
$ go mod init github.com/devlights/helloworldclient
$ git init

go module を利用している場合、依存ライブラリを先に go get しておく必要はなくて、いきなりソースに

import "hogehoge"

って形で書いてしまっても問題ないです。ビルド時にgoコマンドがダウンロードしてくれます。

VSCodeやGolandとかで作業している場合は、その場でダウンロードしてくれたりしますね。

もちろん、先に

go get -u github.com/devlights/helloworldgo

ってやっておいても問題ありません。

依存ライブラリを追加すると、go.modファイルに依存関係が追加され、go.sumファイルが生成されます。

go.mod

module github.com/devlights/helloworldclient

go 1.13

require github.com/devlights/helloworldgo v0.0.0-20191002081345-b5094b068f3b

バージョンが、v0.0.0なのは、バージョンタグを設定していないからですね。

go.modとgo.sumは手で編集しちゃ駄目

このファイルは手で編集しちゃ駄目です。go mod コマンドで自動で調整されるものです。

Goのランタイムバージョンを編集する場合とかは

devlights.hatenablog.com

のようにして行います。

取得した外部モジュールはどこに置かれるの?

$GOPATH/pkg/mod の下にダウンロードされます。

コマンドの場合は、$GOPATH/bin にダウンロードされますね。

便利なライブラリを探すには?

Awesome XXX シリーズがGoもあります。とりあえずここ見たら大抵見つかります。

awesome-go.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com