我正在使用以下命令在Windows的Linux上交叉编译Golang程序:

1
go build -o myprog.bin myprog.go

为此,我必须设置环境变量GOOS = linux。 由于我还在为Windows编译一些程序,因此在完成交叉编译后,我必须重置GOOS = windows。 所以我有一个批处理文件,如下所示:

1
2
3
set GOOS=linux
go build -o myprog.bin myprog.go
set GOOS=windows

如果碰巧同时为每个Linux和Windows编译两个程序,则Windows程序可能会针对Linux编译。 有没有一种方法可以将环境变量的范围限制为Windows上的命令,或者将其覆盖为命令? 例如

1
go build -o myprog.bin myprog.go -GOOS linux

我知道goxc提供了此功能,但可以构建吗?


要以Greg的答案为基础,该答案解释了使用set命令进行的更改仅限于进程,如果要限制进程内环境变量更改的范围,请使用setlocalendlocal命令。 这使您可以在单个命令过程中隔离变量。

1
2
3
4
5
setlocal
set GOOS=linux
go build -o myprog.bin myprog.go
endlocal
:: GOOS will now equal what it was before being set within the scope
  • 这就是我要达到的目的,尽管我希望可以将os传递给一个内衬的go build命令。 setlocal && set GOROOT=C:\Go\Test\ && echo %GOROOT% && endlocal不是按顺序运行。我想goxc是完成这项工作的工具。

环境变量对于设置它们的过程(以及该过程的后代)而言是本地的。 因此,当您执行set GOOS=linux时,更改仅在该命令处理器内发生,而不会影响任何其他现有进程。 从该命令处理器内部启动的新进程将继承其环境变量的当前值。

简而言之,您在set GOOS=linux后跟set GOOS=windows的解决方案将可以正常工作,并且没有干扰其他同时构建的风险。

  • 如果我在命令提示符处设置了GOROOT = x,则在脚本开始时设置GOROOT = y,当脚本退出时,echo%GOROOT%显示y,这向我建议,根据您的回答,GOOS和GOROOT是不同种类的环境变量。那正确吗?
  • 在脚本中设置环境变量会影响脚本退出后该命令提示符的环境变量的值(这与类Unix系统的行为不同)。
  • 好吧,那可能更糟。这些脚本不必是同时运行的,只需从同一提示符下运行即可。因此,除非命令仅在该提示符下运行,或者在Windows中运行的批处理文件中,否则它们不限于该命令。听起来好像要设置GOROOT = y && go build ... &&设置GOROOT = x,但是这里凌晨2点,我以后会接听。谢谢。
  • 为了解决这个问题,您的构建脚本不应依赖于先前运行的脚本可能已更改的任何现有环境变量的值。