windows 命令行下手工编译go项目(使用go.mod)

一、手工编译的目的

  1、了解运行原理

  2、在集成工具使用中就比较轻松的解决一些相关依赖等设置问题了,比如:利用Sublime Text开发调用的就是系统的编译器,相关命令调用go run ,go install,go build等。

二、安装软件:

 1.git软件(windows版) 

   用来下载github上依赖的项目代码

 2.安装go编译器
    Go语言官网(https://golang.google.cn/dl/)下载 Windows 系统下的Go语言开发包

    下载、安装go1.18.1.windows-amd64.msi

    另外: 你也可以从源码编译安装go编译器 https://golang.google.cn/doc/install/source

三、默认安装时环境变量设置

C:\Program Files\Go\src>go env
set GO111MODULE=""//当=auto时或未设置(即设置为空)时则根据当前项目目录下是否存在go.mod文件或 $GOPATH/src之外并且其本身包含go.mod文件时才会使用新特性 Go Modules模式,
//auto为 GO111MODULE的默认值
set GOARCH=amd64  // // 运行架构
set GOBIN=
set GOCACHE=C:\Users\aozhejin\AppData\Local\go-build
set GOENV=C:\Users\aozhejin\AppData\Roaming\go\env   //env文件存储
set GOEXE=.exe    //是否产生exe文件
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows   //运行环境
set GOINSECURE=
set GOMODCACHE=C:\Users\aozhejin\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\aozhejin\go    //项目路径,也就是主要写代码的地方,也是第三方库下载的位置,eclipse中的workspace概念一样.GOPATH可以是多个目录组成
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direc
set GOROOT=C:\Program Files\Go          //golang的程序安装目录
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18.1
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Program Files\Go\src\go.mod
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\tmp\go-
build1940300830=/tmp/go-build -gno-record-gcc-switches


windows下环境变量设置情况:
1.查看GOPATH

 2.查看%USEPROFILE%用户环境变量设置 :

3.查看用户变量的PATH

 4.查看系统变量的PATH

 以上全部为自动安装 1.18.1  go编译器之后自动设置的

四、设置 go env环境变量

C:\Program Files\Go\src>go env
set GO111MODULE=on
//当=on时使用Go Modules,这时go会忽略 $GOPATH和vendor文件夹,只根据go.mod下载依赖
//当=off时不适用新特性 Go Modules支持,它会查找 vendor目录和 $GOPATH来查找依赖关系,也就是继续使用“GOPATH模式”
//当=auto时或未设置时则根据当前项目目录下是否存在go.mod文件或 $GOPATH/src之外并且其本身包含go.mod文件时才会使用新特性 Go Modules模式,
//auto为 GO111MODULE的默认值 set GOARCH=amd64 // // 运行架构 set GOBIN= set GOCACHE=C:\Users\aozhejin\AppData\Local\go-build set GOENV=C:\Users\aozhejin\AppData\Roaming\go\env //env文件存储 set GOEXE=.exe //是否产生exe文件 set GOEXPERIMENT= set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows //运行环境 set GOINSECURE= set GOMODCACHE=C:\Users\aozhejin\go\pkg\mod set GONOPROXY= set GONOSUMDB= set GOOS=windows set GOPATH=C:\Users\aozhejin\go //项目路径,也就是主要写代码的地方,也是第三方库下载的位置,eclipse中的workspace概念一样.GOPATH可以是多个目录组成 set GOPRIVATE= set GOPROXY=https://goproxy.cn,direct //这里更改代理设置,go get加速的,简单来说就是一个代理,让我们更方便的下载由于不能访问源码等的原因而导致无法下载的第三方包的问题, set GOROOT=C:\Program Files\Go //golang的程序安装目录 set GOSUMDB=sum.golang.org set GOTMPDIR= set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64 set GOVCS= set GOVERSION=go1.18.1 set GCCGO=gccgo set GOAMD64=v1 set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=C:\Program Files\Go\src\go.mod set GOWORK= set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\tmp\go- build1940300830=/tmp/go-build -gno-record-gcc-switches

修改环境变量
例如修改 GOPROXY: go env -w GOPROXY=新地址

我通过的是 我电脑属性-->系统属性--->高级---->来设置改变 go env

 添加两个变量 GO111MODULE和GOPROXY

  现在基本已具备手工构建条件

  五、构建test1项目
      1. 建立项目文件夹在GOPATH路径下:
           设置GO111MODULE=on之后就可以使用go module了,当然项目不一定非要在GOPATH环境变量设定的路径下构建,这个不是必须的,您可以在任意其他位置创建项目,同时编译项目(但是运行需要放在 GOPATH路径下,本文最后有演示),并且还能够很好的管理项目依赖的第三方包信息。
           C:\Users\qingshuic\go>md test1
      2. 创建主文件
         test1.go

package main

import (
    "fmt"
    "github.com/rogpeppe/godef/go/ast"   //这里是引入的依赖,这是我随便引入的
)
type MYFUNC func(int, int)
 
// 定义函数,无返回值
func addFunc(a int, b int) {
    fmt.Println(a + b)
}
func main() {
    var f MYFUNC
    f = addFunc
    //fmt格式化
    fmt.Printf("%T \n", addFunc) // func(int, int)
    fmt.Println(f)  // 0x48e6d0
    f(10, 20)       // 通过f调用addFunc()函数
}

    3. cmd下进入该文件夹下 
   

C:\Users\qingshuic\go\test1>go mod init test1
go: creating new go.mod: module test1
go: to add module requirements and sums:   //提示需要增加模块信息,在本项目目录下需要执行go mod tidy命令
        go mod tidy
//查看生成的go.mod文件,会看到只有go编译器版本信息
module test1

go 1.18

   4. 执行go mod tidy

//执行go mod tidy
C:\Users\qingshuic\go\test1>go mod tidy
go: finding module for package github.com/rogpeppe/godef/go/ast
go: found github.com/rogpeppe/godef/go/ast in github.com/rogpeppe/godef v1.1.2
//再次查看go.mod文件
 module test1

 go 1.18

require github.com/rogpeppe/godef v1.1.2

//查看生成的go.sum
9fans.net/go v0.0.0-20181112161441-237454027057/go.mod h1:diCsxrliIURU9xsYtjCp5AbpQKqdhKmf0ujWDUSkfoY=
github.com/rogpeppe/godef v1.1.2 h1:c5mCx0EcCORJOdVMREX7Lgh1raTxAHFmOfXdEB9u8Jw=
github.com/rogpeppe/godef v1.1.2/go.mod h1:WtY9A/ovuQ+UakAJ1/CEqwwulX/WJjb2kgkokCHi/GY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20200226224502-204d844ad48d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

5.编译本项目,这里用go build,而没有用go install, 一旦使用go install 就会把生成的test1.exe ,复制到 C:\Program Files\Go\bin下

C:\Users\qingshuic\go\test1>go build test1.go
# command-line-arguments
.\test1.go:5:2: imported and not used: "github.com/rogpeppe/godef/go/ast"
//这个依赖包如何在代码中使用,已超出本博文的范围也不必关系,编译出错,只需注释掉该引入包即可编译通过。主要演示依赖引入。

 6.注释掉该引入

package main

import (
    "fmt"
    //"github.com/rogpeppe/godef/go/ast"   //这里是引入的依赖,这是我随便引入的
)
type MYFUNC func(int, int)
 
// 定义函数,无返回值
func addFunc(a int, b int) {
    fmt.Println(a + b)
}
func main() {
    var f MYFUNC
    f = addFunc
    //fmt格式化
    fmt.Printf("%T \n", addFunc) // func(int, int)
    fmt.Println(f)  // 0x48e6d0
    f(10, 20)       // 通过f调用addFunc()函数
}

重新编译 

C:\Users\qingshuic\go\test1>go build test1.go   //即可生成test1.exe

结果:

C:\Users\qingshuic\go\test1>go run test1
func(int, int)
0x48cc40
30

  

六、案例2(GO111MODULE设置为on以后,可以在任意位置创建项目,并编译,但是执行时需把可执行文件放在GOPATH路径下,上个例子项目是在GOPATH路径下的):

 
1.项目建在其他位置例如: c:\test2
    C:\>cd test2

2.生成go.mod
   位置在 C:\Program Files\Go\src\go.mod

C:\test2>go mod init test2
go: creating new go.mod: module test2
go: to add module requirements and sums:
go mod tidy

3.生成go.sum以及读取test1.go中的依赖,并且更新go.mod依赖的信息
  go sum 命令会添加缺失的模块以及移除不需要的模块。执行后会生成go.sum文件(模块相关的条目)

C:\test2>go mod tidy
go: finding module for package github.com/rogpeppe/godef/go/ast
go: found github.com/rogpeppe/godef/go/ast in github.com/rogpeppe/godef v1.1.2
//查看go.mod会发现依赖信息会被更新

4.test1.go中 加上依赖编译. 这个依赖随便加的godef

C:\test2>go run test1.go
# command-line-arguments
.\test1.go:5:2: imported and not used: "github.com/rogpeppe/godef/go/ast"

5.去掉依赖,正常编译

C:\test2>go build test1.go  //编译通过

6.执行两种方式

方式1:
C:\test2>go run test1.go   //直接加文件名方式也可以正常运行.
func(int, int)
0x48cc40
30

方式2:
C:\test2>go run test1
package test1 is not in GOROOT (C:\Program Files\Go\src\test1)

//注意:我们看到编译是放在任何位置都没有问题,但是运行这里是有差异的,也就是如果运行 go run test1 需要把放在GOPATH下.

 7.下载相关的依赖包
   执行命令go mod vendor生成vendor文件夹,该文件夹下将会放置你go.mod文件描述的依赖包,文件夹下同时还有一个文件modules.txt,它是你整个工程的所有模块。在执行这条命令之前,如果 你工程之前有vendor目录,应该先进行删除。同理go mod vendor -v会将添加到vendor中的模块打印出来;

C:\test2>go mod vendor
C:\test2>go mod verify
//go mod verify来检查当前模块的依赖是否全部下载下来,是否下载下来被修改过。如果所有的模块都没有被修改过,那么执行这条命令之后,会打印all modules verifiedall modules verified
// 打印相关的依赖
C:\test2>go mod graph
test2 github.com/rogpeppe/godef@v1.1.2
test2 golang.org/x/text@v0.3.0
github.com/rogpeppe/godef@v1.1.2 9fans.net/go@v0.0.0-20181112161441-237454027057
github.com/rogpeppe/godef@v1.1.2 golang.org/x/tools@v0.0.0-20200226224502-204d844ad48d
golang.org/x/tools@v0.0.0-20200226224502-204d844ad48d golang.org/x/mod@v0.1.1-0.20191105210325-c90efee705ee
golang.org/x/tools@v0.0.0-20200226224502-204d844ad48d golang.org/x/net@v0.0.0-20190620200207-3b0461eec859
golang.org/x/tools@v0.0.0-20200226224502-204d844ad48d golang.org/x/sync@v0.0.0-20190423024810-112230192c58
golang.org/x/tools@v0.0.0-20200226224502-204d844ad48d golang.org/x/xerrors@v0.0.0-20191011141410-1b5146add898
golang.org/x/mod@v0.1.1-0.20191105210325-c90efee705ee golang.org/x/crypto@v0.0.0-20191011191535-87dc89f01550
golang.org/x/mod@v0.1.1-0.20191105210325-c90efee705ee golang.org/x/xerrors@v0.0.0-20191011141410-1b5146add898
golang.org/x/net@v0.0.0-20190620200207-3b0461eec859 golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2
golang.org/x/net@v0.0.0-20190620200207-3b0461eec859 golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a
golang.org/x/net@v0.0.0-20190620200207-3b0461eec859 golang.org/x/text@v0.3.0
golang.org/x/crypto@v0.0.0-20191011191535-87dc89f01550 golang.org/x/net@v0.0.0-20190404232315-eb5bcb51f2a3
golang.org/x/crypto@v0.0.0-20191011191535-87dc89f01550 golang.org/x/sys@v0.0.0-20190412213103-97732733099d
golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a
golang.org/x/net@v0.0.0-20190404232315-eb5bcb51f2a3 golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2
golang.org/x/net@v0.0.0-20190404232315-eb5bcb51f2a3 golang.org/x/text@v0.3.0

 

查看生成的vendor目录,如果之前有需要删除再次生成. 

七、go.mod文件

上面为例,依赖模块引入只是1个模块时候

  module test1

  go 1.18

  require github.com/rogpeppe/godef v1.1.2

 

依赖多于1个模块时候,发生的变化.
module test2 go
1.18 require ( github.com/rogpeppe/godef v1.1.2 golang.org/x/text v0.3.0 )
//上面的例子是2个,他们都是独立的,不会互相影响,没有任何关系。

 八、更详细的命令参看官方
   https://golang.google.cn/cmd/go/

posted @ 2022-06-01 13:56  jinzi  阅读(338)  评论(0编辑  收藏  举报