雑なメモ書き

気楽にいきます

GO111MODULEの影響を追ってみた

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() {
            // Replace module-aware get with GOPATH get if appropriate.
            *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":
        // leave MustUseModules alone
    case "on":
        MustUseModules = true
    case "off":
        if !MustUseModules {
            return
        }
    }
  • 更にその下の方に行くと
  • findModuleRootが空でmustUseModulesがfalseの場合
  • GOPATHを使った以前のモードだと解釈してreturnする
if CmdModInit {
    // Running 'go mod init': go.mod will be created in current directory.
    modRoot = cwd
} else {
    modRoot = findModuleRoot(cwd)
    if modRoot == "" {
        if !mustUseModules {
            // GO111MODULE is 'auto', and we can't find a module root.
            // Stay in GOPATH mode.
            return
        }
  • findModuleRootが何をしているかというと
  • go.modのあるディレクトリを探して返す
  • 無ければ空
func findModuleRoot(dir string) (root string) {
    dir = filepath.Clean(dir)

    // Look for enclosing go.mod.
    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点を行わせているとみられる