beego 1.6.0 版本发布,Go 应用框架

astaxie
 astaxie
发布于 2016年01月18日
收藏 33

距离上一次发布1.5版本已经半年了,这半年里面我们改进了很多,其实中间又想要发布一个小版本的,但是后来还是想想就改的彻底一点,所以这次改动相当多,中间又因为一些兼容性的问题所以特地写了一个工具bee fix,可以让大家平滑的升级beego应用到最新版本。大家如果有任何问题可以去issue提问题,我们会尽快的回复大家。今年我们计划发布四个版本,三个月发布一个大版本,然后遇到一些issue我们会发布一些小版本。目前我们核心开发组已经有10个人。今年我们会努力做好beego这个框架以及周边的工具,教程,模块,应用等。希望给大家带来更好的体验。

新功能:

  1. 文件log支持rotate支持类似xx.2013-01-01.2.log这样的输出 #1265

  2. context.response 支持了原生的Flush,Hijack,CloseNotify

  3. ORM支持Distinct操作 #1276

  4. 新增加模板函数map_get #1305

  5. ORM支持tidb引擎 #1366

  6. httplib请求参数支持[]string #1308

  7. ORM querySeter添加GroupBy方法 #1345

  8. Session的MySQL引擎支持自定义表名 #1348

  9. log的file引擎性能提升30%,同时支持自定义创建的文件权限 #1560

  10. session支持通过query获取 #1507

  11. Cache模块支持多个Cache对象,之前N调用ewCache获取的是同一个Cache,现在会初始化不同的Cache对象。

  12. validation支持自定义验证函数

bugfix:

  1. context里面bind函数如果参数为空crash #1245

  2. ORM中manytomany获取reverse的时候出错。#671

  3. http: multiple response.WriteHeader calls #1329

  4. ParseForm解析日期使用当前的timezone #1343

  5. log引擎里面Smtp发送邮件无法认证

  6. 修复路由规则的一些issue: /topic/:id/?:auth, /topic/:id/?:auth:int #1349

  7. 修复注释文档解析的时候nil引起crash #1367

  8. static目录下的index.html无法读取

  9. dbBase.Update失败不返回err #1384

  10. validation里面设置的Required只对int有效,int64无效

  11. ORM创建外键是string类型的主键时创建varchar(0)的字符问题 #1379

  12. graceful同时开启http和https的时候出错 #1414

  13. ListenTCP4开启之后如果httpaddr为空还是监控TCP6

  14. migration不支持postgres #1434

  15. ORM text、bool等默认值问题导致创建表出错

  16. graceful导致panic问题 negative WaitGroup counter

优化:

  1. example 移到了 samples

  2. 所有代码符合golint规范

  3. 重写路由树底层,性能提升三倍左右

  4. 每次请求的context采用sync.Pool复用,内存和性能提升

  5. 模板编译优化速度,按需编译 #1298

  6. 优化了beego的配置管理,采用统一的BConfig,更易读易管理

  7. 优化了beego的整体结构代码,使得代码更易读维护

  8. 所有初始化的信息统一到AddAPPStartHook函数中去,易于管理

  9. 移除了middleware,之后全部采用plugins来管理插件

  10. 重构Error处理,使得Error更加易懂

升级指南:

1. go get -u github.com/beego/bee
2. 进入项目目录
3. bee fix

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:beego 1.6.0 版本发布,Go 应用框架
加载中

