假如从代码托管平台(github、gitlab、gitee等)克隆一个Golang项目,使用Git clone完成以后,需要切换(cd)到这个项目里面去做一些操作,例如使用Go mod download安装依赖包。
场景带入
先看一个场景,假如从代码托管平台(github、gitlab、gitee等)克隆一个Golang项目,使用git clone完成以后,需要切换(cd)到这个项目里面去做一些操作,例如使用go mod download安装依赖包。
这一系列操作如果使用程序来实现的话还是有一点不同的,特别是切换到项目目录的动作。人工操作的话直接执行 cd dst-path 命令即可,使用程序调用 cd 系统命令这么做却是无效的。
Golang中的实现方法
Golang中调用系统命令的方法是这样的,以上面的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 目录去执行 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)
}
}
到这里你就错了,在程序里这么写是不会生效的,可以执行代码看看效果。正确的方式应该这么写:
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)
}
}