初次接出golang,我们参照上篇文章,很快就可以使用vscode搭建好继承开发环境,并创建了自己的项目
在同一个项目中,我们很容易的采用mod方式进行依赖包及版本管理,但是现实红中,可能一个系统分为多个子项目,每个项目都可能有人单独开发,最后有人多项目调试,如果是多项目调试,每个项目都有自己的mod,我们可以通过把项目包上传后,再拉取的方式来引用,但是无法直接本地提示,如果要做到本地调试,且不改变原来的依赖路径,我们怎么做呢?
有两种方式,一种是通过mod replace来重定向到本地路径,go1.18版本提供了一种更方便的方式 work方式来引入本地项目,有关mod方式如何管理,网上有很多介绍,本人不喜欢这种方式,因为后续如果发布,还需要更改依赖,work方式可以很优雅的实现。
1.1 多项目工作区建立
由于近期要用golang实现流媒体,对Monibuca(m7s)源码进行了研究,具体如果想了解流媒体源码可参照m7s源码:
地址
- 首先创建一个目录,这里命名为m7sv4
- 使用vscode打开此文件夹(file->openfolder),然后保存工作区(file->save workspace as)到m7sv4目录
- 然后创建main.go,输入:
package main
import (
"context"
"flag"
"m7s.live/engine/v4"
"m7s.live/engine/v4/util"
_ "m7s.live/plugin/rtmp/v4"
_ "m7s.live/plugin/rtsp/v4"
)
func main() {
conf := flag.String("c", "config.yaml", "config file")
flag.Parse()
ctx, cancel := context.WithCancel(context.Background())
go util.WaitTerm(cancel)
engine.Run(ctx, *conf)
}
- 初始化mod并下载依赖包
go mod init m7sv4 #模块初始化
go mod tidy # 更新依赖项
go mod download # 下载依赖包
- f5运行或者直接再terminal中go run main.go 可直接运行流媒体
以上方式依赖包会下载到go path路径下的pkg/mod中,我这里有这样的场景,我要对源码进行调试和修改,我把源码下载到本地,并放到m7sv4文件夹中,如下:
这里我们无论对当前目录下的源码如何修改,运行main时,都不会生效,因为main依赖包在gopath下,为了使得当前目录下项目源码修改后能够及时生效和断点调试,我们可以利用mod的replace来实现,也可以修改所有import导入方式改成相对路径,如下方式:
"m7stest/engine"
"m7stest/engine/util"
源码中所有m7s.live/engine/v4,都要改成m7stest/engine,并去除所有项目中的mod,只保留主项目的mod,也就是把多项目转化为多模块方式,这种方式很不友好。下面介绍通过work的方式管理。
1.2 go work使用
把源码下载下来之后,放到m7stest目录下,工作区间目录结构如下:
m7sv4->engine
->plugin->rtmp
->rtsp
->main.go
->go.mod
->go.work
work引入项目步骤如下:
go work init ./
go work use ./engine
go work use ./plugin/rtmp
go work use ./plugin/rtsp
work引入项目后内容:
go 1.18
use (
./
./engine
./plugin/rtmp
./plugin/rtsp
)
使用go work 不需要对各个项目的go.mod 做任何操作就能直接使用项目代码修改后最新的代码,对本地调试非常方便