2017-03-21 1 views
1

webhook 용 코드를 작성하려고합니다. 설치를 요청합니다. 난 데 문제는 내가 어떤 exec.Commandgolang으로 go 실행 exec.Command

은 webhook 엔드 포인트가 명중
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) 
} 

와 명령을 갈 호출 할 때 GOPATH이 설정되어 있지 않은지, 그것은 제공 :

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) 

어떻게 것 이 상황에서 GOPATH가 설정되었는지 확인하겠습니다.

"go install github.com/me/myrepo/mything"명령 줄에서 실행하면 정상적으로 작동합니다.

+2

https://golang.org/pkg/os/exec/#Cmd에서'Env '를 채 웁니다. – Volker

+1

go1.8이 기본 GOPATH를 도입했기 때문에 Go 버전도 업데이트해야합니다. – JimB

답변

2

편집기 컨텍스트 또는 컨테이너에서이 작업을 실행하고 있습니까? GOPATH 환경 변수가 설정되지 않은 컨텍스트에서는 작동하지 않습니다.

go를 실행하여 main.go를 실행하는 경우 작동합니까? 그것은 당신의 코드를 수정하지 않고 그 상황에서 저에게 효과적입니다. 부모 컨텍스트가 GOPATH에 액세스 할 수 있으면 그렇게해야합니다. 이 과정에서 (아마도) 바람직 실행되는 상황에서 (이동, 자식 CMDS에 대한) (설치에 대한)

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

아니면 설정할 수 GOPATH 및 PATH에 대해 : 당신은 다른 방법 같은 것을 사용하여 수동으로 설정할 수 있습니다 systemd 유닛 파일의 예.

+0

Env가 완벽하게 작동하고 있습니다. 감사합니다. systemd 프로세스 파일에서 설정하는 것이 더 나을 것입니다.하지만 그렇게 할 수 있다는 것을 몰랐습니다. – jonydep

관련 문제