如果你的程序最终运行在 windows 服务器

  1. // 不需要设置任何参数编译出windows服务器可执行程序
  2. // -o demo_goskeleton.exe ,指定编译出的文件名
  3. // -ldflags "-w -s" -trimpath ,参考交叉编译介绍
  4. go build -o demo_goskeleton.exe -ldflags "-w -s" -trimpath cmd/(web|api|cli)/main.go

交叉编译(windows直接编译出linux可执行文件)

  1. // goland 终端底栏打开`terminal`, 依次执行以下命令,设置编译前的参数
  2. // 特别注意: 以下三个命令执行时,前后不要有空格,否则最后编译可能会报错,无法编译出最终可执行文件
  3. # 追加 env -w 表示将值写入环境变量,否则每次只是临时生效,
  4. # 对于运行在linux服务器的程序后续编译就不需要重复设置编译前的参数,如果程序最终运行在windows,则编译参数 GOOS=windows
  5. // cpu架构
  6. go env -w GOARCH=amd64
  7. // 程序运行的最终系统,linux、windows、darwin(苹果macos系统)
  8. go env -w GOOS=linux
  9. // window编译设置Cgo模块关闭,因为windows上做cgo开发太麻烦,如果引用了Cgo库库,那么请在linux环境开发、编译
  10. go env -w CGO_ENABLED=0
  11. // 编译出最终可执行文件,进入根目录(GinSkeleton所在目录,也就是 go.mod 所在的目录)
  12. // 编译时建议追加参数:-ldflags "-w -s" ,同时会压缩编译后的体积。
  13. // -w 表示去除调试信息,禁止gdb调试,
  14. // -s 表示去除符号表(符号表在链接时起着按符号寻址的作用,静态编译后用不到)
  15. // 追加参数编译后的程序体积也会比原来减少25%左右.
  16. // -trimpath 表示去除绝对路径信息,只保留基于 go.mod 开始的相对路径信息
  17. // web|api|cli 三个目录选择其一即可,表示编译的入口目录
  18. go build -o demo_goskeleton -ldflags "-w -s" -trimpath cmd/(web|api|cli)/main.go

关于 -trimpath 参数的使用效果:
1.如果windows 交叉编译时不设置-trimpath,可执行文件在linux环境报错时会带有windwos路径信息
报错1.png
2.追加 -trimpath 参数之后,linux 环境已经去除了 windows 的绝对路径信息,只保留了相对路径。
报错2.png