temporary patch for module support inside GOPATH

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

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

@ -143,12 +143,16 @@ func Build(bin string) error {
// godog library may not be imported in tested package
// but we need it for our testmain package.
// So we look it up in available source paths
godogPkg := locateModule(godogImportPath)
if godogPkg == nil {
// if it was not located as module
// we look it up in available source paths
// including vendor directory, supported since 1.5.
godogPkg, err := locatePackage(godogImportPath)
godogPkg, err = locatePackage(godogImportPath)
if err != nil {
return err
}
}
// make sure godog package archive is installed, gherkin
// will be installed as dependency of godog
@ -444,10 +448,16 @@ func dependencies(pkg *build.Package, visited map[string]string, vendor bool) er
if _, ok := visited[name]; ok {
continue
}
next, err := locatePackage(name)
next := locateModule(name) // module takes priority
if next == nil {
var err error
next, err = locatePackage(name)
if err != nil {
return err
}
}
visited[name] = pkg.PkgObj
if err := dependencies(next, visited, vendor); err != nil {
return err
@ -455,3 +465,44 @@ func dependencies(pkg *build.Package, visited map[string]string, vendor bool) er
}
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) {
// gopath := filepath.Join(os.TempDir(), "_gp")
// dir := filepath.Join(gopath, "src", "godogs")
// err := buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
// if err != nil {
// os.RemoveAll(gopath)
// t.Fatal(err)
// }
// defer os.RemoveAll(gopath)
func TestGodogBuildWithModuleInsideGopath(t *testing.T) {
gopath := filepath.Join(os.TempDir(), "_gp")
dir := filepath.Join(gopath, "src", "godogs")
err := buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile)
if err != nil {
os.RemoveAll(gopath)
t.Fatal(err)
}
defer os.RemoveAll(gopath)
// prevDir, err := os.Getwd()
// if err != nil {
// t.Fatal(err)
// }
prevDir, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
// if err := os.Chdir(dir); err != nil {
// t.Fatal(err)
// }
// defer os.Chdir(prevDir)
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
defer os.Chdir(prevDir)
// c := exec.Command("go", "mod", "init", "godogs")
// c.Env = os.Environ()
// c.Env = append(c.Env, "GOPATH="+gopath)
// c.Env = append(c.Env, "GO111MODULE=on")
// if out, err := c.CombinedOutput(); err != nil {
// t.Log(string(out))
// t.Fatal(err)
// }
c := exec.Command("go", "mod", "init", "godogs")
c.Env = os.Environ()
c.Env = append(c.Env, "GOPATH="+gopath)
c.Env = append(c.Env, "GO111MODULE=on")
if out, err := c.CombinedOutput(); err != nil {
t.Log(string(out))
t.Fatal(err)
}
// var stdout, stderr bytes.Buffer
// cmd := exec.Command("godog", "godogs.feature")
// cmd.Stdout = &stdout
// cmd.Stderr = &stderr
// cmd.Env = os.Environ()
// cmd.Env = append(cmd.Env, "GOPATH="+gopath)
// cmd.Env = append(cmd.Env, "GO111MODULE=on")
var stdout, stderr bytes.Buffer
cmd := exec.Command("godog", "godogs.feature")
cmd.Stdout = &stdout
cmd.Stderr = &stderr
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "GOPATH="+gopath)
cmd.Env = append(cmd.Env, "GO111MODULE=on")
// if err := cmd.Run(); err != nil {
// t.Log(stdout.String())
// t.Log(stderr.String())
// t.Fatal(err)
// }
// fmt.Println(stdout.String())
// }
if err := cmd.Run(); err != nil {
t.Log(stdout.String())
t.Log(stderr.String())
t.Fatal(err)
}
}