2017-03-21 4 views
1

Ich versuche, etwas Code für einen Webhook zu schreiben, der Aufruf wird, installieren gehen. Das Problem, das ich habe, ist, dass die GOPATH nicht gesetzt ist, wenn ich irgendwelche Befehle ziehen mit exec.Commandrunning gehen mit golang installieren exec.Command

func exec_cmd(w http.ResponseWriter, cmd string, args ...string) { 
    command := exec.Command(cmd, args...) 
    var out bytes.Buffer 
    var stderr bytes.Buffer 
    command.Stdout = &out 
    command.Stderr = &stderr 
    err := command.Run() 
    if err != nil { 
     errstring := fmt.Sprintf(fmt.Sprint(err) + ": " + stderr.String()) 
     io.WriteString(w, errstring) 
    } 
    io.WriteString(w, out.String()) 
    fmt.Println(out.String()) 
} 

func webhook(w http.ResponseWriter, r *http.Request) { 
    exec_cmd(w, "go", "install", "github.com/me/myrepo/mything") 
} 

func test(w http.ResponseWriter, r *http.Request) { 
    io.WriteString(w, "test") 
} 

func main() { 
    mux := http.NewServeMux() 
    mux.HandleFunc("/webhook", webhook) 
    mux.HandleFunc("/", test) 
    http.ListenAndServe(":8000", mux) 
} 

wenn der Webhook Endpunkt getroffen wird, gibt es:

exit status 1: can't load package: package github.com/me/myrepo/mything: cannot find package "github.com/me/myrepo/mything" in any of: 
    /usr/lib/go-1.6/src/github.com/me/myrepo/mything (from $GOROOT) 
    ($GOPATH not set) 

Wie würde gehe ich darum, sicherzustellen, dass der GOPATH in diesem Kontext steht?

Wenn ich "go install github.com/me/myrepo/mything" über die Befehlszeile ausführen, funktioniert es gut.

+2

Füllen Sie "Env" in https://golang.org/pkg/os/exec/#Cmd. – Volker

+1

Sie sollten auch Ihre Version von Go aktualisieren, nur weil go1.8 einen Standard-GOPATH eingeführt hat. – JimB

Antwort

2

Führen Sie dies in Ihrem Editor-Kontext oder in einem Container vielleicht? Es funktioniert nicht in einem Kontext ohne die Variable GOPATH env.

Wenn läuft mit laufen main.go laufen, funktioniert es? Es funktioniert für mich in diesem Kontext, ohne Ihren Code zu ändern. Solange der übergeordnete Kontext Zugriff auf GOPATH hat, sollte dies der Fall sein. Sie könnten alternativ manuell mit etwas wie folgt festgelegt:

command.Env = append(os.Environ(), "GOPATH=/tmp/go") 

Oder Sie könnten GOPATH gesetzt (für die Installation) und PATH (für unterwegs, git cmds) im Rahmen dieser Prozess in ausgeführt wird (wahrscheinlich vorzuziehen), für Beispiel in einer Systemdatei.

+0

Einstellung der Env funktioniert jetzt perfekt, danke. Es ist wahrscheinlich besser, es in systemd process file zu setzen, aber ich wusste nicht, dass ich das tun könnte. – jonydep