30

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

 5 years ago
source link: https://segmentfault.com/a/1190000023846787
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

红色框选即使公共模块

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

jYZ3ueI.png!mobile

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

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

现在操作步骤如下

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

    这么做的目的是为了将当前大项目的目录变成一个独立的gopath的环境,里面有src、pkg、bin,以免污染Global GOPATH

    PS: 这个项目放在那里都可以,没有必须放在Global GOPATH的要求

  2. 启动控制台
    Vba2i2Q.png!mobile
  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文件

    最重要的步骤

    n2U73qf.png!mobile

    添加如上信息

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

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

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

VZ7F3aV.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK