众所周知,在windows环境下编译linux上可执行程序的命令如下
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go
自已在windows上写的玩意有时候老是想放到不同环境上跑,每次编译就需要执行4条命令,很麻烦
于是简单弄了个build_linux.bat
set file=%1
if ""%1""=="""" set file=main.go
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build %file%
然后想用go也实现这个玩意
package main
import (
"flag"
"fmt"
"os"
"os/exec"
)
func main() {
initFlag()
buildFile()
}
func buildFile() {
fmt.Println("*******")
cmd(" CGO_ENABLED=0")
cmd(" GOOS=" + GOOS)
cmd(" GOARCH=" + GOARCH)
cmd := exec.Command("go", "build", File)
cmd.Env = os.Environ()
fmt.Println(cmd)
err := cmd.Run()
if err != nil {
fmt.Println("***err:", err)
return
}
}
func cmd(arg string) {
// 怎么设置go env并生效?
cmd := exec.Command("go", "env", arg)
fmt.Println(cmd)
err := cmd.Run()
if err != nil {
fmt.Println("***err:", err)
return
}
}
var (
GOOS string
GOARCH string
File string
)
func initFlag() {
flag.StringVar(&GOOS, "o", "linux", "目标平台的操作系统(darwin、freebsd、linux、windows)")
flag.StringVar(&GOARCH, "a", "amd64", "目标平台的体系架构(386、amd64、arm)")
flag.StringVar(&File, "f", "main.go", "需要编译的文件")
flag.Parse()
}
然而上面的go demo只生效了 go build main.go 这条命令,并生成 main.exe文件,而不是理想上的linux可执行文件
求靓仔大佬解惑
更多评论