直接使用

    1. go build main.go

    打包,输出的是适用于windows的运行包”main.exe”
    如果想在linux上运行,则需要调整以下参数:
    第一步:进入代码路径
    第二步:设置参数

    1. go env -w CGO_ENABLED=0
    2. go env -w GOOS=darwin3
    3. go env -w GOARCH=amd64
    4. go build main.go
    5. go env -w CGO_ENABLED=0
    6. go env -w GOOS=linux
    7. go env -w GOARCH=amd64
    8. go build main.go

    第三步:打包

    1. go build main.go

    在所在目录即可出现”main”执行包,拷贝至linux中,并设置该文件的权限为“chmod 777 main ”
    注:在输出的包中可能安装文件比较大,像压缩一下可以使用

    1. go build -ldflags "-s -w" main.go

    参数说明:
    -s:去掉符号表(panic时候的stack trace没有任何文件名/行号信息);
    -w:去掉调试信息(无法使用gdb调试);
    注意:-s和-w也可以分开使用,一般来说如果不打算用gdb调试.

    问题

    1. go: go.mod file not found in current directory or any parent directory; see 'go help modules'

    解决

    1. go env -w GO111MODULE=on
    2. go mod init

    问题:
    新创建的golang项目,使用 go mod init 命令时出现

    1. cannot determine module path for source directory xxxxxxx (outside GOPATH, module path must be specified)

    解决方案:
    这是因为go mod init 初始化项目时,需要定义一个 module ,我们打开一个 go.mod 文件,就会发现第一行就有

    1. module ProjectName

    因此,在执行 go mod init 时需要定义 module,如:

    1. go mod init ProjectName

    知识储备

    1. //初始化模块:
    2. Go mod init <项目模块名称>
    3. //依赖关系处理,根据go.mod文件
    4. Go mod tidy
    5. //将依赖包复制到项目的vendor目录
    6. Go mod vendor
    7. //显示依赖关系
    8. Go list -m all
    9. //显示详细依赖关系
    10. Go list -m -json all
    11. //下载依赖
    12. Go mod download [path@version]

    image.png

    go env 检查设置是否生效
    image.png

    解释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系统为例
    image.png
    image.png

    在Windows上的cmd命令中执行:
    运行环境为arm机器系统为linux:

    1. E:\ideaproject\goproject\src\hell>set GOARCH=arm64
    2. E:\ideaproject\goproject\src\hell>set GOOS=linux
    3. E:\ideaproject\goproject\src\hell>go build agent.go

    运行在环境为其他机器系统为linux:

    1. E:\ideaproject\goproject\src\hell>set GOARCH=amd64
    2. E:\ideaproject\goproject\src\hell>set GOOS=linux
    3. E:\ideaproject\goproject\src\hell>go build agent.go

    如果执行报如下错:

    1. E:\ideaproject\goproject\src\hell>go build agentServer.go
    2. 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'
    3. 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'
    4. 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'

    则执行命令:

    1. E:\ideaproject\goproject\src\hell>go mod init

    再次执行报如下错:

    1. E:\ideaproject\goproject\src\hell>go build agent.go
    2. agent.go:5:2: no required module provides package github.com/fasthttp/websocket; to add it:
    3. go get github.com/fasthttp/websocket
    4. agent.go:6:2: no required module provides package github.com/valyala/fasthttp; to add it:
    5. go get github.com/valyala/fasthttp
    6. agent.go:7:2: no required module provides package github.com/yeqown/fasthttp-reverse-proxy; to add it:
    7. go get github.com/yeqown/fasthttp-reverse-proxy

    则执行如下命令:

    1. E:\ideaproject\goproject\src\hell>go get github.com/fasthttp/websocket
    2. 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.

    如果报以上错则执行以下命令:

    1. E:\ideaproject\goproject\src\hell>go env -w GOPROXY=https://goproxy.cn,direct

    再次执行下载包命令:

    1. E:\ideaproject\goproject\src\hell>go get github.com/fasthttp/websocket
    2. go: downloading github.com/fasthttp/websocket v1.4.3
    3. go: downloading github.com/savsgio/gotils v0.0.0-20200608150037-a5f6f5aef16c
    4. go: downloading github.com/valyala/fasthttp v1.14.0
    5. go: downloading github.com/klauspost/compress v1.10.4
    6. go: downloading github.com/andybalholm/brotli v1.0.0
    7. go: downloading github.com/valyala/bytebufferpool v1.0.0
    8. go get: added github.com/fasthttp/websocket v1.4.3
    9. E:\ideaproject\goproject\src\hell>go get github.com/yeqown/fasthttp-reverse-proxy
    10. go: downloading github.com/yeqown/fasthttp-reverse-proxy v0.0.0-20200930023507-ed73ac32bc64
    11. go: downloading github.com/yeqown/log v1.0.3
    12. go: downloading github.com/pkg/errors v0.9.1
    13. go get: added github.com/yeqown/fasthttp-reverse-proxy v0.0.0-20200930023507-ed73ac32bc64

    出现以上提示则包下载成功,重新生成linux上可执行文件:

    1. go env -w CGO_ENABLED=0
    2. go env -w GOOS=darwin3
    3. go env -w GOARCH=amd64
    4. go build main.go
    5. go env -w CGO_ENABLED=0
    6. go env -w GOOS=linux
    7. go env -w GOARCH=amd64
    8. go build main.go

    没有报错则生成成功。
    然后拷贝新生成的文件到linux上,给授权:

    1. greatwall@greatwall-os:~/soft/remoteAgent$ chmod 777 agent

    启动:

    1. greatwall@greatwall-os:~/soft/remoteAgent$ nohup ./agent &
    2. [1] 3524
    3. greatwall@greatwall-os:~/soft/remoteAgent$ nohup: 忽略输入并把输出追加到'nohup.out'

    查看启动是否成功:

    1. greatwall@greatwall-os:~/soft/remoteAgent$ netstat -an | grep 8999
    2. tcp 0 0 0.0.0.0:8999 0.0.0.0:* LISTEN

    出现以上结果则恭喜你启动成功!
    以上8999端口为程序配置的端口,所以查看配置端口就可以检查是否启动成功。

    Golang 支持在一个平台下生成多个平台运行包,编译之后直接可执行,使用起来非常方便

    1、Mac
    Mac下编译Linux,Windows平台的64位可执行程序:

    1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

    2、Linux
    Linux下编译Mac,Windows平台的64位可执行程序:

    1. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go

    3、Windows
    Windows下编译Mac,Linux平台的64位可执行程序:

    1. go env -w CGO_ENABLED=0
    2. go env -w GOOS=darwin3
    3. go env -w GOARCH=amd64
    4. go build main.go
    5. go env -w CGO_ENABLED=0
    6. go env -w GOOS=linux
    7. go env -w GOARCH=amd64
    8. go build main.go

    编译完成后记得还原配置即可:
    更改前的配置如下:
    go打包windows和linux - 图5

    1. go env -w CGO_ENABLED=1
    2. go env -w GOOS=windows
    3. go env -w GOARCH=amd64

    GOOS:目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows
    GOARCH:目标可执行程序操作系统构架,包括 386,amd64,arm
    Golang version 1.5以前版本在首次交叉编译时还需要配置交叉编译环境:

    1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash