V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
johng
V2EX  ›  Go 编程语言

GoFrame v1.12 发布,数据库驱动开发、日志滚动切分等等新特性

  •  1
     
  •   johng · 2020-03-31 00:13:37 +08:00 · 2474 次点击
    这是一个创建于 1492 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好啊!久等啦!

    由于自从上次版本的发布以来,越来越多小伙伴加入了GF的大家庭,并提供了许多不错的建议和反馈,这次版本对其中大部分反馈进行了处理,包括大部分的改进建议和部分新特性,因此这次的版本发布时隔了两个多月。GF非常注重代码质量以及可持续维护性,这次版本也进一步对框架大部分模块的示例、注释和单元测试用例进行了完善,目前单元测试用例数量约为1991例,代码覆盖率为71%,覆盖了所有模块的绝大部分主要功能。

    GF框架提供了比较常用、高质量的基础开发模块,轻量级、模块化、高性能,推荐大家阅读框架源码了解更多细节。本次发布有个别的不兼容升级,往往批量替换即可,以下change log比较完善,建议升级前仔细阅读。

    本次发布即意味下一版本开发计划的开启,欢迎更多小伙伴参与开源贡献: https://github.com/gogf/gf/projects/8

    感谢大家支持! Enjoy your GF

    GoFrame

    GF(Go Frame)是一款模块化、高性能、生产级的 Go 基础开发框架。实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、对象池、配置管理、资源管理、数据校验、数据编码、定时任务、数据库 ORM 、TCP/UDP 组件、进程管理 /通信等等。并提供了 Web 服务开发的系列核心组件,如:Router 、Cookie 、Session 、Middleware 、服务注册、模板引擎等等,支持热重启、热更新、域名绑定、TLS/HTTPS 、Rewrite 等特性。

    特点

    • 模块化、松耦合设计;
    • 模块丰富,开箱即用;
    • 简便易用,易于维护;
    • 社区活跃,大牛谦逊低调脾气好;
    • 高代码质量、高单元测试覆盖率;
    • 详尽的开发文档及示例;
    • 完善的本地中文化支持;
    • 更适合企业及团队使用;

    地址

    Change Log

    GF v1.12版本开始,框架要求的最低Golang运行版本为v1.13,由于Golang新版本都是向后兼容的,因此推荐大家更新使用Golang新版本: https://golang.google.cn/dl/

    本次版本也新增了Swagger的工具及插件支持,另行独立发布。

    tool chain

    1. gen model命令新增对pgsql/mssql/sqlite/oracle的模型生成支持。
    2. gen model命令生成模型新增公开包变量Columns用于获得表的字段名称。

    net

    1. ghttp

    database

    1. gdb

    2. gredis

      • 增加 /修改默认的数据库连接池参数:MaxIdle=10, IdleTimeout=10s, MaxConnLifetime=30s, Wait=true
      • 完善单元测试。

    container

    1. 所有容器对象新增UnmarshalValue(interface{}) error接口方法实现,用于gconv转换时根据任意类型变量创建 /设置对象内容,GF框架的所有容器对象均实现了该接口。

    2. garray

      • 新增RemoveValue方法,用于根据数值检索并删除元素项。
      • 新增FilterNil方法,用于遍历并删除数组中的nil元素项。
      • 新增FilterEmpty方法,用于遍历并删除数组中的空值元素项,空值包括:0, nil, false, "", len(slice/map/chan) == 0
      • 改进Set/Fill/InsertBefore/InsertAfter方法严谨性,将原有的链式操作返回值对象修改为error返回值。
      • 改进Get/Remove/PopRand/PopLeft/PopRight/Rand方法严谨性,增加foundbool返回值,标识当前方法是否有数据返回,当空数组或者操作越界时found返回值为false
      • 改变Rands方法原有逻辑,保证按照给定大小返回随机数组。
      • 完善单元测试。
    3. gpool

      • 调整缓存池过期时间参数类型,旧版本为int类型表示毫秒,新版本为time.Duration类型使得时间控制更灵活。
      • 内部代码优化,性能改进。
      • 完善单元测试。
      • 完善注释。

    os

    1. glog

    2. gres

      1. 改进资源内容编码设计,采用新的压缩算法,减少资源文件大小,例如原本15MB的网站静态资源文件(css/js/html等),资源文件打包后约为4MB左右: https://goframe.org/os/gres/index
      2. 注意:该改进与旧版本无法兼容,需要重新打包原有的资源文件。
      3. 完善单元测试。
    3. gcfg

      • 去掉配置对象属性的原子并发安全控制,改为普通变量类型。由于配置管理是最常用模块之一,因此确保高效的设计及方法实现。
      • 单例对象做较大调整:为方便多文件场景下的配置文件调用,简便使用并提高开发效率,因此当给定的单例名称对应的toml配置文件在配置目录中存在时,将自动设置该单例对象的默认配置文件为该文件。例如:g.Cfg("redis")获取到的单例对象将会默认去检索并设置默认的配置文件为redis.toml,当该文件不存在时,则使用默认的配置文件(config.toml): https://goframe.org/net/ghttp/config
      • 完善单元测试。
    4. gview

    5. gfile

      • 改进SelfPath获取当前执行文件路径方法,提高执行效率。
      • 改进Join文件路径连接方法,防止多余的路径连接符号。
      • 改建GetContents文件内容获取方法执行效率,降低内存占用。
      • 新增StrToSize方法,用于将大小字符串转换为字节数字,大小字符串例如10m, 5KB, 1.25Gib等。
      • 新增ReadLines/ReadByteLines方法,用于按行读取指定文件内容,并给定读取回调函数。
      • 完善单元测试。
    6. gtime

      • 改进gtime.Time对象实现,统一字符串打印时间格式为Y-m-d H:i:s,如:2020-01-01 12:00:00
    7. gcmd

      • 命令行解析方法增加strict参数,用于设置当前解析是否严格解析,严格解析下如果给定了非法的选项,将会停止解析并返回错误。默认情况下为非严格解析。
    8. genv

      • 改进Remove删除环境变量键值对方法,增加对多个键值对环境变量的删除。
    9. gfpool

      • 改进代码实现,提高效率。
      • 完善单元测试。
    10. gfsnotify

      • 改进包初始化方法,当系统原因引起默认Watcher对象创建失败时,直接panic
    11. gproc

      • 改进SearchBinaryPath方法。
      • 改进Process.Kill方法在windows*niux平台下不同表现的处理。

    encoding

    1. gjson

    frame

    1. g
      • 新增IsNil方法,用于判断当前给定的变量是否为nil,该方法有可能会使用到反射来实现判断。
      • 新增IsEmpty方法,用于判断当前给定的变量是否为,该方法优先使用断言判断但有可能会使用到反射来实现判断。空值包括:0, nil, false, "", len(slice/map/chan) == 0
      • 标记废弃SetServerGraceful方法,转而统一交给Server的配置来管理。
    2. gins
      • 改进代码结构,方便维护。
      • 改进、完善单元测试。
    3. gmvc
      • 新增M类型,为*gdb.Model的别名简称,用于工具链自动生成模型中的M属性。

    text

    1. gstr
      • 新增HasPrefix/HasSuffix方法。
      • 新增OctStr方法,用于将八进制字符串转换为其对应的unicode字符串,例如转换为中文。常用于gRPC底层通信编码中。
      • 完善单元测试。

    debug

    1. gdebug
      • 改进代码结构,方便维护。
      • 新增TestDataPath方法,用于当前包单元测试中获得当前包中testdata目录的绝对路径。

    util

    1. gconv

      • 改进String字符串转换方法,增加对time.Time/*time.Time/gtime.Time类型的内置支持。
      • 改进Map/Struct转换方法,增加对一些特殊场景的细节处理。经过大规模的使用,大量的反馈改进,不断完善了细节。
      • 改进Struct转换方法,增加对UnmarshalValue(interface{}) error接口的支持。
      • 完善单元测试。
    2. grand

      • 注意:不兼容调整,原有的Str方法更名为S方法,用以获取指定长度的随机字符串、数字,并增加symbol参数,指定是否可以随机返回特殊可见字符。
      • 新增Str方法,用于从指定的字符串字符中随机获取指定长度的字符串。该方法同时支持unicode字符串,例如:中文: https://goframe.org/util/grand/index
      • 新增Symbols方法,用于随机返回指定场孤独的特殊可见字符: https://goframe.org/util/grand/index
      • 完善单元测试。
    3. gvalid

      • 长度校验规则增加对unicode字符串的支持,例如:中文。

    Bug Fix

    1. 修复Server的视图对象配置失效问题。
    2. 修复Server中间件在中间件panic情况下,忽略Middleware.Next方法控制,导致鉴权中间件失效的问题。
    3. 修复gudp.Server在请求包大小超过64bytes时的断包问题,并调整默认缓冲区大小为1024byte,开发者可自定义缓冲区大小。
    4. 修复gfile.MTimeMillisecond方法返回错误的文件修改毫秒时间戳。
    5. 修复gconv.Int64对负数转换的支持。
    6. 其他一些修复。
    7. 详见: https://github.com/gogf/gf/issues?q=label%3Abug
    16 条回复    2020-05-02 18:11:05 +08:00
    iBenlim
        1
    iBenlim  
       2020-03-31 08:07:10 +08:00 via iPhone
    666
    loading
        2
    loading  
       2020-03-31 10:13:17 +08:00
    牛逼,准备用一下。
    fenglangjuxu
        3
    fenglangjuxu  
       2020-03-31 15:52:03 +08:00
    厉害的 golang 人
    guonaihong
        4
    guonaihong  
       2020-03-31 18:24:31 +08:00
    维护这么多的 topic,如何把每个 topic 做到世界第一呢?
    guonaihong
        5
    guonaihong  
       2020-03-31 18:37:56 +08:00
    先为楼主的思路说声佩服。上面说的有点歧义。原本想说,楼主维护的代码特别多,这里涉及很多 topic,每个 topic 都可以开一个单独的开源项目维护。比如 orm,比如 web 框架,GoFrame 里面的 web 框架要和 gin 竞争,orm 要和 xorm 或者 gorm 竞争。从时间和精力来看,这有点难啊,到不是说楼主不牛。只是从时间和精力来看,这个火力有点不够聚焦。有信心超过 gin 和 xorm 吗?而且 gin 和 xorm,orm 聚焦的维护人员还特别多。你说气不气。。。
    http client 要和 gout 竞争,关键还有 1w 行思路没有输出(让你措不及防的广告)
    johng
        6
    johng  
    OP
       2020-03-31 21:48:15 +08:00
    @guonaihong
    1. 首先,你不要想着和谁去争第一,你的初衷是要满足需求,去解决痛点。你能解决问题,并且能解决好问题,才能被接受。
    2. 其次,你不要想着去解决所有问题,你要去解决共性、通用的问题,或者项目开发中最关键性的问题,提供基础的解决方式。
    3. 再者,并不是说单纯做一个 topic 就一定能做得更好,起决定因素的往往在于做事情的人,人的技术技能、知识经验、精神态度往往都是在解决共性问题时比较重要的点。
    4. 最后,开源项目,要持之以恒,要不断迭代更新,这才是所有点中最耗费精力的点,也是最关键的点。

    你提到的 gin 、xorm 、gorm 都是很不错的开源项目,在 gf 框架里面也算是核心模块,也是业务项目开发的基础。gf 的许多模块在不断的迭代更新中,至今做得非常的出色,outstading 。
    guonaihong
        7
    guonaihong  
       2020-03-31 23:23:05 +08:00
    首先感谢 @johng 的回答,好像了解了一些。我相信你这么给力的开发人员,胸心应该是非常开阔的。索性问个犀利点的问题。
    go 世界的著名开发人员 dv(简写)提倡过,一个开源的 go 库,最好只做一件事,我深度思考过这个观点,最后得到这个观点言之有理。因为只做一个 topic,可以很容易地做到极致,做到极致的库是我优先考虑的重要考量,所谓极致是性能第一,API 简洁度第一,测试覆盖度第一,你是怎么看待这个观点的? GoFrame 很直观不是按这种思路做的。
    johng
        8
    johng  
    OP
       2020-04-01 11:12:33 +08:00
    @guonaihong 你的继续提问,表示你对 GF 比较感兴趣,我也感谢你的支持,以及礼节。

    你说的 dv 应该是指的 Dave 对吧,Dave 的 github: https://github.com/davecheney?tab=repositories 里面有很多不错的开源项目,还不包括工作上未开源的作品,流弊的开发人员能够创造的价值比你我能够想到的可能更多。能不能把事情做好,并不是在于你把库放一个地方还是多个地方。所谓的只做一个库,只做一个 topic 就一定能做到"第一"或者"极致"的想法往往是一厢情愿。不要急着飞,落地下来好好使用使用、对比对比,选个合适的、顺手的,如果没有达到自己"极致"的目标,可以尝试着自己去实现。

    其实你的问题,也是部分小伙伴在接触 GF 之前,也会同样抱有的疑问。我正面回答你的问题,猜测下面可能是你真正想要的答案:

    1. GoFrame 的模块看起来多,但是都是耦合性低的基础模块,所谓"基础设施"、"基础框架"就是这么来的。基础模块的研发,逻辑简单、代码量少、维护成本低,投入产出比最大,往往投入是短期的,收益却是长期的。

    2. GoFrame 的模块主要解决了目前 Golang 在开发项目的几大比较共性的问题:有无的问题、易用的问题、性能的问题、工程化的问题。GF 在去年中旬的时候就已经完成的基础模块的开发工作,新版本的工作主要是根据用户反馈不断迭代完善框架模块功能、细节、易用和性能,并推进社区的活跃性,推进社区参与框架完善以及生态建设。

    3. GoFrame 的模块主要分为两类:基础模块和社区模块。基础模块由 gf 项目管理和发布,是框架的核心组成部分,保证轻量级和高质量。社区模块是在 github.com/gogf 空间下管理的其他模块,由社区提供,并选择入库,作为框架的扩展。

    4. GoFrame 可以把每个基础模块做到"极致"。
    guonaihong
        9
    guonaihong  
       2020-04-01 11:54:52 +08:00
    @johng hi,johng 你的回答方式让我有点想挠挠头发,没有正面回答我的问题。好的谈话方式可以像写作文,有层次,有腹稿,有头尾。对了,我对 gf 的兴趣目前在于,想了解做这个项目的出发点,我看到的 github 大多数的项目都是解决一个 topic 。很少看到"非极致项目的联合松散联合体"。

    我想升级下问题。可以吗?
    我上一个问题其实想问,gf 里面各个模块单独拿出来,和目前已经占据 top 1 的项目比没有任何优势。那做这个事的意义,那我换个问题。下面是最后一次问了

    跟 gin 项目相比,gf 里面集成 http router 的意义在于?
    跟 xorm 和 gorm 项目相比,gf 里面集成 orm 的意义在于?
    johng
        10
    johng  
    OP
       2020-04-01 12:33:48 +08:00
    @guonaihong
    > 我上一个问题其实想问,gf 里面各个模块单独拿出来,和目前已经占据 top 1 的项目比没有任何优势。那做这个事的意义,那我换个问题。下面是最后一次问了
    ----------------------------------------------------------------------------------
    不要先入为主,先了解下 gf,看看文档和源码,了解一下再下论断。
    guonaihong
        11
    guonaihong  
       2020-04-02 13:08:40 +08:00
    打住,就这样吧,再聊下去可能会意气之争。你说的,我会看下。
    iliul
        12
    iliul  
       2020-04-02 19:07:11 +08:00
    关注一波
    wzw
        13
    wzw  
       2020-04-19 09:32:40 +08:00
    @johng #10 想问问 ghttp 是否准备出 auto api doc 的这样的计划 (类似 FastAPI)
    johng
        14
    johng  
    OP
       2020-04-24 15:33:18 +08:00
    @wzw 目前已经支持 swagger
    wzw
        15
    wzw  
       2020-04-27 08:13:59 +08:00
    @johng #14 是不是文档还没有更新到 swagger
    wzw
        16
    wzw  
       2020-05-02 18:11:05 +08:00
    @johng #14 已经看到 demo 和 插件. 已用上,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2460 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:47 · PVG 21:47 · LAX 06:47 · JFK 09:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.