This commit is contained in:
parent
e5af5494f4
commit
b5d5658cd5
|
@ -9,6 +9,7 @@
|
|||
"delete": "删除",
|
||||
"save": "保存",
|
||||
"format": "格式化",
|
||||
"goget": "go get",
|
||||
"build_n_run": "构建 & 运行",
|
||||
"full_screen": "全屏"
|
||||
}
|
1
main.go
1
main.go
|
@ -76,6 +76,7 @@ func main() {
|
|||
// 运行相关
|
||||
http.HandleFunc("/build", output.BuildHandler)
|
||||
http.HandleFunc("/run", output.RunHandler)
|
||||
http.HandleFunc("/go/get", output.GoGetHandler)
|
||||
http.HandleFunc("/output/ws", output.WSHandler)
|
||||
|
||||
// 文件树
|
||||
|
|
|
@ -155,7 +155,6 @@ func BuildHandler(w http.ResponseWriter, r *http.Request) {
|
|||
cmd := exec.Command("go", argv...)
|
||||
cmd.Dir = curDir
|
||||
|
||||
// 设置环境变量(设置当前用户的 GOPATH 等)
|
||||
setCmdEnv(cmd, username)
|
||||
|
||||
glog.Infof("go build -o %s %s", executable, filePath)
|
||||
|
@ -233,6 +232,82 @@ func BuildHandler(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
}
|
||||
|
||||
func GoGetHandler(w http.ResponseWriter, r *http.Request) {
|
||||
data := map[string]interface{}{"succ": true}
|
||||
defer util.RetJSON(w, r, data)
|
||||
|
||||
session, _ := user.Session.Get(r, "wide-session")
|
||||
sid := session.Values["id"].(string)
|
||||
username := session.Values["username"].(string)
|
||||
|
||||
decoder := json.NewDecoder(r.Body)
|
||||
|
||||
var args map[string]interface{}
|
||||
|
||||
if err := decoder.Decode(&args); err != nil {
|
||||
glog.Error(err)
|
||||
data["succ"] = false
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
filePath := args["file"].(string)
|
||||
curDir := filePath[:strings.LastIndex(filePath, string(os.PathSeparator))]
|
||||
|
||||
cmd := exec.Command("go", "get")
|
||||
cmd.Dir = curDir
|
||||
|
||||
setCmdEnv(cmd, username)
|
||||
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if nil != err {
|
||||
glog.Error(err)
|
||||
data["succ"] = false
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
stderr, err := cmd.StderrPipe()
|
||||
if nil != err {
|
||||
glog.Error(err)
|
||||
data["succ"] = false
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
reader := io.MultiReader(stdout, stderr)
|
||||
|
||||
cmd.Start()
|
||||
|
||||
channelRet := map[string]interface{}{}
|
||||
|
||||
go func(runningId int) {
|
||||
glog.Infof("Session [%s] is running [go get] [runningId=%d]", sid, runningId)
|
||||
|
||||
for {
|
||||
buf := make([]byte, 1024)
|
||||
count, err := reader.Read(buf)
|
||||
|
||||
if nil != err || 0 == count {
|
||||
glog.Infof("Session [%s] 's running [go get] [runningId=%d] has done", sid, runningId)
|
||||
|
||||
break
|
||||
} else {
|
||||
channelRet["output"] = string(buf[:count])
|
||||
channelRet["cmd"] = "run"
|
||||
|
||||
if nil != outputWS[sid] {
|
||||
err := outputWS[sid].WriteJSON(&channelRet)
|
||||
if nil != err {
|
||||
glog.Error(err)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}(rand.Int())
|
||||
}
|
||||
|
||||
func setCmdEnv(cmd *exec.Cmd, username string) {
|
||||
userWorkspace := conf.Wide.GetUserWorkspace(username)
|
||||
|
||||
|
@ -240,5 +315,9 @@ func setCmdEnv(cmd *exec.Cmd, username string) {
|
|||
"GOPATH="+userWorkspace,
|
||||
"GOOS="+runtime.GOOS,
|
||||
"GOARCH="+runtime.GOARCH,
|
||||
"GOROOT="+runtime.GOROOT())
|
||||
"GOROOT="+runtime.GOROOT(),
|
||||
"PATH="+os.Getenv("PATH"))
|
||||
|
||||
//"TERM="+os.Getenv("COMSPEC"),
|
||||
//"ComSpec="+os.Getenv("ComSpec")
|
||||
}
|
||||
|
|
|
@ -126,11 +126,23 @@ var wide = {
|
|||
$('#output').text('');
|
||||
},
|
||||
success: function(data) {
|
||||
executable = data.executable;
|
||||
|
||||
if (data.succ) {
|
||||
|
||||
}
|
||||
});
|
||||
},
|
||||
goget: function() {
|
||||
var request = {
|
||||
"file": wide.curNode.path
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/go/get',
|
||||
data: JSON.stringify(request),
|
||||
dataType: "json",
|
||||
beforeSend: function(data) {
|
||||
$('#output').text('');
|
||||
},
|
||||
success: function(data) {
|
||||
}
|
||||
});
|
||||
},
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
<button onclick="wide.run()">{{.i18n.build_n_run}}</button>
|
||||
<button onclick="wide.save()">{{.i18n.save}}</button>
|
||||
<button onclick="wide.fmt()">{{.i18n.format}}</button>
|
||||
<button onclick="wide.goget()">{{.i18n.goget}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in New Issue