从低版本迁移
JSX 支持 v4.10.3
在 4.10.3 版本中,我们正式引入了 JSX 支持。这意味着你可以在插件中使用 JSX 语法来构造消息元素了。要实现这一点,你需要对你的项目进行一些配置:
- 打开
tsconfig.base.json
文件并加入以下配置:
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "@satorijs/element",
},
}
- 将要使用 JSX 的文件后缀名修改为
.tsx
。
心跳更新 v4.10.4
在 4.10.4 版本中,我们调整了默认的心跳行为,这可能导致老用户升级时遭遇无限重启问题。可以执行下列操作进行升级:
- 先将 market 插件更新到最新版本 (最新版本支持批量更新)
- (非 v4.10.3 用户忽略此步骤) 在控制台中修改全局设置,将
heartbeatInterval
项的值改为6000
,heartbeatTimeout
项的值改为600000
,并点击「重载配置」按钮 - 在依赖管理中,通过下拉菜单将全部官方依赖修改为最新版本 (如果有 suggest 和 assets-* 依赖则选择移除),并点击「应用更改」按钮
- 更新完成后重启实例
- 在控制台中修改全局设置,将
heartbeatInterval
和heartbeatTimeout
项的值均改为0
,并点击「重载配置」按钮 - 再次重启实例
- 如果之前移除了 assets-* 插件,请重新前往插件市场进行安装
CLI 更新 v4.11.0
在 4.11.0 版本中我们移除了 @koishijs/cli 包,将其合并到了 koishi 中。这意味着你每次升级时不再需要同时升级两边了。但对于已经安装了 @koishijs/cli 的用户,你需要执行下列操作完成升级:
- 先完成 4.10.4 版本的更新,确保自己的版本号不小于 4.10.4
- 在依赖管理中,修改 koishi 的版本号到 4.11.0,并移除 @koishijs/cli
- 点击「应用更改」按钮
HMR 更新 v4.12.0
在 4.12.0 版本中,我们将模块热替换相关功能移至专门的插件 @koishijs/plugin-hmr 中。如果你使用了 hmr 插件,你需要执行下列操作完成升级:
- 安装最新版本的 @koishijs/plugin-hmr
- 修改你的配置文件,加上 模块热替换 中提到的部分
- 移除
package.json
文件中scripts.dev
的--watch
参数
插件市场更新 v4.13.0
在 4.13.0 版本中,我们将 @koishijs/plugin-market 插件分拆为了两个插件 market 和 config。其中 market 负责「插件市场」和「依赖管理」页面,而 config 则负责「插件配置」页面。直接将 market 插件更新到 2.0.0 或以上版本的用户会发现自己的「插件配置」页面消失,此时你需要执行下列操作完成升级:
- 首先确保你的 market 插件是最新版 (应该是 2.0.0 以上版本)
- 打开「插件市场」页面,安装最新版的 config 插件
- 打开「资源管理器」页面,找到
koishi.yml
文件,打开并编辑:
host: 127.0.0.1
port: 5140
maxPort: 5149
plugins:
...
...
config: {} # 加一行在这里,注意左侧缩进与 market 对齐
market:
...
...
- 点击右上角的保存按钮
- 重新启动 Koishi 实例
国际化更新 v4.13.0
在 4.13.0 版本中,我们也引入了多语言的回退机制。这意味者,所有涉及语言配置的地方都需要从单一的语言字符串修改为数组。具体包括以下几个地方:
- 应用配置项
locale
→i18n.locales
- 用户和频道的数据结构
locale
→locales
- 会话对象的属性
locale
→locales
用户无需留意这些改动,但开发者如果使用了上述 API 则需要进行迁移。
协议更新 v4.14.5
在 4.14.5 版本中,我们将协议库 Satori 升级到了 v3 alpha 版本。新版本引入了与分页 API 相关的不兼容更新。具体受影响的 API 如下:
bot.getChannelList()
bot.getFriendList()
bot.getGuildList()
bot.getGuildMemberList()
bot.getGuildRoleList()
bot.getMessageList()
bot.getReactionList()
上述 API 将不再返回 Promise<T[]>
而是返回一个 Promise<List<T>>
,包含 data
属性和可选的 next
属性。data
包含了当前页的数据,next
则表示下一页的分页令牌。此外,对于上述每一个 API,我们还额外提供了返回异步迭代器的版本:
for (const item of await bot.getChannelList()) // old
for await (const item of bot.getChannelIter()) // new
协议更新 v4.15.0
在 4.15.0 版本中,我们将协议库 Satori 升级到了 v3 正式版本。新版本引入了一系列涉及平台资源不兼容更新。
User
类型的 userId
属性改为 id
,同理对于 Channel
, Guild
, Message
也是如此。此外,Author
被重构为了 User
和 Member
两个部分。
Session
引入了 event
属性用于存放所有事件相关的资源。尽管我们在会话中提供了 访问器属性 以保证了大部分 API 的向下兼容,但对于没有提供访问器的事件属性,或是在使用 Bot API 的返回值时,你都需要手动修改代码。
Adapter.Server
和 Adapter.Client
两个基类被移除。现在可以直接使用 Adapter
基类,并通过 reusable
属性决定其是否可重用。
Bot
将实现 Login
资源,因此其上的用户数据将存放在 bot.user
中。此外,status
属性由字符串变为数值枚举。
encoder.results
的类型由 string[]
变为 Message[]
。
新增用于创建私聊频道的 bot.createDirectChannel()
,因此不再需要实现 bot.sendPrivateMessage()
。
Server 插件独立 v4.16.0
在 4.16.0 版本中,我们将 Server
服务从 Koishi 中分离出来,独立成了 @koishijs/plugin-server 插件。Koishi CLI 提供了自动迁移机制,因此任何使用 CLI 启动 Koishi 的用户无需进行任何操作。
如果你是将 Koishi 作为依赖调用的进阶开发者,你需要执行下列操作完成升级:
- 安装最新版本的 @koishijs/plugin-server 插件;
- 在你的代码中手动导入并加载该插件;
- 将你过去的
host
,port
,maxPort
,selfUrl
全局设置移动至 server 插件的配置项。
消息元素更新 v4.16.4
在 4.16.4 版本中,我们将 Koishi 内部的消息元素实现与 Satori 协议规范进行了对齐。涉及到以下 API 的变动:
<image>
元素更名为<img>
<img>
,<audio>
,<video>
,<file>
元素的url
属性改为src
如果你的插件用到了相关的特性,请参考下面的迁移指南:
- 如果你的插件发送了上述消息元素,你不需要进行任何修改
- 官方适配器插件 (和积极维护的社区适配器插件) 都进行了向下兼容
- 如果你使用了非官方的适配器并发现升级后无法发送图片,请联系适配器作者进行更新
- 如果你的插件接收并解析了上述消息元素,你可能需要调整你的解析逻辑
- 要从给定的消息中提取图片,可以使用
h.select()
方法 - 如果你的指令接受图片作为参数,可以直接使用
image
参数类型
- 要从给定的消息中提取图片,可以使用
对于适配器作者,请参考下面的迁移指南:
- 接收侧 (
Adapter
):请确保创建的会话中的消息元素均符合最新标准 - 发送侧 (
MessageEncoder
):请尽量同时支持新旧标准,例如使用以下代码:
if (type === 'image' || type === 'img') {
await sendImage(attrs.src || attrs.url)
}
HTTP 插件独立 v4.17.6
在 4.17.6 版本中,我们将 HTTP 服务从 Koishi 中分离出来,独立成了 @koishijs/plugin-http 插件。Koishi CLI 提供了自动迁移机制,因此任何使用 CLI 启动 Koishi 的用户无需进行任何操作。
如果你是将 Koishi 作为依赖调用的进阶开发者,你需要执行下列操作完成升级:
- 安装最新版本的 @koishijs/plugin-http 插件;
- (可选,如果你使用网络代理工具) 安装最新版本的 @koishijs/plugin-proxy-agent 插件;
- 在你的代码中手动导入并加载这两个插件;
- 将你过去的
request
全局设置移动至 http 插件的配置项; - (可选) 将你过去的
request.proxyAgent
全局设置移动至 proxy-agent 插件的配置项。
tsconfig
更新 v4.17.8
在 4.17.8 版本中,由于部分依赖的更新,我们对推荐的 tsconfig.json
配置进行了调整。如果你的项目使用了 TypeScript,并且在升级后发现无法通过编译,你可以打开 tsconfig.json
文件,并尝试执行下列修改以完成升级:
- 将
module
属性改为esnext
; - 将
moduleResolution
属性改为bundler
; - 将
emitDeclarationOnly
属性改为true
(或者添加这个属性)。
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler",
"emitDeclarationOnly": true,
},
}
注意,如果你的项目中存在多个 tsconfig.json
文件,你需要对每一个文件都进行上述修改 (通过 extends
继承其他文件中配置的除外)。