iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >go install命令的作用是什么
  • 140
分享到

go install命令的作用是什么

2023-07-05 01:07:30 140人浏览 八月长安
摘要

这篇文章主要介绍“Go install命令的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go install命令的作用是什么”文章能帮助大家解决问题。“go install”命令用于编译

这篇文章主要介绍“Go install命令的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go install命令的作用是什么”文章能帮助大家解决问题。

“go install”命令用于编译并安装指定的代码包及它们的依赖包;当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。“go install”命令会将编译的中间文件放在GOPATH的pkg目录下,以及固定地将编译结果放在GOPATH的bin目录下。

go install命令——编译并安装

go install命令用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与go build命令一样,传给go install命令的代码包参数应该以导入路径的形式提供。并且,go build命令的绝大多数标记也都可以用于go install命令。实际上,go install命令只比go build命令多做了一件事,即:安装编译后的结果文件到指定目录。

在对go install命令进行详细说明之前,让我们先回顾一下goc2p的目录结构。为了节省篇幅,我在这里隐藏了代码包中的源码文件。如下:

$HOME/golang/goc2p:    bin/    pkg/    src/        cnet/        logging/        helper/            ds/        pkgtool/

我们看到,goc2p项目中有三个子目录,分别是bin目录、pkg目录和src目录。现在只有src目录中包含了一些目录,而其他两个目录都是空的。

现在,我们来看看安装代码包的规则。

安装代码包

如果go install命令后跟的代码包中仅包含库源码文件,那么go install命令会把编译后的结果文件保存在源码文件所在工作区的pkg目录下。对于仅包含库源码文件的代码包来说,这个结果文件就是对应的代码包归档文件(也叫静态链接库文件,名称以.a结尾)。相比之下,我们在使用go build命令对仅包含库源码文件的代码包进行编译时,是不会在当前工作区的src目录以及pkg目录下产生任何结果文件的。结果文件会出于编译的目的被生成在临时目录中,但并不会使当前工作区目录产生任何变化。

如果我们在执行go install命令时不后跟任何代码包参数,那么命令将试图编译当前目录所对应的代码包。比如,我们现在要安装代码包pkgtool

hc@ubt:~/golang/goc2p/src/pkgtool$ go install -v -workWORK=D:\cygwin\tmp\go-build758586887pkgtool

我们在前面说过,执行go install命令后会对指定代码包先编译再安装。其中,编译代码包使用了与go build命令相同的程序。所以,执行go install命令后也会首先建立一个名称以go-build为前缀的临时目录。如果我们想强行重新安装指定代码包及其依赖包,那么就需要加入标记-a:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install -a -v -workWORK=/tmp/go-build014992994runtimeerrorssync/atomicunicodeunicode/utf8sortsynciOSyscallstringsbytesbufiotimeospath/filepathpkgtool

可以看到,代码包pkgtool仅仅依赖了Go语言标准库中的代码包。

现在我们再来查看一下goc2p项目目录:

$HOME/golang/goc2p:    bin/    pkg/        linux_386/            pkgtool.a    src/

现在pkg目录中多了一个子目录。读过0.0节的读者应该已经知道,linux_386被叫做平台相关目录。它的名字可以由${GOOS}_${GOARCH}来得到。其中,${GOOS}和${GOARCH}分别是当前操作系统中的环境变量GOOS和GOARCH的值。如果它们不存在,那么Go语言就会使用其内部的预定值。上述示例在计算架构为386且操作系统为Linux的计算机上运行。所以,这里的平台相关目录即为linux_386。我们还看到,在goc2p项目中的平台相关目录下存在一个文件,名称是pkgtool.a。这就是代码包pkgtool的归档文件,文件名称是由代码包名称与“.a”后缀组合而来的。

实际上,代码包的归档文件并不都会被直接保存在pkg目录的平台相关目录下,还可能被保存在这个平台相关目录的子目录下。 下面我们来安装cnet/ctcp包:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install -a -v -work ../cnet/ctcpWORK=/tmp/go-build083178213runtimeerrorssync/atomicunicodeunicode/utf8mathsyncsortiosyscallinternal/singleflightbytesstringsstrconvbufiomath/randtimereflectosfmtlogruntime/cgologgingnetcnet/ctcp

请注意,我们是在代码包pkgtool对应的目录下安装cnet/ctcp包的。我们使用了一个目录相对路径。

实际上,这种提供代码包位置的方式被叫做本地代码包路径方式,也是被所有Go命令接受的一种方式,这包括之前已经介绍过的go build命令。但是需要注意的是,本地代码包路径只能以目录相对路径的形式呈现,而不能使用目录绝对路径。请看下面的示例:

hc@ubt:~/golang/goc2p/src/cnet/ctcp$ go install -v -work ~/golang/goc2p/src/cnet/ctcpcan't load package: package /home/hc/golang/goc2p/src/cnet/ctcp: import "/home/hc/golang/goc2p/src/cnet/ctcp": cannot import absolute path

