go build、go install、go get命令详解
(内容凌乱,日后整理!)
原文链接:https://blog.csdn.net/zhangliangzi/article/details/77914943
GO下载:
GO语言中文网下载:https://studygolang.com/dl
Mac下直接通过brew instatll go指令即可完成下载安装
GO环境变量配置:
$GOROOT=/usr/local/go GO安装目录
$GOPATH=/usr/local/var/www/go GO工作目录
$GOBIN=$GOPATH/bin GO可执行文件目录
$PATH=$PATH:$GOBIN:$GOROOT/bin 将GO可执行文件加入PATH中,使GO指令与我们编写的GO应用可以全局调用
$GOPATH工作目录结构,约定有三个子目录(需要自行创建):
src ——存放源代码文件
pkg——存放编译后的文件
bin ——存放编译后的可执行文件
示例(首先使用go推荐的go build方式构建应用,稍后会说到其他的方式):
通过我们的操作,在最终测试成功后,$GOPATH的目录树应该如下所示:
具体操作如下:
1、创建应用包mypkg:切到【$GOPATH/src】目录下,创建一个mypkg目录,在mypkg目录下,新建一个hello.go,内容如下:
2、编译应用包(在此Demo中,此步骤并不必要,在此只是为了展示go install编译效果):在刚刚的目录下执行【go install】指令或者在任意目录下执行【go install mypkg】指令,如果代码有错或依赖找不到会报错,如果正确则没有任何提示。此时,你可以切到【$GOPATH/pkg】目录下,会发现多了一个名为【$GOOS_$GOARCH】的目录,切进该目录,就会看到刚刚编译生成的文件mypkg.a文件。(其中$GOOS与$GOARCH的具体值可以通过【go env】指令查询,更多详情可参看:http://wiki.jikexueyuan.com/project/go-command-tutorial/0.14.html)
3、创建新应用包myapp,创建新文件main.go(同步骤1),import引入mypkg包,内容如下:
4、构建可执行文件:在myapp目录下,使用【go build】指令,会在当前目录下生成一个myapp的可执行文件,这个可执行文件不依赖其他文件,复制到任何目录下都可通过【./myapp】执行,复制到任何$PATH配置的目录中都可通过【myapp】全局执行。
总结:我们在这个Demo里主要用到了两个GO指令,【go install】与【go build】,他们的区别如下:
【go build】指令的作用是:在当前目录下编译生成可执行文件。注意,go build指令会调用所有引用包的源码,重新编译,而不是直接使用pkg里的编译后文件,如果在【$GOROOT】与【$GOPATH】下没有找到import引入包的项目源码,就会报错。在本demo里main.go中import引入了"mypkg"包,如果我删除【$GOPATH/src/mypkg】源码,执行【go build】指令,会报错如下:
【go install】指令的作用是:编译源代码,如果为可执行文件(package "main"且包含main方法),则会编译生成可执行文件到【$GOPATH/bin】目录下;可执行文件import引入的其他包,就会被编译到【$GOPATH/pkg/$GOOS_$GOARCH】目录下。
(关于go的导入和编译,如果有不清楚的,可以看下这篇博客https://studygolang.com/articles/3189)
我们会发现:【go install】也可以完成类似【go build】的功能,区别在于【go install】会生成二进制文件到【$GOPATH/pkg/$GOOS_$GOARCH】目录下(这个二进制文件对于我们并没什么意义),但【go install】会把可执行文件自动生成到【$GOBIN】目录下,这是在一开始被配置到【$PATH】中了,这样就可以使项目可执行文件能被方便的全局调用。
如果在本Demo中,使用【go install】构建可执行文件:
我们编写好源代码文件时,目录树如下:
切到myapp目录下,执行【go install】指令,会生成如下结构目录树:
此时就可以通过【myapp】全局执行了!
go get 可以暂时理解为git clone到 $GOPATH/src + go install
go build、go install、go get命令详解的更多相关文章
- build/envsetup.sh 生成的命令详解表
参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...
- [转载]Linux 命令详解:./configure、make、make install 命令
[转载]Linux 命令详解:./configure.make.make install 命令 来源:https://www.cnblogs.com/tinywan/p/7230039.html 这些 ...
- CentOS下rpm命令详解
CentOS下rpm命令详解 rpm,Redhat Package Manager,即为红帽公司为RHEL开发的专用包管理器,后来更改为RPM Package Manager,类似于GNU项目,使用递 ...
- Dockerfile命令详解
使用docker就会避免不了的要做各种镜像,就会用到dockerfile,记录一下dockerfile的主要命令 1.主要组成部分 dockerfile执行build命令时,是从上倒下依次执行 ...
- apt-get build-dep命令详解
apt-get build-dep命令详解 - 星星之火的Blog - CSDN博客 https://blog.csdn.net/starflame/article/details/7416311 ...
- Dockerfile 命令详解及最佳实践
Dockerfile 命令详解 FROM 指定基础镜像(必选) 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指 ...
- Git的使用以及常用命令(详解)
一. 版本控制工具 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版 本修订情况的系统.版本控制系统不仅可以应用 ...
- linux yum命令详解
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...
- Docker命令详解
Docker命令详解 最近学习Docker,将docker所有命令实验了一番,特整理如下: # docker --help Usage: docker [OPTIONS] COMMAND [arg ...
- android adb 命令详解
ADB (Android Debug Bridge) 是android SDK中的工具,需要先配置环境变量才能使用.起调试桥的作用,可以管理安卓设备.(也叫debug工具) ---------查看设 ...
随机推荐
- vue 把后端返回的图片和url链接生成的二维码用canvas 合成一张图片
H5 页面在做某个活动的时候,有两种分享方式,一种是链接分享,一种是图片分享. 链接分享的话,如果是在微信里,就可引导用户利用微信浏览器自带的分享,根据sdk设置分享标题简介链接缩略图即可. 图片分享 ...
- LOJ6609 无意识的石子堆【加强版】【容斥原理,计数】
题目描述:在一个\(n\times m\)的网格中,放\(2n\)个棋子,使每一行和每一列都不超过两个棋子.求方案数\(\mathrm{mod} \ 943718401\). 数据范围:\(n\le ...
- C Primer Plus--结构和其他数据类型(2)
目录 枚举类型 enumerated type 枚举默认值 为枚举指定值 命名空间 namespace typedef关键字 * () []修饰符 typedef与这三个运算符结合 函数与指针 函数指 ...
- 打印出js对象里面的内容
最近调试的时候遇到需要打印出js对象里面的内容,两种方式: 1.直接使用 JSON.stringify(obj) 方法把对象转成字符串,打印出来.但是因为维护的项目比较老,使用的还是ie11的ie5兼 ...
- mint-ui里面的MessageBox怎么去判断确认还是取消
MessageBox.confirm('', { title: '请注意', message: '添加供应商前,请先搜索该供应商是否存在,请勿重复添加', showCancelButton: true ...
- GIT 使用记录,新手->会用(mac 用户)
(唔,mac 用户这个要求是因为集成在 terminal 中可直接使用) 1. github 中 创建 git 账户 2. github -> 在个人设置中 找到 ssh and GPGkey ...
- Java 自定义异常
新建类CustomException继承 Exception /** * Create by on 2019-07-30 * 自定义类需要继承Exception * @author lsw */ pu ...
- C#中将xml文件反序列化为实例时采用基类还是派生类的问题
基类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- t4模版快速入门
语法 主要包括指令.文本块.控制块. 1.指令 指令主要包括template, output, assembly, import, include等类型,用以告诉T4引擎如何编译和运行一个模板.这些指 ...
- 品优购商城项目(五)消息中间件 ActiveMQ
消息中间件用于降低各个项目模块的耦合,适用于不需要等待返回消息才能进入下一个业务环节的模块,以及实时要求性不高的业务模块. 一.JMS JMS(Java Messaging Service)是Java ...