直接使用
go build main.go
打包,输出的是适用于windows的运行包”main.exe”
如果想在linux上运行,则需要调整以下参数:
第一步:进入代码路径
第二步:设置参数
go env -w CGO_ENABLED=0
go env -w GOOS=darwin3
go env -w GOARCH=amd64
go build main.go
go env -w CGO_ENABLED=0
go env -w GOOS=linux
go env -w GOARCH=amd64
go build main.go
第三步:打包
go build main.go
在所在目录即可出现”main”执行包,拷贝至linux中,并设置该文件的权限为“chmod 777 main ”
注:在输出的包中可能安装文件比较大,像压缩一下可以使用
go build -ldflags "-s -w" main.go
参数说明:
-s:去掉符号表(panic时候的stack trace没有任何文件名/行号信息);
-w:去掉调试信息(无法使用gdb调试);
注意:-s和-w也可以分开使用,一般来说如果不打算用gdb调试.
问题
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
解决
go env -w GO111MODULE=on
go mod init
问题:
新创建的golang项目,使用 go mod init 命令时出现
cannot determine module path for source directory xxxxxxx (outside GOPATH, module path must be specified)
解决方案:
这是因为go mod init 初始化项目时,需要定义一个 module ,我们打开一个 go.mod 文件,就会发现第一行就有
module ProjectName
因此,在执行 go mod init 时需要定义 module,如:
go mod init ProjectName
知识储备
//初始化模块:
Go mod init <项目模块名称>
//依赖关系处理,根据go.mod文件
Go mod tidy
//将依赖包复制到项目的vendor目录
Go mod vendor
//显示依赖关系
Go list -m all
//显示详细依赖关系
Go list -m -json all
//下载依赖
Go mod download [path@version]
go env 检查设置是否生效
解释GOARCH与GOOS的意思
GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) GOARCH:目标平台的体系架构(386、amd64、arm)
各操作系统的打包方法
windows打包项目
set GOARCH=”…”(amd,arm)
set GOOS=”…”(windows,linux)
go build…生成一个没有后缀名的二进制文件
linux打包
export GOARCH=”…”
export GOOS=”…”
以linux系统为例
在Windows上的cmd命令中执行:
运行环境为arm机器系统为linux:
E:\ideaproject\goproject\src\hell>set GOARCH=arm64
E:\ideaproject\goproject\src\hell>set GOOS=linux
E:\ideaproject\goproject\src\hell>go build agent.go
运行在环境为其他机器系统为linux:
E:\ideaproject\goproject\src\hell>set GOARCH=amd64
E:\ideaproject\goproject\src\hell>set GOOS=linux
E:\ideaproject\goproject\src\hell>go build agent.go
如果执行报如下错:
E:\ideaproject\goproject\src\hell>go build agentServer.go
agentServer.go:5:2: no required module provides package github.com/fasthttp/websocket: go.mod file not found in current directory or any parent directory; see 'go help modules'
agentServer.go:6:2: no required module provides package github.com/valyala/fasthttp: go.mod file not found in current directory or any parent directory; see 'go help modules'
agentServer.go:7:2: no required module provides package github.com/yeqown/fasthttp-reverse-proxy: go.mod file not found in current directory or any parent directory; see 'go help modules'
则执行命令:
E:\ideaproject\goproject\src\hell>go mod init
再次执行报如下错:
E:\ideaproject\goproject\src\hell>go build agent.go
agent.go:5:2: no required module provides package github.com/fasthttp/websocket; to add it:
go get github.com/fasthttp/websocket
agent.go:6:2: no required module provides package github.com/valyala/fasthttp; to add it:
go get github.com/valyala/fasthttp
agent.go:7:2: no required module provides package github.com/yeqown/fasthttp-reverse-proxy; to add it:
go get github.com/yeqown/fasthttp-reverse-proxy
则执行如下命令:
E:\ideaproject\goproject\src\hell>go get github.com/fasthttp/websocket
go get: module github.com/fasthttp/websocket: Get "https://proxy.golang.org/github.com/fasthttp/websocket/@v/list": dial tcp 172.217.27.145:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
如果报以上错则执行以下命令:
E:\ideaproject\goproject\src\hell>go env -w GOPROXY=https://goproxy.cn,direct
再次执行下载包命令:
E:\ideaproject\goproject\src\hell>go get github.com/fasthttp/websocket
go: downloading github.com/fasthttp/websocket v1.4.3
go: downloading github.com/savsgio/gotils v0.0.0-20200608150037-a5f6f5aef16c
go: downloading github.com/valyala/fasthttp v1.14.0
go: downloading github.com/klauspost/compress v1.10.4
go: downloading github.com/andybalholm/brotli v1.0.0
go: downloading github.com/valyala/bytebufferpool v1.0.0
go get: added github.com/fasthttp/websocket v1.4.3
E:\ideaproject\goproject\src\hell>go get github.com/yeqown/fasthttp-reverse-proxy
go: downloading github.com/yeqown/fasthttp-reverse-proxy v0.0.0-20200930023507-ed73ac32bc64
go: downloading github.com/yeqown/log v1.0.3
go: downloading github.com/pkg/errors v0.9.1
go get: added github.com/yeqown/fasthttp-reverse-proxy v0.0.0-20200930023507-ed73ac32bc64
出现以上提示则包下载成功,重新生成linux上可执行文件:
go env -w CGO_ENABLED=0
go env -w GOOS=darwin3
go env -w GOARCH=amd64
go build main.go
go env -w CGO_ENABLED=0
go env -w GOOS=linux
go env -w GOARCH=amd64
go build main.go
没有报错则生成成功。
然后拷贝新生成的文件到linux上,给授权:
greatwall@greatwall-os:~/soft/remoteAgent$ chmod 777 agent
启动:
greatwall@greatwall-os:~/soft/remoteAgent$ nohup ./agent &
[1] 3524
greatwall@greatwall-os:~/soft/remoteAgent$ nohup: 忽略输入并把输出追加到'nohup.out'
查看启动是否成功:
greatwall@greatwall-os:~/soft/remoteAgent$ netstat -an | grep 8999
tcp 0 0 0.0.0.0:8999 0.0.0.0:* LISTEN
出现以上结果则恭喜你启动成功!
以上8999端口为程序配置的端口,所以查看配置端口就可以检查是否启动成功。
Golang 支持在一个平台下生成多个平台运行包,编译之后直接可执行,使用起来非常方便
1、Mac
Mac下编译Linux,Windows平台的64位可执行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
2、Linux
Linux下编译Mac,Windows平台的64位可执行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
3、Windows
Windows下编译Mac,Linux平台的64位可执行程序:
go env -w CGO_ENABLED=0
go env -w GOOS=darwin3
go env -w GOARCH=amd64
go build main.go
go env -w CGO_ENABLED=0
go env -w GOOS=linux
go env -w GOARCH=amd64
go build main.go
编译完成后记得还原配置即可:
更改前的配置如下:
go env -w CGO_ENABLED=1
go env -w GOOS=windows
go env -w GOARCH=amd64
GOOS:目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows
GOARCH:目标可执行程序操作系统构架,包括 386,amd64,arm
Golang version 1.5以前版本在首次交叉编译时还需要配置交叉编译环境:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash