LoginSignup
28
13

More than 5 years have passed since last update.

Go1.11からのGo Modulesでは相対パスImportは全くできなくなったので注意

Last updated at Posted at 2019-02-10

TL;DR

Go Version 1.11からのGo Modules(vgo)を使うならばimportにて相対パスは使用不可なので絶対パスを指定しよう

簡単な具体例

以下のような構成のGo Modules対応のプロジェクトがあるとします。

$ tree
.
├── go.mod
├── go.sum
├── main.go
├── subdir
│   └── subdir.go

go.mod, subdir.go, main.goは以下のような内容。

go.mod
module github.com/username/repo-name

require (
...
subdir.go
package subdir

func SubDirFunc() {
...
main.go
package main

import (
    "github.com/username/repo-name/subdir" // go.mod記載のモジュール名で絶対パス指定すること
    // NG "./subdir"                       // 相対パスは使用不可
)
...

main.goでのコメントのように、 ./subdirと指定してもコンパイル時に

cannot find module

となりGoはPathを見つけることができません。

go.modに指定しているモジュール名を用いて絶対パス指定しましょう。

また、相対パス利用の既存コードはGo Modulesに乗り換えたら相対パスimport部を修正する必要があります。

設計者の解説

Go ModulesのデザインをリードしたRuss Cox氏こちらのIssueのコメントでこのようになった経緯を解説してくれています。

要約すると

相対パスimportはGoコマンドとGOPATHがまだ無い時代に利用されていた。

GOPATHが採用された後、GOPATH内では絶対パス指定(fully-qualified path)推奨、GOPATH外では相対パス指定するしかない(しかしビルドキャッシュが無かったのでビルドが遅かった)。

Go Modulesでは相対パスか絶対パスのどちらかしか選択できない状況となった。マジョリティをサポートするために絶対パスコードの互換性保証を選んだ。

28
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
13