最新评论(55

啦啦啦拉拉
啦啦啦拉拉
go语言的话不用担心线程安全的问题?直接写函数就是?
3xxx
3xxx
一直在学习。非常棒。
Erasin
Erasin
我倒是觉得Beego 是一个很不错的框架, 另外在使用一个框架的时候,用的时候总会有各种各样的坑,用的不爽的地方,这是肯定的, 如果你能修改源码并提交给作者才是真的棒.

提交 issue 或者自己 fork 一份来修改提交过去.
树相马
树相马
很好用的框架。。。赞。。

顺便问问。为啥参数是rune 类型,得到都少一个字符?
astaxie
astaxie

引用来自“Finley.Hamilton”的评论

已用。。。大坑。。。慎入。。。

引用来自“黄者”的评论

有哪些坑?
别话说一半啊。

引用来自“Finley.Hamilton”的评论

说说我遇到的吧,
- 自动生成的router要启动第二次才生效(标准开发环境下)
- graceful shutdown没有暴露接口
- 拦截器也不完善,关键是,那些Hook都是骗人的,看文档看半天发现名不符实

引用来自“astaxie”的评论

1. 生成的router要启动第二次才能生效?基于comment生成的吗?
2. graceful为什么要暴露shutdown接口?
3. 拦截器那些不完善?hook都是骗人的?不理解你的意思?beego里面的拦截器都是FIlter

引用来自“Finley.Hamilton”的评论

谢作者关注,

1. 是
2. graceful=true 不生效,是我的问题吗?
3. 对,我要的就是InsertFilter“position=FinishRouter”的功能,但是这里头却拿不到ctx?

引用来自“astaxie”的评论

1. 我这边好像不存在这个问题,可能和你的系统有关系,你是什么系统,我在Mac上面好像没这个问题,因为router先生成的,会自动重新build
2. graceful应该就自动启用了,应该是你哪里没有配置正确
3. 你的FIlter怎么写的?参数不是就是ctx嘛,为什么拿不到?是不是你insertFilter的时候第四个参数没有写?这个可能是我们文档的问题,因为默认情况下只要有输出的话,后面的FIlter默认是全部skip的,只有你显示的说这个必须执行。也就是第四个参数为true。http://beego.me/docs/mvc/controller/filter.md

引用来自“Finley.Hamilton”的评论

1. Ubuntu 15.10
2. 不不不,我说的还是graceful shutdown的问题,不是启动,不知道如果关闭Web App之前有什么办法做一些清除工作?
3. 抱歉,我没阐述清楚我的问题。应该说

```
beego.InsertFilter("/api/*", beego.FinishRouter, func(ctx *context.Context) {
???这里头有什么办法能拿到StatusCode????
  }, false)
```

引用来自“astaxie”的评论

1. 我找个虚拟机测试测试
2. 你说的是SignalHooks吗?https://github.com/astaxie/beego/blob/master/grace/grace.go#L120-L131 但是现在beego内部没有hook去执行那个。
3. ctx.Output.Status

引用来自“Finley.Hamilton”的评论

2. 对,我也找到这一段了, 开始针对这三个信号都做同样操作,后来就放弃,把所有的操作放在入口文件的init()执行
3. 亲测全是0

引用来自“astaxie”的评论

3. 这个是你需要写入数据的情况下才会有值的,在你调用这个值之前你是否有写入?默认值就是0

引用来自“Finley.Hamilton”的评论

```
package main

import (
  "github.com/astaxie/beego"
"github.com/astaxie/beego/context"
  "fmt"
)

func init() {

}

func main() {

  beego.Get("/versions",func(ctx *context.Context){
    ctx.Output.Status = 200;
    ctx.Output.Body([]byte("hello world"))
  })

  beego.InsertFilter("/*", beego.FinishRouter, func(ctx *context.Context) {
    fmt.Println(ctx.Output.Status)
  }, false)

  // By default, Go programs run with GOMAXPROCS set to the number of cores available; in prior releases it defaulted to 1.
  beego.BeeLogger.Info("ntProtocol run in %s mode", beego.RunMode)
  // read conf/app.conf automatically
  beego.Run()
}

```

ctx.Output.Status = 200;
ctx.Output.Body([]byte("hello world"))

这样写后面的Status就为0了,但是


ctx.Output.Body([]byte("hello world"))
ctx.Output.Status = 200;

能拿到200



我觉得不在这里讨论了,如果你遇到问题你最好是通过issue通道来反馈。
Finley.Hamilton
Finley.Hamilton

引用来自“Finley.Hamilton”的评论

已用。。。大坑。。。慎入。。。

引用来自“黄者”的评论

有哪些坑?
别话说一半啊。

引用来自“Finley.Hamilton”的评论

说说我遇到的吧,
- 自动生成的router要启动第二次才生效(标准开发环境下)
- graceful shutdown没有暴露接口
- 拦截器也不完善,关键是,那些Hook都是骗人的,看文档看半天发现名不符实

引用来自“astaxie”的评论

1. 生成的router要启动第二次才能生效?基于comment生成的吗?
2. graceful为什么要暴露shutdown接口?
3. 拦截器那些不完善?hook都是骗人的?不理解你的意思?beego里面的拦截器都是FIlter

引用来自“Finley.Hamilton”的评论

谢作者关注,

1. 是
2. graceful=true 不生效,是我的问题吗?
3. 对,我要的就是InsertFilter“position=FinishRouter”的功能,但是这里头却拿不到ctx?

引用来自“astaxie”的评论

1. 我这边好像不存在这个问题,可能和你的系统有关系,你是什么系统,我在Mac上面好像没这个问题,因为router先生成的,会自动重新build
2. graceful应该就自动启用了,应该是你哪里没有配置正确
3. 你的FIlter怎么写的?参数不是就是ctx嘛,为什么拿不到?是不是你insertFilter的时候第四个参数没有写?这个可能是我们文档的问题,因为默认情况下只要有输出的话,后面的FIlter默认是全部skip的,只有你显示的说这个必须执行。也就是第四个参数为true。http://beego.me/docs/mvc/controller/filter.md

引用来自“Finley.Hamilton”的评论

1. Ubuntu 15.10
2. 不不不,我说的还是graceful shutdown的问题,不是启动,不知道如果关闭Web App之前有什么办法做一些清除工作?
3. 抱歉,我没阐述清楚我的问题。应该说

```
beego.InsertFilter("/api/*", beego.FinishRouter, func(ctx *context.Context) {
???这里头有什么办法能拿到StatusCode????
  }, false)
```

引用来自“astaxie”的评论

1. 我找个虚拟机测试测试
2. 你说的是SignalHooks吗?https://github.com/astaxie/beego/blob/master/grace/grace.go#L120-L131 但是现在beego内部没有hook去执行那个。
3. ctx.Output.Status

引用来自“Finley.Hamilton”的评论

2. 对,我也找到这一段了, 开始针对这三个信号都做同样操作,后来就放弃,把所有的操作放在入口文件的init()执行
3. 亲测全是0

引用来自“astaxie”的评论

3. 这个是你需要写入数据的情况下才会有值的,在你调用这个值之前你是否有写入?默认值就是0
```
package main

import (
  "github.com/astaxie/beego"
"github.com/astaxie/beego/context"
  "fmt"
)

func init() {

}

func main() {

  beego.Get("/versions",func(ctx *context.Context){
    ctx.Output.Status = 200;
    ctx.Output.Body([]byte("hello world"))
  })

  beego.InsertFilter("/*", beego.FinishRouter, func(ctx *context.Context) {
    fmt.Println(ctx.Output.Status)
  }, false)

  // By default, Go programs run with GOMAXPROCS set to the number of cores available; in prior releases it defaulted to 1.
  beego.BeeLogger.Info("ntProtocol run in %s mode", beego.RunMode)
  // read conf/app.conf automatically
  beego.Run()
}

```

ctx.Output.Status = 200;
ctx.Output.Body([]byte("hello world"))

这样写后面的Status就为0了,但是


ctx.Output.Body([]byte("hello world"))
ctx.Output.Status = 200;

能拿到200



韩行知
韩行知
2016/01/18 21:24:24 [INFO] Start building...
# github.com/astaxie/beego
../github.com/astaxie/beego/error.go:88: undefined: AppName
../github.com/astaxie/beego/error.go:90: ctx.Input.Uri undefined (type *context.BeegoInput has no field or method Uri, but does have URI)
../github.com/astaxie/beego/error.go:481: undefined: AutoRender
../github.com/astaxie/beego/hooks.go:21: registerDefaultErrorHandler redeclared in this block
  previous declaration at ../github.com/astaxie/beego/error.go:362
../github.com/astaxie/beego/hooks.go:36: undefined: ErrorHandler
2016/01/18 21:24:25 [ERRO] ============== Build failed ===================
韩行知
韩行知
bee version
bee :1.4.1
beego :1.6.0
Go :go version go1.5 darwin/amd64

bee fix
2016/01/18 21:24:18 /usr/local/gowork/src/test111/conf/app.conf
2016/01/18 21:24:18 /usr/local/gowork/src/test111/controllers/default.go
2016/01/18 21:24:18 /usr/local/gowork/src/test111/main.go
2016/01/18 21:24:18 /usr/local/gowork/src/test111/routers/router.go
2016/01/18 21:24:18 /usr/local/gowork/src/test111/tests/default_test.go
2016/01/18 21:24:18 /usr/local/gowork/src/test111/views/index.tpl
韩行知
韩行知
哈哈
返回顶部
顶部