main.go
func main() {
_ = go11tag
flag.Usage = base.Usage
flag.Parse()
log.SetFlags(0)
args := flag.Args()
if len(args) < 1 {
base.Usage()
}
if args[0] == "get" || args[0] == "help" {
if modload.Init(); !modload.Enabled() {
*modget.CmdGet = *get.CmdGet
}
}
modload.Init()
- src/cmd/go/internal/modload/init.go
- ここでGO111MODULEをチェックしている
- チェックして入ればMustUseModulesがtrueになる
func Init() {
if initialized {
return
}
initialized = true
env := os.Getenv("GO111MODULE")
switch env {
default:
base.Fatalf("go: unknown environment setting GO111MODULE=%s", env)
case "", "auto":
case "on":
MustUseModules = true
case "off":
if !MustUseModules {
return
}
}
- 更にその下の方に行くと
- findModuleRootが空でmustUseModulesがfalseの場合
- GOPATHを使った以前のモードだと解釈してreturnする
if CmdModInit {
modRoot = cwd
} else {
modRoot = findModuleRoot(cwd)
if modRoot == "" {
if !mustUseModules {
return
}
- findModuleRootが何をしているかというと
- go.modのあるディレクトリを探して返す
- 無ければ空
func findModuleRoot(dir string) (root string) {
dir = filepath.Clean(dir)
for {
if fi, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil && !fi.IsDir() {
return dir
}
d := filepath.Dir(dir)
if d == dir {
break
}
dir = d
}
return ""
}
- このmodRootはどこで使われているかというと
- search.SetModRootにセットされています
- 逆の言い方をすれば、go.modが無ければsearchにこのpathは含まれない
modfetch.GoSumFile = filepath.Join(modRoot, "go.sum")
search.SetModRoot(modRoot)
- 結論を言うとGO111MODULEは
- go.modを探す
- modRootをsearch pathに含める
- の2点を行わせているとみられる