go run、build、install、get的原理和区别 | 您所在的位置:网站首页 › build中文是 › go run、build、install、get的原理和区别 |
学习go也有好些年头了,都没怎么研究过go的编译命令。真是惭愧。今天学习并记录下 结论: go run 专门用来运行命令源码文件的命令,一般用来运行单个文件 go build 主要是用于测试编译。编译某个包或者项目,在当前目录下生成可执行文件 go install 编译并安装代码包或者源码文件的。 go get 用于从远程代码仓库(比如 Github )上下载代码包并更新mod go 1.17之后go get只下载源码,并将依赖添加到go.mod。get install用来下载和安装三方库 go常用的命令标记 -n 和-x基本都用来打印执行的命令,-x除了打印还会运行 现在来了解下go run、go build、go install和go get 1、go run专门用来运行命令源码文件的命令,不是用来运行所有go源码文件的 go run 命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于 main 包)作为文件参数,且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件,那么 go run 命令就只会打印错误提示信息并退出,而不会继续执行。 go run -n 查看执行过程 先创建临时文件b001,在b001中创建一个importcfg文件,将使用的import文件写入,然后切换到目录下,执行compile命令,创建一个importcfg.link文件,将compile生成的link写入。然后创建临时文件exe,将导入文件和源码文件连接在一起生成可执行文件。 通过compile生成link文件,然后将link和源文件一起打包成exe 生成的临时文件可以用go run -work看到 go run命令是生成了2个文件,一个是归档文件,一个是可执行文件。 2、go buildgo build 命令主要是用于测试编译。在包的编译过程中,若有必要,会同时编译与之相关联的包。 如果是普通包,当你执行go build命令后,不会产生任何文件。 如果是main包,当只执行go build命令后,会在当前目录下生成一个可执行文件。如果需要在$GOPATH/bin目录下生成相应的exe文件,需要执行go install 或者使用 go build -o 路径/可执行文件。 如果某个文件夹下有多个文件,而你只想编译其中某一个文件,可以在 go build 之后加上文件名,例如 go build a.go;go build 命令默认会编译当前目录下的所有go文件。 你也可以指定编译输出的文件名。比如,我们可以指定go build -o 可执行文件名,默认情况是你的package名(非main包),或者是第一个源文件的文件名(main包)。 go build 会忽略目录下以”_”或者”.”开头的go文件。 如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件。 go build 用于编译我们指定的源码文件或代码包以及它们的依赖包。但是注意如果用来编译非命令源码文件,即库源码文件,go build 执行完是不会产生任何结果的。这种情况下,go build 命令只是检查库源码文件的有效性,只会做检查性的编译,而不会输出任何结果文件。 go build 编译命令源码文件,则会在该命令的执行目录中生成一个可执行文件 go build 后面不追加目录路径的话,它就把当前目录作为代码包并进行编译。go build 命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被编译。 执行同go run,多了一步mv 将exe临时文件下的可执行文件重命名并移动当当前目录下 3、go installgo install 命令是用来编译并安装代码包或者源码文件的。 分两步 第一步是生成结果文件(可执行文件或者.a包),第二步会把编译好的结果移到$GOPATH/pkg或者$GOPATH/bin 可执行文件: 一般是 go install 带main函数的go文件产生的,有函数入口,所有可以直接运行。 .a应用包: 一般是 go install 不包含main函数的go文件产生的,没有函数入口,只能被调用。 4、go getgo get 命令用于从远程代码仓库(比如 Github )上下载并安装代码包。注意,go get 命令会把当前的代码包下载到 $GOPATH 中的第一个工作区的 src 目录中,并安装。 备注1.17后,go get仅用来下载库和更新mod文件,并不会安装。 go get常用标记 go clean 命令是用来移除当前源码包里面编译生成的文件,这些文件包括 _obj/ 旧的object目录,由Makefiles遗留 _test/ 旧的test目录,由Makefiles遗留 _testmain.go 旧的gotest文件,由Makefiles遗留 test.out 旧的test记录,由Makefiles遗留 build.out 旧的test记录,由Makefiles遗留 *.[568ao] object文件,由Makefiles遗留 DIR(.exe) 由 go build 产生 DIR.test(.exe) 由 go test -c 产生 MAINFILE(.exe) 由 go build MAINFILE.go产生 go fmt 命令主要是用来帮你格式化所写好的代码文件。 go test 命令,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。默认的情况下,不需要任何的参数,它会自动把你源码包下面所有test文件测试完毕,当然你也可以带上参数,详情请参考go help testflag go doc 命令其实就是一个很强大的文档工具。 go fix 用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1 go version 查看go当前的版本 go env 查看当前go的环境变量 go list 列出当前全部安装的package 参考链接:https://zhuanlan.zhihu.com/p/62893405 |
CopyRight 2018-2019 实验室设备网 版权所有 |