1

Go 包管理 Package

 2 years ago
source link: https://wnanbei.github.io/post/go-%E5%8C%85%E7%AE%A1%E7%90%86-package/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Go 使用包结构 package 来定义模块、组织代码。

在 Go 语言中,包中的标识符(函数、变量、常量、struct 等),都遵守一个 Go 强制的命名规则:

  • 小写开头的变量不可以被导入到包外使用,为包内私有变量。

  • 大写开头的变量可以被导入到包外使用,为共有变量。

Go 通过这种语言层面上的命名方式来决定外部能访问包内的哪些内容。

而在同一个包内,在使用 import 导入包之后定义或声明的变量、常量、类型,这些对象的作用域在本包范围内都是全局的。

import

import "fmt"
import "os"
import (
   "fmt"
   "os"
)
  • 如果包名不是以 ./ 开头,如 "fmt" 或者 "container/list",则 Go 会在全局文件进行查找。
  • 如果包名以 / 开头(在 Windows 下也可以这样使用),则会在系统的绝对路径中查找。
  • modules 模式下,导入包的路径不再支持相对路径,只支持项目名开头的绝对路径。
import io "fmt" 
import (
    io "fmt"
)

导入而不使用

在 Go 语言中,导入了一个包之后,必须要使用它,不然就会在编译的时候报错,但我们有时候又需要这么做,那么我们可以在导入时使用空白标识符。

这样的话,这个包就只会执行初始化 init 的内容。

import (
    _ "geometry/rectangle" 
)

go run

go run 会编译相应的有 main 执行入口的文件,并且执行编译之后的可执行文件。

go run 只能执行一个或多个文件,不能执行包。

go build

此命令用来编译我们的指定代码源文件或者包,以及它们的依赖包。

  • build 只编译有 main 包执行入口的包和文件,才会生成相应执行文件。

  • 如果只使用一个go build,那么它会默认编译当前目录所对应的包。

参数 参数描述
-o 指定输出文件的名称
-i 安装那些编译目标依赖的且还未被安装的代码包
-a 强行对所有涉及到的代码包(包含标准库中的代码包)重新构建,即使它们已经是最新的了。
-n 打印编译期间所用到的其它命令,但是并不真正执行它们。
-p n 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在 darwin/arm 平台(即iPhone和iPad所用的平台)下,该数量默认是 1
-race 开启竞态条件的检测。不过此标记目前仅在 linux/amd64freebsd/amd64darwin/amd64windows/amd64 平台下受到支持。
-v 打印出那些被编译的代码包的名字。
-work 打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。
-x 打印编译期间所用到的其它命令。注意它与-n 标记的区别。

go install

go installgo build 命令大致相同,与 build 主要有两点区别:

  1. 生成的可执行文件会自动放到工作空间的 bin 目录下。
  2. 编译那些没有 main 包执行入口的包时,会生成相应的 .a 文件,并放到工作空间的 pkg 目录下。没有可执行 main 包的文件,也被称为库源码文件。

go build 能用的标签,go install 基本都能用。

go get

go get 命令可以接受所有可用于 go build 命令和 go install 命令的标记。这是因为 go get 命令的内部步骤中完全包含了编译和安装这两个动作。

另外,go get 命令还有一些特有的参数,如下表所示:

参数名称 参数描述
-d 让命令程序只执行下载动作,而不执行安装动作。
-f 仅在使用 -u 标记时才有效。该标记会让命令程序忽略掉对已下载代码包的导入路径的检查。如果下载并安装的代码包所属的项目是你从别人那里Fork过来的,那么这样做就尤为重要了。
-fix 让命令程序在下载代码包后先执行修正动作,而后再进行编译和安装。
-insecure 允许命令程序使用非安全的 scheme(如HTTP)去下载指定的代码包。如果你用的代码仓库(如公司内部的Gitlab)没有 HTTPS 支持,可以添加此标记。请在确定安全的情况下使用它。
-t 让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。
-u 让命令利用网络来更新已有代码包及其依赖包。默认情况下,该命令只会从网络上下载本地不存在的代码包,而不会更新已有的代码包。

Go Mod

初始化包管理,生成 go.mod 文件:

go mod init yourProjectName

modules 模式下,导入包的路径不再支持相对路径,只支持项目名开头的绝对路径。

go mod 命令下有以下子命令

命令 说明
go mod download 下载modules依赖的包
go mod edit 编辑go.mod文件
go mod graph 打印模块的依赖图
go mod init 在当前目录下初始化modules
go mod tidy 整理modules的依赖项,下载缺少的,删除不需要的
go mod verify 验证依赖是否正确
go mod why 解释为什么需要依赖
go mod vendor 将依赖项复制到vender目录下

可以使用命令 go list -m -u all 来检查可以升级的package。

使用go get -u need-upgrade-package 升级后会将新的依赖版本更新到 go.mod。

也可以使用 go get -u 升级所有依赖。

GOPROXY

国内用于下载包的代理:

  • http://goproxy.io
  • http://goproxy.cn

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK