at backyard

Color my life with the chaos of trouble.

Goでローカルで作成したモジュールをインポートしたいとき

Goで最近ちょっとしたテストのためのモジュール(ライブラリ、パッケージ?なんて呼べばいいのだろう?)を作成した。

github.com

完全に自分向けのライブラリであり、現在はまだ開発中の段階となっている。
これについては開発の区切りがついたタイミングで、ここかZenn辺りに書こうかなと思っている。

こちらのライブラリ(モジュール)を作成する際に色々とGoのモジュール周りで試行錯誤したので、その際のことを備忘録として書き残しておく。

Goでローカルで作成しているモジュールを別プロジェクトから参照する方法

開発中などでまだライブラリ自体をGitHubに公開していないという場合、別のプロジェクトでこの作成途中のモジュールを読み込むには replace ディレクティブを使うのが便利そうだった。

今回の場合、この replace ディレクティブを用いて、ローカルで開発中のモジュールを別のGoプロジェクトに追加するということを行った

下記は別のGoプロジェクトに対して、開発中のまだ公開されていないモジュール(同じローカル上にあるもの)を読み込むパターンでの記述だ。

module hogehoge

go 1.18

require github.com/username/example v0.0.1

replace github.com/username/example => /fullpath/example

require に書くURLについてだが、ここは実際には存在しないURLでも良いらしい。
つまり example.com/username/example みたいな形で問題ないとのこと。
また v1.18 の環境では example のようなURLではない記述でも特に問題なく動くことを確認しているので、replace 側で設定されている実際に参照しているパスが問題なければ一応はちゃんと動いてくれるようだ。
(当然 require に書くURL(ここでは github.com/username/example )については同じURLを replace 側の左側のパスにも書く必要がある。ここについては上に書いた例のようにしておけばOK)

ちなみにこのように存在しないURLを書いた場合、下記のようなエラーがVSCode上で出たが、特にそのまま実行はできているようだった。これについては原因がよく分かっていない。

error while importing github.com/username/example: expected 'package', found 'EOF'

あと require にはversionを付ける必要があるが、特にversionがない場合、とりあえず適当に v0.0.1 とか付けておけばそれで動作的に問題はなさそうだった。

参考になりそうな公式ドキュメント

今回書いた内容については下記のドキュメントが参考になりそう。

github.com

まだGoの細かな仕組みについて理解が追いついていないので、もし誤りなどありましたらコメントいただけると助かります。