从上述示例中的命令提示信息我们可知,以目录绝对路径的形式提供代码包位置是不会被Go命令认可的。

这是由于Go认为本地代码包路径的表示只能以“./”或“../”开始,再或者直接为“.”或“..”,而代码包的代码导入路径又不允许以“/”开始。所以,这种用绝对路径表示代码包位置的方式也就不能被支持了。

上述规则适用于所有Go命令。读者可以自己尝试一下,比如在执行go build命令时分别以代码包导入路径、目录相对路径和目录绝对路径的形式提供代码包位置,并查看执行结果。

我们已经通过上面的示例强行的重新安装了cnet/ctcp包及其依赖包。现在我们再来看一下goc2p的项目目录:

$HOME/golang/goc2p:    bin/    pkg/        linux_386/            /cnet                ctcp.a            logging.a            pkgtool.a    src/

我们发现在pkg目录的平台相关目录下多了一个名为cnet的目录,而在这个目录下的就是名为ctcp.a的代码包归档文件。由此我们可知,代码包归档文件的存放目录的相对路径(相对于当前工作区的pkg目录的平台相关目录)即为代码包导入路径除去最后一个元素后的路径。而代码包归档文件的名称即为代码包导入路径中的最后一个元素再加“.a”后缀。再举一个例子,如果代码包导入路径为x/y/z,则它的归档文件存放路径的相对路径即为x/y/,而这个归档文件的名称即为z.a。

回顾代码包pkgtool的归档文件的存放路径。因为它的导入路径中只有一个元素,所以其归档文件就被直接存放到了goc2p项目的pkg目录的平台相关目录下了。

此外,我们还发现pkg目录的平台相关目录下还有一个名为logging.a的文件。很显然,我们并没有显式的安装代码包logging。这是因为go install命令在安装指定的代码包之前,会先去安装指定代码包的依赖包。当依赖包被正确安装后,指定的代码包的安装才会开始。由于代码包cnet/ctcp依赖于goc2p项目(即当前工作区)中的代码包logging,所以当代码包logging被成功安装之后,代码包cnet/ctcp才会被安装。

还有一个问题:上述的安装过程涉及到了那么多代码包,那为什么goc2p项目的pkg目录中只包含该项目中代码包的归档文件呢?实际上,go install命令会把标准库中的代码包的归档文件存放到Go语言安装目录的pkg子目录中,而把指定代码包依赖的第三方项目的代码包的归档文件存放到当前工作区的pkg目录下。这样就实现了Go语言标准库代码包的归档文件与用户代码包的归档文件,以及处在不同工作区的用户代码包的归档文件之间的分离。

安装命令源码文件

除了安装代码包之外,go install命令还可以安装命令源码文件。为了看到安装命令源码文件是goc2p项目目录的变化,我们先把该目录还原到原始状态,即清除bin子目录和pkg子目录下的所有目录和文件。然后,我们来安装代码包helper/ds下的命令源码文件showds.go,如下:

hc@ubt:~/golang/goc2p/src$ go install helper/ds/showds.gogo install: no install location for .go files listed on command line (GOBIN not set)

这次我们没能成功安装。该Go命令认为目录/home/hc/golang/goc2p/src/helper/ds不在环境GOPATH中。我们可以通过Linux的echo命令来查看一下环境变量GOPATH的值:

hc@ubt:~/golang/goc2p/src$ echo $GOPATH/home/hc/golang/lib:/home/hc/golang/goc2p

环境变量GOPATH的值中确实包含了goc2p项目的根目录。这到底是怎么回事呢?

我通过查看Go命令的源码文件找到了其根本原因。在上一小节我们提到过,在环境变量GOPATH中包含多个工作区目录路径时,我们需要在编译命令源码文件前先对环境变量GOBIN进行设置。实际上,这个环境变量所指的目录路径就是命令程序生成的结果文件的存放目录。go install命令会把相应的可执行文件放置到这个目录中。

由于命令go build在编译库源码文件后不会产生任何结果文件,所以自然也不用会在意结果文件的存放目录。在该命令编译单一的命令源码文件或者包含一个命令源码文件和多个库源码文件时,在结果文件存放目录无效的情况下会将结果文件(也就是可执行文件)存放到执行该命令时所在的目录下。因此,即使环境变量GOBIN的值无效,我们在执行go build命令时也不会见到这个错误提示信息。

然而,go install命令中一个很重要的步骤就是将结果文件(归档文件或者可执行文件)存放到相应的目录中。所以,go install命令在安装命令源码文件时,如果环境变量GOBIN的值无效,则它会在最后检查结果文件存放目录的时候发现这一问题,并打印与上述示例所示内容类似的错误提示信息,最后直接退出。

这个错误提示信息在我们安装多个库源码文件时也有可能遇到。示例如下:

