https://github.com/kataras/iris/issues
https://chat.iris-go.com
https://github.com/kataras/iris/releases
如果没有必要,不会强制升级。如果你已经准备好了,可以随时升级。
Iris 使用 Golang 的 vendor directory 特性, 避免依赖包的更改带来影响。
如何升级: 打开命令行执行以下命令: go get -u github.com/kataras/iris
或者等待自动更新。
- 用最新版 BoltDB 重新实现 session (
sessiondb
) 存储:/sessions/sessiondb/boltdb/database.go, 相关示例 /_examples/sessions/database/boltdb/main.go. - 修正 一个小问题 on Badger sessiondb example.
sessions.Config { Expires }
字段由2 *time.Second
调整为45 *time.Minute
. - badger sessiondb 其他小改进.
- 修正 重定向问题 由 @wozz 提交: kataras#972.
- 修正 无法销毁子域名 session 问题 由 @Chengyumeng 提交: kataras#964.
- 添加
OnDestroy(sid string)
当 session 销毁时注册监听器 相关细节: https://github.com/kataras/iris/commit/d17d7fecbe4937476d00af7fda1c138c1ac6f34d. - sessions 现在与注册数据库完全同步。 这涉及到很多内部改动,但 这不影响你当前项目代码. 我们只保留了
badger
和redis
作为底部支持。 相关细节: https://github.com/kataras/iris/commit/f2c3a5f0cef62099fd4d77c5ccb14f654ddbfb5c
新增 缓存中间件客户端,更快的静态文件服务器. 详情 点击.
改变 Value<T>Default(<T>, error)
为 Value<T>Default(key, defaultValue) <T>
如同 ctx.PostValueIntDefault
或 ctx.Values().GetIntDefault
或 sessions/session#GetIntDefault
或 context#URLParamIntDefault
.
由 @jefurry 提出 kataras#937.
只需要移除第二个返回值即可.
示例: _examples/mvc/basic/main.go line 100 count,_ := c.Session.GetIntDefault("count", 1)
变更为: count := c.Session.GetIntDefault("count", 1)
.
请记住,如果您无法升级,那么就不要这样做,我们在此版本中没有任何安全修复程序,但在某些时候建议您最好进行升级,我们总是会添加您喜欢的新功能!
- 修正
APIBuilder, Party#StaticWeb
和APIBuilder, Party#StaticEmbedded
子分组内的前缀错误 - 保留
iris, core/router#StaticEmbeddedHandler
并移除core/router/APIBuilder#StaticEmbeddedHandler
, (Handler
后缀) 这是全局性的,与Party
APIBuilder
无关。 - 修正 路径
{}
中的路径清理 (我们已经在 解释器 级别转义了这些字符, 但是一些符号仍然被更高级别的API构建器删除) , 例如\\
字符串的宏函数正则表达式内容 927 by commit e85b113476eeefffbc7823297cc63cd152ebddfd - 同步
golang.org/x/sys/unix
我们使用新工具将静态文件的速度提高了8倍, https://github.com/kataras/bindata 这是 go-bindata 的一个分支,对我们来说,一些不必要的东西被移除了,并且包含一些提高性能的补充。
Reqs/sec 使用 shuLhan/go-bindata 和 备选方案对比
Reqs/sec 使用 kataras/bindata
新增 方法 Party#StaticEmbeddedGzip
与 Party#StaticEmbedded
参数相同. 不同处在于 新增 StaticEmbeddedGzip
从 bindata
接收 GzipAsset
和 GzipAssetNames
(go get -u github.com/kataras/bindata/cmd/bindata).
你可以在同个文件夹里同时使用 bindata
和 go-bindata
工具, 第一个用于嵌入静态文件 (javascript, css, ...) 第二个用于静态编译模板!
完整示例: _examples/file-server/embedding-gziped-files-into-app/main.go.
-
只有一项 API 更改 Application/Context/Router#RouteExists, 将
Context
作为第一参数,而不是最后一个。 -
修正 cors 中间件 https://github.com/iris-contrib/middleware/commit/048e2be034ed172c6754448b8a54a9c55debad46, 相关问题: kataras#922 (目前仍在等待验证).
-
添加
Context#NextOr
和Context#NextOrNotFound
方法
// NextOr 检查程序链上是否有下一个处理程序,如果是,则执行它
// 否则根据给定的处理程序设置分配给 Context 程序链,并且执行第一个控制器。
//
// 如果下一个处理器存在并执行,则返回true,否则返回false
//
// 请注意,如果没有找到下一个处理程序并且处理程序缺失,
// 会发送 (404) 状态码到客户端,并停止执行。
NextOr(handlers ...Handler) bool
// NextOrNotFound 检查程序链上是否存在下一个处理程序,如果有则执行
// 其他情况会发送 404 状态码,并停止执行。
//
// 如果下一个控制器存在并执行,返回 true , 其他情况 false.
NextOrNotFound() bool
-
新增方法
Party#AllowMethods
如果在Handle, Get, Post...
之前调用,则会将路由克隆到该方法. -
修复 POST 请求尾部斜杠重定向问题: kataras#921 https://github.com/kataras/iris/commit/dc589d9135295b4d080a9a91e942aacbfe5d56c5
-
新增示例 通过
iris#UnmarshalerFunc
自定义解码, 新增context#ReadXML
使用示例, 相关示例via https://github.com/kataras/iris/commit/78cd8e5f677fe3ff2c863c5bea7d1c161bf4c31e. -
新增自定义路由宏功能示例, 相关讨论 kataras#918, 示例代码, https://github.com/kataras/iris/commit/a7690c71927cbf3aa876592fab94f04cada91b72
-
为
Pongo
新增AsValue()
和AsSaveValue()
@neenar kataras#913 -
删除
context#UnmarshalBody
上不必要的反射 https://github.com/kataras/iris/commit/4b9e41458b62035ea4933789c0a132c3ef2a90cc
修正 子域名 (subdomain) 的 StaticEmbedded
和 StaticWeb
不存在错误, 由 @speedwheel 通过 facebook page's chat 反馈。
新的小版本, 因为它包含一个 破坏性变动 和一个新功能 Party#Reset
正如 @likakuli 指出的那样 kataras#901, 以前 Done
注册的处理器,在全局范围内会替代子处理器,因为在引入 UseGlobal
这概念之前,缺少稳定性. 现在是时候了, 新的 Done
应该在相关的路由之前调用, 新增 DoneGlobal
之前的Done
使用相同; 顺序无关紧要,他只是结束处理附加到当前的注册程序, 全局性的 (所有子域名,分组).
routing/writing-a-middleware 路由中间件示例更新, 列举了使用方式变化, 如果之前使用过 Iris ,并熟悉内置函数方法名称,请区分 DoneGlobal
和 Done
的不同.
新增 Party#Reset()
函数,以便重置上级分组通过 Use
和 Done
注册的处理方法, 没有什么特别之处,它只是清除当前分组实例的 middleware
和 doneHandlers
,详情参见 core/router#APIBuilder
.
只需要将现有的 .Done
替换为 .DoneGlobal
就可以了。
新特性:
- 多级域名跳转, 相关示例 here
- 缓存中间件携带
304
状态码, 缓存期间的请求,服务器只响应状态, 相关示例 here websocket/Connection#IsJoined(roomName string)
新增方法,检查用户是否加入房间。 未加入的连接不能发送消息,此检查是可选的.
详情:
- 更新上游 vendor/golang/crypto 包到最新版本, 我们总是跟进依赖关系的任何修复和有意义的更新.
- 改进:不在gzip响应的WriteString和Writef上强制设置内容类型(如果已经存在的话)
- 新增:websocket/Connection#IsJoined
- 修复:#897
- 新增:context#StatusCodeNotSuccessful 变量用来定制 rfc2616-sec10
- 修复:示例 routing/dynamic-path/main.go#L101
- 新增:缓存中间件
iris.Cache304
- 修复:示例 csrf
- 取消:Configuration.RemoteAddrHeaders 默认值
- 新增:vscode 扩展链接和徽章
- 新增:
app.View
示例 用于解析和编写HTTP之外的模板(类似于上下文#视图) - 新增:支持多级域名跳转.
建议升级, 包含几天前修复了 letsencrypt.org 禁用 tls-sni 的问题,这导致几乎每个启用了 https 的 golang 服务器都无法正常工作,因此支持添加了 http-01 类型。 现在服务器会尝试所有可用的 letsencrypt 类型。
更多相关资讯:
- https://letsencrypt.status.io/pages/incident/55957a99e800baa4470002da/5a55777ed9a9c1024c00b241
- https://github.com/golang/crypto/commit/13931e22f9e72ea58bb73048bc752b48c6d4d4ac
该版本暂未发现重大问题,但如果你使用 cache 包的话,这里有些更新或许正好解决某些问题。
- 修复缓存在同一控制器多个方法中,返回相同内容问题 kataras#852, 问题报告:kataras#850
- 问题修正 kataras#862
- 当
view#Engine##Reload
为 true,ExecuteWriter -> Load
不能同时使用问题,相关问题 :kataras#872 - 由Iris提供支持的开源项目的徽章, 学习如何将徽章添加到您的开源项目中 FAQ.md
- 上游更新
golang/crypto
修正 tls-sni challenge disabled https://github.com/golang/crypto/commit/13931e22f9e72ea58bb73048bc752b48c6d4d4ac (关系到 iris.AutoTLS)
- 中文版 README_ZH.md and HISTORY_ZH.md 由 @Zeno-Code 翻译 kataras#858
- 俄语版 README_RU.md 由 @merrydii 翻译 kataras#857
- 希腊版 README_GR.md and HISTORY_GR.md https://github.com/kataras/iris/commit/8c4e17c2a5433c36c148a51a945c4dc35fbe502a#diff-74b06c740d860f847e7b577ad58ddde0 and https://github.com/kataras/iris/commit/bb5a81c540b34eaf5c6c8e993f644a0e66a78fb8
- A Todo MVC Application using Iris and Vue.js
- A Hasura starter project with a ready to deploy Golang hello-world web app with IRIS
我们必须感谢 Mrs. Diana 帮我们绘制的漂亮 logo!
如果有设计相关的需求,你可以发邮件给他,或者通过 instagram 给他发信息。
在这个版本中,有许多内部优化改进,但只有两个重大变更和新增一个叫做 hero 的特性。
新版本有 75 + 的变更提交, 如果你需要升级 Iris 请仔细阅读本文档。 为什么版本 9 跳过了? 你猜...
新增包 hero 可以绑定处理任何依赖 handlers
的对象或函数。Hero funcs 可以返回任何类型的值,并发送给客户端。
之前的绑定没有编辑器的支持, 新包
hero
为 Iris 带来真正的安全绑定。 Iris 会在服务器运行之前计算所有内容,所以它执行速度高,接近于原生性能。
下面你会看到我们为你准备的一些截图,以便于理解:
hero funcs
非常容易理解,当你用过之后 在也回不去了.
示例:
如果要使用 mvc
,必须先理解 hero
包,因为mvc
在内部使用hero
作为路由控制器的方法,同样的规则也适用于你的控制器的方法。
With this version you can register any controller's methods as routes manually, you can get a route based on a method name and change its Name
(useful for reverse routing inside templates), you can use any dependencies registered from hero.Register
or mvc.New(iris.Party).Register
per mvc application or per-controller, you can still use BeginRequest
and EndRequest
, you can catch BeforeActivation(b mvc.BeforeActivation)
to add dependencies per controller and AfterActivation(a mvc.AfterActivation)
to make any post-validations, singleton controllers when no dynamic dependencies are used, Websocket controller, as simple as a websocket.Connection
dependency and more...
示例:
如果你之前使用过 MVC ,请仔细阅读:MVC 包含一些破坏性的改进,但新的方式可以做更多,会让程序执行更快
请阅读我们为你准备的示例
如果你现在需要升级,请对比新旧版本示例的不同,便于理解。
移除旧版本的常量 context.DefaultMaxMemory
替换为配置 WithPostMaxMemory
方法.
// WithPostMaxMemory 设置客户端向服务器 post 提交数据的最大值
// 他不同于 request body 的值大小,如果有相关需求请使用
// `context#SetMaxRequestBodySize` 或者 `iris#LimitRequestBodySize`
//
// 默认值为 32MB 或者 32 << 20
func WithPostMaxMemory(limit int64) Configurator
如果你使用老版本的常量,你需要更改一行代码.
使用方式:
import "github.com/kataras/iris"
func main() {
app := iris.New()
// [...]
app.Run(iris.Addr(":8080"), iris.WithPostMaxMemory(10 << 20))
}
新方法可以多文件上传, 应用于常见的上传操作, 它是一个非常有用的函数。
// UploadFormFiles 将所有接收到的文件从客户端上传到系统物理位置 destDirectory。
//
// The second optional argument "before" gives caller the chance to
// modify the *miltipart.FileHeader before saving to the disk,
// it can be used to change a file's name based on the current request,
// all FileHeader's options can be changed. You can ignore it if
// you don't need to use this capability before saving a file to the disk.
//
// Note that it doesn't check if request body streamed.
//
// Returns the copied length as int64 and
// a not nil error if at least one new file
// can't be created due to the operating system's permissions or
// http.ErrMissingFile if no file received.
//
// If you want to receive & accept files and manage them manually you can use the `context#FormFile`
// instead and create a copy function that suits your needs, the below is for generic usage.
//
// The default form's memory maximum size is 32MB, it can be changed by the
// `iris#WithPostMaxMemory` configurator at main configuration passed on `app.Run`'s second argument.
//
// See `FormFile` to a more controlled to receive a file.
func (ctx *context) UploadFormFiles(
destDirectory string,
before ...func(string, string),
) (int64, error)
这里是相关示例 here.
这里有个小更新,增加可选的第二个参数,用来绑定模版变量。提示:这种绑定方式,会忽略其他变量的绑定。
如果要忽略其他模版变量,之前是在 ViewData
上绑定一个空字符串,现在可以直接通过 View 方法添加。
func(ctx iris.Context) {
ctx.ViewData("", myItem{Name: "iris" })
ctx.View("item.html")
}
等同于:
func(ctx iris.Context) {
ctx.View("item.html", myItem{Name: "iris" })
}
html 模版中调用: {{.Name}}
新增 context#YAML
函数, 解析结构体到 yaml。
//使用 yaml 包的 Marshal 的方法解析,并发送到客户端。
func YAML(v interface{}) (int, error)
sessions/session#GetString
可以获取 session 的变量值(可以是 integer 类型),就像内存缓存、Context 上下文储存的值。