いろいろ備忘録日記

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

Goメモ-33 (Go Modules がオンの状態でライブラリ変更してPUSHする前に使われている箇所の当たりをテストしたい)

概要

タイトルがクソ長いですが、忘れないうちにメモメモ。

go mod をオンにしている状態(Go1.13だとデフォルトがオン)で

他で使われているライブラリを変更したとします。その変更によって

このライブラリを使っている別のモジュールに当たりがあるかどうかをPUSHする前に確かめたいというお話です。

Go Modulesが出る前までは、この作業に別に何の問題もありませんでした。全部GOPATHの下にあるので。

Go Modulesをオンにしている状態だと、ライブラリに依存している方で、試そうと思うと一旦ライブラリ自体をコミットしてPUSHして

その後、使っている側で go get -u しないといけないんですよね。自分で作っているライブラリの場合、若干面倒くさい。

ちょっと、情報探してみると、やり方あるみたいなので、ここに自分用のメモです。

サンプル

んで、以下のクソみたいなライブラリがあるとします。このライブラリの名前は「m1」とします。

package m1

func Hello() string {
    return "hello"
}

このライブラリの go.mod は以下のような感じです。

module github.com/devlights/m1

go 1.13

で、上のライブラリを使っている 「m2」というライブラリがいるとします。

そのライブラリは、以下のようなクソコードになってるとします。

package m2

import (
    "fmt"

    "github.com/devlights/m1"
)

func World() string {
    return fmt.Sprintf("%s world", m1.Hello())
}

このライブラリの go.mod は以下のような感じです。

module github.com/devlights/m2

go 1.13

require github.com/devlights/m1 v0.0.0-20191218081345-b794eb66e83d

ライブラリ「m2」のテストコードは以下。

package m2

import "testing"

func TestM2(t *testing.T) {
    expected := "hello world"
    got := World()
    if expected != got {
        t.Errorf("expected: %v\tgot %v\n", expected, got)
    }
}

m1の方のコードに変更が入った

m1のコードの方に変更が入ったとします。

package m1

func Hello() string {
    return "Hello"
}

先頭が大文字になっただけですがw

この状態で m1 をPUSHしないまま、 m2を go test しても当然 Success となります。依存してるライブラリ m1 は、まだPUSHしていないので変わらないから。

m1 側をコミットしてPUSHしてから、m2 を テストすると当然 Fail となります。自分で作っているものなので、面倒だからコミットする前に当たりをテストしたい。

go.mod に replace 設定を追加する

こんなときは、以下のようにするといいみたいです。

m2 側の go.mod に replace 設定を入れます。

$ go mod edit -replace github.com/devlights/m1=/path/to/m1

今回の場合、ディレクトリを兄弟みたいな位置においているので

go mod edit -replace github.com/devlights/m1=../m1

としました。すると、 m2 の go.mod が以下のようになります。

module github.com/devlights/m2

go 1.13

require github.com/devlights/m1 v0.0.0-20191218081345-b794eb66e83d

replace github.com/devlights/m1 => ../m1

これで、m2 の下で go test とすると、まだ m1 をPUSHしていない状態で、 テストが Fail してくれます。

go.mod の replace 設定を削除する

上で設定した replace 設定を削除するには、以下のようにします。

$ go mod edit -dropreplace pkg-name

今回だと

$ go mod edit -dropreplace github.com/devlights/m1

ってします。そうすると、go.mod が

module github.com/devlights/m2

go 1.13

require github.com/devlights/m1 v0.0.0-20191218081345-b794eb66e83d

って感じで元に戻ります。

今回のサンプルで作った m1とm2っていうクソコードたち。githubにアップしてあります。

ご自身でリポジトリ作って試してみるの面倒だったら、よかったらお使いください。

github.com

github.com

参考情報

medium.com


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

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

devlights.github.io

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

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

github.com

github.com

github.com