开发者

创建Go工程化项目布局详解

目录
  • 正文
    • /cmd
    • /internal
    • /pkg
    • /docs,/example,/pkg,/third_parth,/tools
    • 基础库项目布局
      • kit包应该具备的特点
  • 应用程序项目布局
    • /api
      • /configs
        • /test
          • 不应该包含/src目录
          • /internal
            • /biz
              • /data
                • /service
                • 布局示意图
                  • 数据流向

                  正文

                  如果你尝试学习Go,或者你正在为自己建立一个Poc或者一个玩具项目,这个项目布局是没有啥必要的,从一些简单的事情开始(一个main文件绰绰有余)。当有更多的人参与这个项目的时候,你讲需要更多的结构,包括需要一个tookit来方便生成项目的模板,尽可能大家统一的工程目录布局

                  本文章围绕github.com/golang-stan… 进行说明

                  /cmd

                  本项目的主干。 每个应用程序的目录名应该与你想要的可执行文件的名称相匹配(例如:/cmd/myapp)

                  不要在这个项目中放置太多的代码,如果你认为代码导入并在其他项目中使用,那么他应该位于/pkg目录中,如果代码不是可重用的,或者你不希望其他人重用他,请将该代码放到/internal目录中。

                  /internal

                  不希望对外进行共享的代码,internal目录中也可以放置一些子包结构,已做到更加细化的切分,如:

                  |--internal
                  |   |
                  |   |--demo
                  |       |--biz
                  |       |--data
                  |       |--service
                  

                  /pkg

                  外部应用程序可以使用的代码库,(例如:/pkg/publiclib)其他项目会导入这些代开发者_C开发码库,所以放入到该目录下的代码要三思~注意:/internal目录是确保私有包不可导入的私有方法,因为他是由Go在编译时强制执行的。/pkg 仍然是一种更好的方式,可以显示的表示目录中的代码对于其他人来说是安全使用的好方法。

                  /pkg目录内可以参考GO标准库的组织形式,按照功能分类,/internal/pkg一般用于项目内的,跨多个应用的公共共享代码,但是其作用域仅在单个工程内。

                  |--pkg
                  |  |
                  |  |--cache
                  |  |   |--memcache
                  |  js|   |--Redis
                  |  |
                  |  |--conf
                  |      |--dsn
                  |      |--env
                  |      |--flagvar
                  |      |--paladin
                  

                  /docs,/example,/pkg,/third_parth,/tools

                  这些跟上文说的/pkg/inthttp://www.devze.comernal都同属根目录下的目录结构

                  • /docs 放置一些项目说明文档
                  • /example 放置一些项目的http://www.devze.com使用示例
                  • /thrid_parth 三方的一些依赖文件,如:idl文件
                  • /tools 放置一些项目的脚手架工具,代码生成工具等

                  基础库项目布局

                  每个公司都应该为不同的微服务建立一个统一的kit基础包工具集。 基础库tookit为一个独立的项目,公司级建议只有一个,按照功能来拆分会带来不少的管理工作,因此建议并整合

                  kit包应该具备的特点

                  • 统一
                  • 标准库方式布局
                  • 高度抽象
                  • 支持插件

                  例如下面的布局

                  |--cache
                  |    |--memcache
                  |         |--test
                  |    |--redis
                  |         |--test
                  |--conf
                  |    |--dsn
                  |    |--env 
                  |    |--flagvar
                  |    |--paladin
                  |          |--apollo
                  |               |--internal
                  |                     |--mockserver
                  |--container
                  |    |--group
                  |    |--pool
                  |    |--queue
                  |         |--aqm
                  |--database
                  |    |--hbase
                  |    |--sql
                  |    |--tidb
                  |--echo
                  |    |--types
                  |--log
                  |   http://www.devze.com |--internal
                  |         |--core
                  |         |--filewriter
                  |
                  

                  应用程序项目布局

                  /api

                  API协议定义目录, xxapi.proto protobuf文件以及生成go的文件,我们通常把api文档定义在proto 文件中描述

                  /configs

                  配置文件模板或者默认配置

                  /test

                  额外的外部测试应用程序和测试数据,你可以随时根据需求构造测试目录,对于较大的项目,有一个数据子目录是有意义的,例如你可以使用/test/testdata(如果你需要忽略目录中的内容)请注意,Go还会以“.”或者“_”开头的目录或者文件,因此在如何命名测试数据目录方便,有着很大的灵活性。

                  不应该包含/src目录

                  有些Go项目确实有src目录,这是因为开发人员通常有Java的开发背景。

                  /internal

                  /biz

                  业务逻辑的组装层,类似DDD中的domain,

                  /data

                  业务数据访问,包含cache和db等封装,实现了biz的repo接口,我们可能会把data和dao混合在一起,data偏重业务的含义,他所做的是将领域对象重新拿出来,我们去掉了DDD的infra层,

                  /service

                  实现了api定义的服务层,类似DDD的applocation层,处理DTO到biz领域实体的转换,(DTO->DO)同事协同个类biz交互,但是不应该处理复杂逻辑

                  布局示意图

                  |--api
                  |--configs
                  |--test
                  |--internal
                  |       |--biz
                  |       |--data
                  |       python|--service
                  

                  数据流向

                  创建Go工程化项目布局详解

                  以上就是创建Go工程化项目布局详解的详细内容,更多关于Go工程化项目布局的资料请关注我们其它相关文章!

                  0

                  上一篇:

                  下一篇:

                  精彩评论

                  暂无评论...
                  验证码 换一张
                  取 消

                  最新开发

                  开发排行榜