前后端vue+gorm项目管理|青训营笔记

108 阅读3分钟

前后端vue+gorm项目管理|青训营笔记

这是我参与「第四届青训营」笔记创作活动的第1篇笔记

gopath

bin pkg src

govendor

向每个项目引入一份依赖的副本,将依赖局部化,解决两项目以来同一个包的不同版本

gomodule

Go 项目管理

从 1.13 开始,Go 支持 go mod 管理依赖包 go version go mod 提供的功能如下 依赖包管理 虚拟环境 代理下载go依赖包

创建一个 go module

使用 go mod init创建一个项目, 会生成一个 go.mod, 该文件会记录所有依赖包及其版本

mkdir test
cd test
go mod init test
cat go.mod
module test
go 1.15
require github.com/astaxie/beego v1.12.3

创建一个简单的web服务

package main
import (
		"github.com/astaxie/beego"
		"github.com/astaxie/beego/context"
)
func hello(ctx *context.Context) {
	fmt.Println("Hello World")
	ctx.Output.Body([]byte("Hello World!!!"))
}

func main() {
	beego.Get("/", hello)
	beego.Run("127.0.0.1:7777")
}

添加go get 代理

set GOPROXY=goproxy.cn # windows export GOPROXY=goproxy.cn # linux

go env # 查看是否配置成功 set GOPROXY=goproxy.cn

使用 go mod tidy 解析依赖关系

此时只是解析了简单的关系,并没有下载依赖包 此后,每次添加新包,都需要执行 go mod tidy 使用 go mod download 下载依赖包

使用 go mod vendor 创建虚拟环境,将所有依赖包都放入 vendor 文件夹中

使用总结

go mod init  # 初始化go.mod
go mod tidy  # 更新依赖文件
go mod download  # 下载依赖文件
go mod vendor  # 将依赖转移至本地的vendor文件
go mod edit  # 手动修改依赖文件
go mod graph  # 打印依赖图
go mod verify  # 校验依赖

常见问题

Go build 时,明明包是存在的,报错 working directory is not part of a module 执行 go mod init

go mod init 失败,报错 go mod init: modules disabled by GO111MODULE=off; see 'go help modules' 执行set GO111MODULE=on开启go mod go.mod 和 go.sum 介绍

go.mod 记录该项目下直接使用的库,及其版本 而 go.sum 即复杂的多,不仅记录了所有库,还包含了其依赖库的版本及库的hash值(参考文章 www.zyiz.net/tech/detail…) 我认为该功能还有改进的空间,目前存在很多不方便之处 没有一个官方源,想要制作镜像源,非常之麻烦 go get 下载的时候不显示进度条,下一些比较大的包的时候,比较焦虑 go.mod 和 go.sum 都没能很直观的看到库与库之间的依赖 go 除了官方库之外,几乎所有第三方库都在github,版本管理也依赖于 github 的 tag,该问题风险很大

Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径;例如包gopl.io/ch1/helloworld对应的目录路径是$GOPATH/src/gopl.io/ch1/helloworld。

每个包都对应一个独立的名字空间。例如,在image包中的Decode函数和在unicode/utf16包中的 Decode函数是不同的。要在外部引用该函数,必须显式使用image.Decode或utf16.Decode形式访问。

包还可以让我们通过控制哪些名字是外部可见的来隐藏内部实现信息。在Go语言中,一个简单的规则是:如果一个名字是大写字母开头的,那么该名字是导出的(译注:因为汉字不区分大小写,因此汉字开头的名字是没有导出的)。