GO问答之为什么项目要在 GOPATH/src 目录下

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

内容简介:beego的bee工具为什么强制新建项目在GOPATH/src目录下?每次升级bee工具都要先改其源码使之可以在任意目录内生成项目。实在不喜欢把第三方库和自己的所有项目放在一个目录下,太乱了。顺便问一下go为什么建议把所有项目源码都放在gopath/src目录内?为什么?

beego的bee工具为什么强制新建项目在GOPATH/src目录下?

每次升级bee工具都要先改其源码使之可以在任意目录内生成项目。实在不喜欢把第三方库和自己的所有项目放在一个目录下,太乱了。顺便问一下 go 为什么建议把所有项目源码都放在gopath/src目录内?

回答

为什么?

因为 GO 的包搜索是从 GOPATH 和 GOROOT 路径下搜索,源码必须要放在 GOROOT 或 GOPATH 的 src 目录下才能找到。但把源码和包放在一起,对于很多人来说确实不太很习惯,有一种做法,通过在 GOPATH 中设置两个路径,go get 下载的包默认放在 GOPATH 设置的第一个路径下。比如,GOPATH 设置如下:

export GOPATH=/Users/polo/go/:/Users/polo/Work/go
复制代码

如此就可以把工作区设在 /Users/polo/Work/go/src,而安装包放在 /Users/polo/go/src。

其实我觉得,直接放在一起也挺好的,看源码的时候还方便点。

除此之外,GO 其实也提供了一些包依赖管理工具,但都并非 GO 自带。简单举几个例子,如下:

  • dep
  • vgo
  • godep

等等。

我在网上找了一篇2017年的文章,描述了 GO 包管理 工具 的一些历史和当时的情况, Go包管理的前世今生 - InfoQ

现在2019年了,GO 1.11 之后,已经内置了 go mod 实现包管理。下面来简单体验下它的用法。

在任意目录下新建 main.go 文件,不必是 GOPATH 指定的目录:

package main

import (
	"fmt"
	"log"

	"github.com/levigross/grequests"
)

func main() {

	resp, err := grequests.Get("http://httpbin.org/get", nil)
	// You can modify the request by passing an optional RequestOptions struct

	if err != nil {
		log.Fatalln("Unable to make request: ", err)
	}

	fmt.Println(resp.String())
}
复制代码

其中用到了一个方便发送 HTTP 请求的第三方包 grequest,通过它发出 GET 请求来访问http://httpbin.org/get。

执行如下命令初始化 httpreq 模块

$ go mod init httpreq
复制代码

如果没有网络问题,接下来直接执行 go build 就可以编译成功了。

但这里依赖了很多 go 的系统包,需要从golang.org下载,go build 会失败。可以使用 go mod 的replace功能,用 github 替换 golang org,实现从 github下载。replace 的具体使用先不介绍了。

直接贴一份可用的 go.mod 文件,内容如下:

module httpreq

require (
	github.com/google/go-querystring v1.0.0 // indirect
	github.com/levigross/grequests v0.0.0-20190130132859-37c80f76a0da
	golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
	golang.org/x/net v0.0.0-20190522155817-f3200d17e092
	golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
	golang.org/x/text v0.3.0
)

replace golang.org/x/net v0.0.0-20190522155817-f3200d17e092 => github.com/golang/net v0.0.0-20190522155817-f3200d17e092

replace golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 => github.com/golang/crypto v0.0.0-20190308221718-c2843e01d9a2

replace golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0

replace golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a => github.com/golang/sys v0.0.0-20190215142949-d0b11bdaac8a
复制代码

替换掉你的 go.mod 的文件,直接执行 go build 便可以编译成功,目录下回生成一个可执行文件 httpreq。

关于 go mod 推荐几篇文章。地址如下:

官方wiki文档 ,最近更新十几天前,

go module 的 step by step ,国外某大仙写了一篇由浅入深的文章。翻译,在国内的 studygolang 已经有了。

这位大仙后来又写了一篇介绍GOPROXY 的文章。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

图论导引

图论导引

[美] Douglas B.West / 机械工业出版社 / 2004-10 / 59.00元

图论在计算科学、社会科学和自然科学等各个领域都有广泛应用。本书是本科生或研究生一学期或两学期的图论课程教材。全书力求保持按证明的难度和算法的复杂性循序渐进的风格,使学生能够深入理解书中的内容。书中包括对证明技巧的讨论、1200多道习题、400多幅插图以及许多例题,而且对所有定理都给出了详细完整的证明。虽然本书包括许多算法和应用,但是重点在于理解图论结构和分析图论问题的技巧。一起来看看 《图论导引》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器