go语言sum文件 go语言代码文件后缀

使用Go Module构建项目 Golang 配置不是这里要讨论的新话题 。但是在Go 1.12发布之后go语言sum文件,我认为必须重新定义步骤,因为项目设置变得比以前简单明了 。
在搜索配置步骤时,除了少数文章之外,大部分内容仍然是分享旧方式,即
通过本文 , 我们将看到项目设置及其发布如何在Go 1.12版本中进行 。
在1.11版本中,Go引入了名为Go Modules的内置包管理,它正在开始进行重大改变Go生态系统 。它是GOPATH的替代品,集成了版本控制和软件包分发支持 。
来自Go博客,
由于1.12版本的Go模块默认启用,GOPATH将在1.13版本中弃用 。
对于那些开始使用Go 1.12的人来说 , 安装和设置将如下所示 。
安装Go
在Mac上
在Ubuntu上
*从Go 1.8开始 , 将GOPATH设置为环境变量不是必需的 。如果我们没有设置一个,Go使用默认的GOPATH为 $HOME/go
构建项目
让我们在GOPATH之外的首选位置为go项目创建文件夹
初始化模块
使用Go模块初始化项目名称 。
这将创建模块配置文件go.mod , 其中包含模块名称和版本 。
此go.mod文件定义Module的根,go命令将相应地与包一起使用,作为GOPATH的替代 。
使用模块
Go模块主要解决以下用例,
依赖管理
让我们使用jsoniter设置简单的json数据生成应用程序 。
该go.mod配置的工作通常喜欢gemfile用Ruby,requirement.txtPython中或其go语言sum文件他依赖管理工具 , 但不完全是 。
【go语言sum文件 go语言代码文件后缀】 构建go时,将根据go代码中的import语句获取最新版本的依赖项,并go.mod使用所需的依赖项更新配置 。
对于我们的示例,go build将获取最新的jsoniter及其依赖项 。
每次go.mod得更新,go build命令创建一个名为的文件,go.sum其中包含特定模块版本内容的预期加密校验和 。
go.sum 不是锁 文件 。它仅用于验证目的 。有关详细信息 , 请参阅这里 FAQ 。
解决自定义包
让我们创建一个自定义包并验证它是否在没有GOPATH的情况下得到解决 。我创建了一个名为的包handlers
编写一个函数
使用main.go中的自定义包功能,
现在go build解析没有GOPATH的自定义包 。二进制文件将在指定的模块名称中创建go.mod。
让我们执行结果 。
总结
模块系统将帮助我们为Go生态系统提供更好的身份验证和构建速度 。
go.sum工作机制为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本 , 在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地 , 以便下次构建 。考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建 。
为了解决Go module的这一安全隐患 , Go开发团队在引入go.mod的同时也引入了go.sum文件 , 用于记录每个依赖包的哈希值 , 在构建时 , 如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建 。
go.sum文件记录
go.sum文件中每行记录由module名、版本和哈希组成,并由空格分开:
比如,某个go.sum文件中记录了github.com/google/uuid 这个依赖包的v1.1.2版本的哈希值:
正常情况下,每个依赖包版本会包含两条记录,第一条记录为该依赖包版本整体(所有文件)的哈希值 , 第二条记录表示该依赖包版本中go.mod文件的哈希值,如果该依赖包版本没有go.mod文件,则只有第一条记录 。如上面的例子中,v1.1.2表示该依赖包版本整体 , 而v1.1.2/go.mod表示该依赖包版本中go.mod文件 。
依赖包版本中任何一个文件(包括go.mod)改动,都会改变其整体哈希值,此处再额外记录依赖包版本的go.mod文件主要用于计算依赖树时不必下载完整的依赖包版本,只根据go.mod即可计算依赖树 。
每条记录中的哈希值前均有一个表示哈希算法的h1:,表示后面的哈希值是由算法SHA-256计算出来的
go.sum文件中记录的依赖包版本数量往往比go.mod文件中要多,这是因为二者记录的粒度不同导致的 。go.mod只需要记录直接依赖的依赖包版本,只在依赖包版本不包含go.mod文件时候才会记录间接依赖包版本,而go.sum则是要记录构建用到的所有依赖包版本 。
生成
当我们在GOMODULE模式下引入一个新的依赖时,通常会使用go get命令获取该依赖,比如:
go get命令首先会将该依赖包下载到本地缓存目录$GOPATH/pkg/mod/cache/download,该依赖包为一个后缀为.zip的压缩包,如v1.0.0.zip 。go get下载完成后会对该.zip包做哈希运算,并将结果存放在后缀为.ziphash的文件中,如v1.0.0.ziphash 。如果在项目的根目录中执行go get命令的话,go get会同步更新go.mod和go.sum文件,go.mod中记录的是依赖名及其版本 , 如:
go.sum文件中则会记录依赖包的哈希值(同时还有依赖包中go.mod的哈希值) , 如:
在更新go.sum之前,为了确保下载的依赖包是真实可靠的,go命令在下载完依赖包后还会查询GOSUMDB环境变量所指示的服务器 , 以得到一个权威的依赖包版本哈希值 。如果go命令计算出的依赖包版本哈希值与GOSUMDB服务器给出的哈希值不一致,go命令将拒绝向下执行 , 也不会更新go.sum文件 。
go.sum存在的意义在于,希望别人或者在别的环境中构建当前项目时所使用依赖包跟go.sum中记录的是完全一致的,从而达到一致构建的目的 。
校验
假设我们拿到某项目的源代码并尝试在本地构建,go命令会从本地缓存中查找所有go.mod中记录的依赖包,并计算本地依赖包的哈希值,然后与go.sum中的记录进行对比,即检测本地缓存中使用的依赖包版本是否满足项目go.sum文件的期望 。
如果校验失败 , 说明本地缓存目录中依赖包版本的哈希值和项目中go.sum中记录的哈希值不一致 , go命令将拒绝构建 。这就是go.sum存在的意义,即如果不使用期望的版本,就不能构建 。
校验和数据库
环境变量GOSUMDB标识一个checksum database,即校验和数据库 , 实际上是一个web服务器,该服务器提供查询依赖包版本哈希值的服务 。
该数据库中记录了很多依赖包版本的哈希值,比如Google官方的sum.golang.org则记录了所有的可公开获得的依赖包版本 。除了使用官方的数据库 , 还可以指定自行搭建的数据库,甚至干脆禁用它(export GOSUMDB=off) 。
如果系统配置了GOSUMDB,在依赖包版本被写入go.sum之前会向该数据库查询该依赖包版本的哈希值进行二次校验,校验无误后再写入go.sum 。
如果系统禁用了GOSUMDB,在依赖包版本被写入go.sum之前则不会进行二次校验,go命令会相信所有下载到的依赖包,并把其哈希值记录到go.sum中 。
Go语言文件操作本文主要介绍了Go语言中文件读写的相关操作 。
文件是什么?
计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件 。
os.Open() 函数能够打开一个文件 , 返回一个 *File 和一个 err。对得到的文件实例调用 close() 方法能够关闭文件 。
为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句 。
Read方法定义如下:
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和 io.EOF。举个例子:
使用for循环读取文件中的所有数据 。
bufio是在file的基础上封装了一层API , 支持更多的功能 。
io/ioutil 包的 ReadFile 方法能够读取完整的文件,只需要将文件名作为参数传入 。
os.OpenFile() 函数能够以指定模式打开文件,从而实现文件写入相关功能 。
其中:
name :要打开的文件名flag :打开文件的模式 。模式有以下几种:
perm :文件权限,一个八进制数 。r(读)04,w(写)02,x(执行)01 。
GO语言(二十五):管理依赖项(上)-当您的代码使用外部包时,这些包(作为模块分发)成为依赖项 。随着时间的推移,您可能需要升级或更换它们 。Go 提供了依赖管理工具,可帮助您在合并外部依赖项时确保 Go 应用程序的安全 。
本主题介绍如何执行任务以管理您在代码中承担的依赖项 。您可以使用 Go 工具执行其中的大部分操作 。本主题还介绍了如何执行其他一些您可能会觉得有用的依赖相关任务 。
您可以通过 Go 工具获取和使用有用的包 。在 pkg.go.dev 上 , 您可以搜索您可能觉得有用的包,然后使用go命令将这些包导入您自己的代码中以调用它们的功能 。
下面列出了最常见的依赖项管理步骤 。
在 Go 中,您将依赖项作为包含您导入的包的模块来管理 。此过程由以下机构支持:
您可以搜索pkg.go.dev以查找具有您可能觉得有用的功能的软件包 。
找到要在代码中使用的包后,在页面顶部找到包路径,然后单击复制路径按钮将路径复制到剪贴板 。在您自己的代码中,将路径粘贴到导入语句中,如下例所示:
在您的代码导入包后,启用依赖项跟踪并获取包的代码进行编译 。
要跟踪和管理您添加的依赖项 , 您首先要将代码放入其自己的模块中 。这会在源代码树的根目录创建一个 go.mod 文件 。您添加的依赖项将列在该文件中 。
要将您的代码添加到它自己的模块中,请使用 go mod init命令 。例如 , 从命令行切换到代码的根目录,然后按照以下示例运行命令:
该go mod init命令的参数是您的模块的模块路径 。如果可能,模块路径应该是源代码的存储库位置 。
如果一开始您不知道模块的最终存储库位置,请使用安全的替代品 。这可能是您拥有的域的名称或您控制的另一个名称(例如您的公司名称) , 以及来自模块名称或源目录的路径 。
当您使用 Go 工具管理依赖项时,这些工具会更新 go.mod 文件,以便它维护您的依赖项的当前列表 。
添加依赖项时,Go 工具还会创建一个 go.sum 文件,其中包含您所依赖的模块的校验和 。Go 使用它来验证下载的模块文件的完整性 , 特别是对于在您的项目上工作的其他开发人员 。
在代码中包含存储库中的 go.mod 和 go.sum 文件 。
当您运行go mod init创建用于跟踪依赖项的模块时,您指定一个模块路径作为模块的名称 。模块路径成为模块中包的导入路径前缀 。一定要指定一个不会与其他模块的模块路径冲突的模块路径 。
至少,一个模块路径只需要表明它的来源 , 例如公司或作者或所有者名称 。但是路径也可能更能描述模块是什么或做什么 。
模块路径通常采用以下形式:
1、Go 工具可以在其中找到模块源代码的存储库的位置 。
例如,它可能是github.com/ /.
如果您认为您可能会发布模块供其他人使用 , 请使用此最佳实践 。
2、一个你控制的名字 。
如果您不使用存储库名称,请务必选择一个您确信不会被其他人使用的前缀 。一个不错的选择是您公司的名称 。避免使用常用术语,例如widgets、utilities或 app 。
Go 保证以下字符串不会在包名称中使用 。
1、test– 您可以将test用作模块路径前缀以便代码用于在另一个模块中本地测试功能进行测试 。
使用test作为模块路径前缀是测试的一部分 。例如,您的测试本身可能会运行go mod init test,然后以某种特定方式设置该模块 , 以便使用 Go 源代码分析工具进行测试 。
2、example– 在某些 Go 文档中用作模块路径前缀,例如在创建模块以跟踪依赖关系的教程中 。
请注意 , Go 文档还用于example.com说明示例何时可能是已发布的模块 。
go语言sum文件的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言代码文件后缀、go语言sum文件的信息别忘了在本站进行查找喔 。

    推荐阅读