hc@ubt:~/golang/goc2p/src/pkgtool$ go install envir.go fpath.go ipath.go pnode.go util.gogo install: no install location for .go files listed on command line (GOBIN not set)

而且,在我们为环境变量GOBIN设置了正确的值之后,这个错误提示信息仍然会出现。这是因为,只有在安装命令源码文件的时候,命令程序才会将环境变量GOBIN的值作为结果文件的存放目录。而在安装库源码文件时,在命令程序内部的代表结果文件存放目录路径的那个变量不会被赋值。最后,命令程序会发现它依然是个无效的空值。所以,命令程序会同样返回一个关于“无安装位置”的错误。这就引出一个结论,我们只能使用安装代码包的方式来安装库源码文件,而不能在go install命令罗列并安装它们。另外,go install命令目前无法接受标记-o以自定义结果文件的存放位置。这也从侧面说明了go install命令不支持针对库源码文件的安装操作。

关于“go install命令的作用是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: go install命令的作用是什么

本文链接: https://www.lsjlt.com/news/348857.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go install命令的作用是什么
    这篇文章主要介绍“go install命令的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go install命令的作用是什么”文章能帮助大家解决问题。“go install”命令用于编译...
    99+
    2023-07-05
  • go install命令有什么用
    “go install”命令用于编译并安装指定的代码包及它们的依赖包;当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。“go install”命令会将编译的中间文件放在GOPATH的pkg目录下,以及固定地将编译结果放在...
    99+
    2023-05-14
    go语言 Golang
  • Go语言中go install命令怎么用
    小编给大家分享一下Go语言中go install命令怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go install编译并安装代码包,对于库,会生成目标库...
    99+
    2023-06-25
  • go get命令的作用是什么
    今天小编给大家分享一下go get命令的作用是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。“go get”命令可以借助...
    99+
    2023-07-05
  • Linux install命令有什么用
    这篇文章主要介绍“Linux install命令有什么用”,在日常操作中,相信很多人在Linux install命令有什么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux install命令有什么用...
    99+
    2023-06-28
  • Linux中install命令和cp命令的区别是什么
    这篇文章给大家介绍Linux中install命令和cp命令的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。它们之间的区别主要如下:最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件,而insta...
    99+
    2023-06-12
  • Linux中的Install命令有什么用
    这篇文章主要为大家展示了“Linux中的Install命令有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中的Install命令有什么用”这篇文章吧。install命令的作用是安...
    99+
    2023-06-09
  • go test命令有什么作用
    这篇文章主要介绍“go test命令有什么作用”,在日常操作中,相信很多人在go test命令有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go test命令有什么作用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • netstat命令的作用是什么
    今天小编给大家分享一下netstat命令的作用是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-02-21
    netstat
  • pathping命令的作用是什么
    pathping命令是Windows操作系统中的一个网络诊断工具,用于检测和分析网络连接中的延迟和丢包情况。它结合了tracerou...
    99+
    2023-09-20
    pathping
  • tracert命令的作用是什么
    tracert命令是一个网络诊断工具,用于追踪数据包从源地址到目标地址经过的路径。它通过发送一系列的数据包,每个数据包在网络上经过一...
    99+
    2023-08-25
    tracert
  • go fmt命令有什么用
    本篇内容介绍了“go fmt命令有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在go语言中,“go fmt”命令主要是用来帮开发者格...
    99+
    2023-07-05
  • go get命令有什么用
    “go get”命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。“go get”命令可以动态获取远程代码包,在使用“go get”命令前,需要安装与远程包匹配的代码管理工具,如Git、SVN、HG等,参数中...
    99+
    2023-05-14
    Golang go语言
  • SQL命令DECLARE的作用是什么
    SQL命令DECLARE的作用是声明一个游标变量或变量。游标变量用于存储查询结果集,并且可以通过游标的操作来访问和处理结果集中的数据...
    99+
    2023-09-29
    SQL
  • linux man命令的作用是什么
    这篇“linux man命令的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“li...
    99+
    2023-04-20
    linux man
  • linux locate命令的作用是什么
    这篇“linux locate命令的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-02-10
    linux locate
  • linux命令mkdir的作用是什么
    今天小编给大家分享一下linux命令mkdir的作用是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2023-03-13
    linux mkdir
  • Linux chattr命令的作用是什么
    本篇内容介绍了“Linux chattr命令的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!常见命令参数A:即Atime,告诉系统...
    99+
    2023-06-15
  • Linux命令pstree的作用是什么
    这篇文章主要讲解了“Linux命令pstree的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux命令pstree的作用是什么”吧!命令简介pstree 命令以树状图的方式展...
    99+
    2023-06-15
  • linux命令echo的作用是什么
    Linux命令echo用于在终端输出一行文本。它的基本语法是:echo [选项] [字符串]一般情况下,echo命令会原样输出字符串...
    99+
    2023-08-30
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作