假如從代碼托管平臺(github、gitlab、gitee等)克隆一個Golang項目,使用Git clone完成以后,需要切換(cd)到這個項目里面去做一些操作,例如使用Go mod download安裝依賴包。

場景帶入
先看一個場景,假如從代碼托管平臺(github、gitlab、gitee等)克隆一個Golang項目,使用git clone完成以后,需要切換(cd)到這個項目里面去做一些操作,例如使用go mod download安裝依賴包。
這一系列操作如果使用程序來實現的話還是有一點不同的,特別是切換到項目目錄的動作。人工操作的話直接執(zhí)行 cd dst-path 命令即可,使用程序調用 cd 系統(tǒng)命令這么做卻是無效的。
Golang中的實現方法
Golang中調用系統(tǒng)命令的方法是這樣的,以上面的git clone為例:
package main
import "os/exec"
func main() {
err := exec.Command("git", "clone", "https://github.com/xxx/test").Run()
if err != nil {
panic(err)
}
}
接下來就需要切換到這里的 test 目錄去執(zhí)行 go mod tidy 命令了,你可能會想到這么實現:
package main
import "os/exec"
func main() {
err := exec.Command("git", "clone", "https://github.com/xxx/test").Run()
if err != nil {
panic(err)
}
err = exec.Command("cd", "./test").Run()
if err != nil {
panic(err)
}
err = exec.Command("go", "mod", "download").Run()
if err != nil {
panic(err)
}
}
到這里你就錯了,在程序里這么寫是不會生效的,可以執(zhí)行代碼看看效果。正確的方式應該這么寫:
package main
import "os/exec"
func main() {
err := exec.Command("git", "clone", "https://github.com/xxx/test").Run()
if err != nil {
panic(err)
}
cmd := exec.Command("go", "mod", "download")
cmd.Dir = "./test"
err = cmd.Run()
if err != nil {
panic(err)
}
}