使用Go Module构建项目

栏目: Ruby · 发布时间: 5年前

内容简介:Golang 配置不是这里要讨论的新话题。但是在Go 1.12发布之后,我认为必须重新定义步骤,因为项目设置变得比以前简单明了。在搜索配置步骤时,除了少数文章之外,大部分内容仍然是分享旧方式,即在1.11版本中,Go引入了名为

Golang 配置不是这里要讨论的新话题。但是在 Go 1.12发布之后,我认为必须重新定义步骤,因为项目设置变得比以前简单明了。

在搜索配置步骤时,除了少数文章之外,大部分内容仍然是分享旧方式,即

  • 设置GOPATH 环境变量
  • 在GOPATH中创建项目以解析自定义包路径。
  • 使用Go dep 或其他外部工具(如 glide )维护依赖性
  • 依赖包会安装在同一工作区中。

通过本文,我们将看到项目设置及其发布如何在Go 1.12版本中进行。

在1.11版本中,Go引入了名为 Go Modules 的内置包管理,它正在开始进行重大改变Go生态系统。它是GOPATH的替代品,集成了版本控制和软件包分发支持。

来自 Go博客

在我们使用GOPATH的八年中,创建了大量的工具,假设Go源代码存储在GOPATH中。

迁移到Go模块将是Go生态系统中影响最深远的变化,因为Go 1.将整个生态系统 - 代码,用户,工具等 - 从GOPATH转换为模块将需要在许多不同领域开展工作。

由于1.12版本的Go模块默认启用,GOPATH将在1.13版本中弃用。

对于那些开始使用Go 1.12的人来说,安装和设置将如下所示。

安装Go

在Mac上

brew install go

在Ubuntu上

curl -O https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
tar -xvf go1.9.3.linux-amd64.tar.gz
sudo mv go /usr/local

*从Go 1.8开始,将GOPATH设置为环境变量不是必需的。如果我们没有设置一个,Go使用默认的GOPATH为 $HOME/go

构建项目

让我们在GOPATH之外的首选位置为go项目创建文件夹

注意: Go模块在GOPATH中被禁用。所以我们不能在GOPATH位置内部创建项目 $HOME/go

mkdir goapp1
cd goapp1

初始化模块

使用Go模块初始化项目名称。

go mod init goapp1

这将创建模块配置文件 go.mod ,其中包含模块名称和版本。

使用Go Module构建项目

go.mod 文件定义Module的根,go命令将相应地与包一起使用,作为GOPATH的替代。

使用模块

Go模块主要解决以下用例,

  • 用于获取外部包的依赖关系管理。
  • 解析自定义包作为GOPATH的替代。
  • 包版本和发布

依赖管理

让我们使用jsoniter设置简单的json数据生成应用程序。

goapp.go

package main

import (
    "fmt"
    controllers "goapp1/handlers"

    jsoniter "github.com/json-iterator/go"
)

type AppInfo struct {
    Name string
}

func main() {
    info := AppInfo{
        Name: "GoApp",
    }
    jsonString, _ := jsoniter.Marshal(&info)

    fmt.Println(string(jsonString))

}

go.mod 配置的工作通常喜欢 gemfile 用Ruby, requirement.txt Python中或其他依赖管理工具,但不完全是。

构建go时,将根据go代码中的import语句获取最新版本的依赖项,并 go.mod 使用所需的依赖项更新配置。

go build

对于我们的示例, go build 将获取最新的jsoniter及其依赖项。

每次 go.mod 得更新, go build 命令创建一个名为的文件, go.sum 其中包含特定模块版本内容的预期加密校验和。

go.sum 不是锁 文件。它仅用于验证目的。有关详细信息,请参阅 这里 FAQ。

使用Go Module构建项目

image.png

欲了解更多依赖管理使用情况参见 这里

解决自定义包

让我们创建一个自定义包并验证它是否在没有GOPATH的情况下得到解决。我创建了一个名为的包 handlers

mkdir handlers

编写一个函数

package controllers

import "fmt"

func ShowInfo() {
    fmt.Println("controller modeule info")
}

使用main.go中的自定义包功能,

package main

import (
    "fmt"
    controllers "goapp1/handlers"

    jsoniter "github.com/json-iterator/go"
)

type AppInfo struct {
    Name string
}

func main() {
    info := AppInfo{
        Name: "GoApp",
    }
    jsonString, _ := jsoniter.Marshal(&info)

    fmt.Println(string(jsonString))
    controllers.ShowInfo()
}

现在 go build 解析没有GOPATH的自定义包。二进制文件将在指定的模块名称中创建 go.mod

让我们执行结果。

使用Go Module构建项目

image.png

总结

模块系统将帮助我们为Go生态系统提供更好的身份验证和构建速度。


以上所述就是小编给大家介绍的《使用Go Module构建项目》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

周鸿祎自述

周鸿祎自述

周鸿祎 / 中信出版社 / 2014-8 / 45.00元

在很多方面,周鸿祎都是互联网领域的颠覆者。他重新定义了“微创新”,提出从细微之处着手,通过聚焦战略,以持续的创新,最终改变市场格局、为客户创造全新价值。他第一个提出了互联网免费安全的理念,也由此让奇虎360拥有了超过4亿的用户。 在《周鸿祎自述:我的互联网方法论》中,周鸿祎首次讲述了自己的互联网观、产品观和管理思想,厘清了互联网产品的本质特征和互联网时代的新趋势,列举了颠覆式创新在现实中的实......一起来看看 《周鸿祎自述》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码