temporary patch for module support inside GOPATH

Этот коммит содержится в:
gedi 2018-11-09 16:45:40 +02:00
родитель d266d9188c
коммит 722f647346
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 56604CDCCC201556
2 изменённых файлов: 97 добавлений и 47 удалений

Просмотреть файл

@ -143,11 +143,15 @@ func Build(bin string) error {
// godog library may not be imported in tested package // godog library may not be imported in tested package
// but we need it for our testmain package. // but we need it for our testmain package.
// So we look it up in available source paths godogPkg := locateModule(godogImportPath)
// including vendor directory, supported since 1.5. if godogPkg == nil {
godogPkg, err := locatePackage(godogImportPath) // if it was not located as module
if err != nil { // we look it up in available source paths
return err // including vendor directory, supported since 1.5.
godogPkg, err = locatePackage(godogImportPath)
if err != nil {
return err
}
} }
// make sure godog package archive is installed, gherkin // make sure godog package archive is installed, gherkin
@ -444,10 +448,16 @@ func dependencies(pkg *build.Package, visited map[string]string, vendor bool) er
if _, ok := visited[name]; ok { if _, ok := visited[name]; ok {
continue continue
} }
next, err := locatePackage(name)
if err != nil { next := locateModule(name) // module takes priority
return err if next == nil {
var err error
next, err = locatePackage(name)
if err != nil {
return err
}
} }
visited[name] = pkg.PkgObj visited[name] = pkg.PkgObj
if err := dependencies(next, visited, vendor); err != nil { if err := dependencies(next, visited, vendor); err != nil {
return err return err
@ -455,3 +465,44 @@ func dependencies(pkg *build.Package, visited map[string]string, vendor bool) er
} }
return nil return nil
} }
func locateModule(name string) *build.Package {
// for module support, query the module import path
cmd := exec.Command("go", "mod", "download", "-json")
out, err := cmd.StdoutPipe()
if err != nil {
// Unable to read stdout
return nil
}
if cmd.Start() != nil {
// Does not using modules
return nil
}
type module struct {
Dir string
Path string
}
var mod *module
if err := json.NewDecoder(out).Decode(&mod); err != nil {
// Unexpected result
return nil
}
if cmd.Wait() != nil {
return nil
}
if strings.Index(name, mod.Path) == -1 {
return nil
}
suffix := strings.Replace(name, mod.Path, "", 1)
add := strings.Replace(suffix, "/", string(filepath.Separator), -1)
pkg, err := build.ImportDir(mod.Dir+add, 0)
if err != nil {
return nil
}
return pkg
}

Просмотреть файл

@ -47,47 +47,46 @@ func TestGodogBuildWithModuleOutsideGopath(t *testing.T) {
} }
} }
// func TestGodogBuildWithModuleInsideGopath(t *testing.T) { func TestGodogBuildWithModuleInsideGopath(t *testing.T) {
// gopath := filepath.Join(os.TempDir(), "_gp") gopath := filepath.Join(os.TempDir(), "_gp")
// dir := filepath.Join(gopath, "src", "godogs") dir := filepath.Join(gopath, "src", "godogs")
// err := buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) err := buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
// if err != nil { if err != nil {
// os.RemoveAll(gopath) os.RemoveAll(gopath)
// t.Fatal(err) t.Fatal(err)
// } }
// defer os.RemoveAll(gopath) defer os.RemoveAll(gopath)
// prevDir, err := os.Getwd() prevDir, err := os.Getwd()
// if err != nil { if err != nil {
// t.Fatal(err) t.Fatal(err)
// } }
// if err := os.Chdir(dir); err != nil { if err := os.Chdir(dir); err != nil {
// t.Fatal(err) t.Fatal(err)
// } }
// defer os.Chdir(prevDir) defer os.Chdir(prevDir)
// c := exec.Command("go", "mod", "init", "godogs") c := exec.Command("go", "mod", "init", "godogs")
// c.Env = os.Environ() c.Env = os.Environ()
// c.Env = append(c.Env, "GOPATH="+gopath) c.Env = append(c.Env, "GOPATH="+gopath)
// c.Env = append(c.Env, "GO111MODULE=on") c.Env = append(c.Env, "GO111MODULE=on")
// if out, err := c.CombinedOutput(); err != nil { if out, err := c.CombinedOutput(); err != nil {
// t.Log(string(out)) t.Log(string(out))
// t.Fatal(err) t.Fatal(err)
// } }
// var stdout, stderr bytes.Buffer var stdout, stderr bytes.Buffer
// cmd := exec.Command("godog", "godogs.feature") cmd := exec.Command("godog", "godogs.feature")
// cmd.Stdout = &stdout cmd.Stdout = &stdout
// cmd.Stderr = &stderr cmd.Stderr = &stderr
// cmd.Env = os.Environ() cmd.Env = os.Environ()
// cmd.Env = append(cmd.Env, "GOPATH="+gopath) cmd.Env = append(cmd.Env, "GOPATH="+gopath)
// cmd.Env = append(cmd.Env, "GO111MODULE=on") cmd.Env = append(cmd.Env, "GO111MODULE=on")
// if err := cmd.Run(); err != nil { if err := cmd.Run(); err != nil {
// t.Log(stdout.String()) t.Log(stdout.String())
// t.Log(stderr.String()) t.Log(stderr.String())
// t.Fatal(err) t.Fatal(err)
// } }
// fmt.Println(stdout.String()) }
// }