如何将含有多个main子项目的大项目mod化

member · · 4016 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

以 xxx-go-eninge(图片中有打码) 为例,项目中包含5个子项目,2个公共类,如下图,

红色框选即使公共模块

其它都是独立的子项目,有main.go

image

我们将这个项目放在任意文件夹,是否在GOPATH都可以

如果这个项目不做任何配置,那么在任意目录下执行go get或build都会失败。

现在操作步骤如下

  1. 将项目根目录加入到GOPATH中,如图红圈中,Project级别的GOPATH即可,同时选中下面的索引GOPATH
    image

    这么做的目的是为了将当前大项目的目录变成一个独立的gopath的环境,里面有src、pkg、bin,以免污染Global GOPATH
    PS: 这个项目放在那里都可以,没有必须放在Global GOPATH的要求

  2. 启动控制台
    image
  3. 先执行go env查看GOPATH路径是否正确,正确的话会包含项目根目录和系统环境中的GOPATH
    没有包含也没关系,点击上图中Local 右边的 + 号,此时新建的控制台中应该就是正确的环境变量了
  4. cd 到每个子模块的目录依次执行,公共模块优先,
    比如cd到xxxEngine那层目录

    go mod init  
    go get -insecure  
      
    # 使用 -inisecure 的原因是我们的私有库无法verify  
    # 报错可以先不理
  5. 如果 tools 目录下没有go文件,所以无法mod,而它的子目录中有,需要分别在cd到每个子目录下新建mod,比如 tools/util目录,module名为tools/util
  6.  此时每个子模块下会生成go.mod文件,文件中会require当前模块的所有依赖模块
  7. 比如运行xxxEngine时,因为依赖项的问题,执行会报错,比如报错的内容大致为:xxxConfig找不到的错误,因为xxxConfig是并非线上模块,此时需要打开xxxEngine/go.mod文件
    最重要的步骤

    image

    添加如上信息

    require xxxConfig v0.0.0  
    replace xxxConfig => ../xxxConfig  
      
    # 通过相对路径的方式,将公用模块引入,此时便不会再报错 
  8. 如果遇到错误,多次执行go get -insecure然后执行7的步骤,添加相应依赖,直到没有错误为止,
  9.  如上操作,所有子目录都做成了单独的模块,每个含有go.mod的模块可以正常的go build编译(公共模块无需编译),可以使用GoLand配置每个项目的单独的运行/调试

    image
    图中Run Kind选择为目录 Directory,然后如图设置对应的执行目录、输出目录即可

  10. 如图可以看到pkg目录存储了当前项目的缓存文件,并不会污染其它环境
    而每个子目录下的go.mod将当前文件夹变成了一个模块

image


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:member

查看原文:如何将含有多个main子项目的大项目mod化

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4016 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传