Update docs

This commit is contained in:
Him188 2021-01-11 21:11:33 +08:00
parent d1c9acf7f4
commit 55688f3193
5 changed files with 367 additions and 64 deletions

View File

@ -1,8 +1,6 @@
# Mirai - Configuring Projects
本文介绍如何在一个项目中使用 mirai。
mirai 使用纯 Kotlin 开发,兼容 JVM 平台语言如 Java最低要求 `JDK 1.8``Kotlin 1.4`。
本文介绍如何在一个 JVM 项目中使用 mirai。
### 选择版本
@ -21,7 +19,8 @@ mirai 使用纯 Kotlin 开发,兼容 JVM 平台语言如 Java最低要求 `
### 配置项目
如果你熟悉 Gradle只需要添加 `jcenter` 仓库和依赖 `net.mamoe:mirai-core:VERSION` 即可而不需要继续阅读。下文将详细解释其他方法。
- 如果你熟悉 Gradle只需要添加 `jcenter` 仓库和依赖 `net.mamoe:mirai-core:VERSION` 即可而不需要继续阅读。下文将详细解释其他方法。
- 如果你熟悉 Maven只需要添加 `jcenter` 仓库和依赖 `net.mamoe:mirai-core-jvm:VERSION` 即可而不需要继续阅读。下文将详细解释其他方法。
本文提供如下三种配置方法,但推荐使用 Gradle 构建。
@ -70,6 +69,17 @@ dependencies {
}
```
### 分离 API 和实现(可选)
mirai 在开发时需要 `net.mamoe:mirai-core-api`, 在运行时需要 `net.mamoe:mirai-core`。可以在开发和编译时只依赖 `mirai-core-api`
```kotlin
dependencies {
val miraiVersion = "1.3.3" // 替换为你需要的版本号
api("net.mamoe", "mirai-core-api", miraiVersion) // 编译代码使用
runtimeOnly("net.mamoe", "mirai-core", miraiVersion) // 运行时使用
}
```
## B. 使用 Maven

View File

@ -2,7 +2,7 @@
### Mirai 演进
Mirai 是不断前进的库,将来必定会发生 API 弃用和重构
Mirai 是不断前进的库,目标是提供稳定且高效的 API
维护者会严谨地推进每一项修改,并提供迁移周期(至少 2 个次版本)。
### 版本规范

303
docs/KotlinAndJava.md Normal file
View File

@ -0,0 +1,303 @@
# Mirai - Kotlin And Java
本章介绍部分 Kotlin 定义对应的 Java 定义,以帮助 Java 使用者理解 Mirai 的源代码。
每部分第一个代码块为 Kotlin 代码,第二个代码块为 Java 代码。
预计阅读时间5 分钟
#### 通用
- Kotlin 的定义都默认是 `public``final`
- Kotlin 不需要句末分号,通常以换行作为一个语句的结束
#### `class`
```kotlin
class A
```
```java
public final class A {
}
```
#### 构造器定义
以下几种 Kotlin 定义是等价的。
```kotlin
class A {
private val value: String
constructor(value: String) {
this.value = value
}
constructor(integer: Int) {
this.value = integer.toString()
}
}
```
```kotlin
class A(val value: String) { // 类定义后面的括号表示主构造器
constructor(integer: Int) : this(integer.toString())
}
```
对应的 Java 定义为:
```java
public final class A {
private final String value;
public A(String value) {
this.value = value;
}
public A(int integer) {
this.value = String.valueOf(integer);
}
}
```
通常 Kotlin class 都会有一个主构造器。
#### 构造器调用
Kotlin 不需要 `new` 关键字。
```kotlin
val a = A("test")
```
```java
A a = new A("test");
```
#### 函数
```kotlin
class A {
fun test(string: String): Int = 1
}
```
```java
public final class A {
public int test(String string) {
return 1;
}
}
```
#### 属性 `val`
- Kotlin 的 `val` 是不可变的,只能被赋值一次
- 编译器为 `val` 创建 `getter`
```kotlin
class A {
val value: String = "test"
}
```
```java
public final class A {
private final String value = "test";
public final String getValue() {
return value;
}
}
```
#### 属性 `var`
- Kotlin 的 `var` 相较于 `val` 是可变的,可以被多次赋值。
- 编译器为 `var` 创建 `getter``setter`
```kotlin
class A {
var value: String = "test"
}
```
```java
public final class A {
private String value = "test";
public final String getValue() {
return value;
}
public final String setValue(String value) {
this.value = value;
}
}
```
#### 顶层定义和 `const`
- Kotlin 的定义不一定需要在 `class` 中,允许直接存在于文件中的「顶层函数」和「顶层属性」
- `XXX.kt` 中的顶层定义会被编译为名为 `XXXKt``class`
- 顶层定义会被编译为 `static`
- `const` 可以修饰一个属性,编译器会把它编译为 Java 静态字段。
```kotlin
// Test.kt
val x: String = "xx"
const val CONST_VALUE: String = "cc"
fun foo() { }
```
```java
// TestKt.java
public final class TestKt {
public static final String CONST_VALUE = "cc"; // const val 没有 getter
private static final String x = "xx";
public static String getX(){
return x;
}
public static void foo() { }
}
```
#### 单例对象
- Kotlin `object` 定义一个单例对象
```kotlin
object Test
```
```java
public final class Test {
public static final Test INSTANCE = new Test();
private Test() {}
}
```
#### 静态
```kotlin
object Test {
val x = "x" // public String getX()
@JvmField val y = "y" // public static final String y;
@JvmStatic val z = "z" // public static String getZ()
}
```
```java
public final class Test {
public static final Test INSTANCE = new Test();
private Test() {}
private final String x = "x"; // val
public String getX() {
return x;
}
public static final String y = "y"; // @JvmField val
private final String z = "z"; // @JvmStatic val
public static String getZ() {
return z;
}
}
```
#### 静态
- Kotlin 没有 `static` 关键字,但可以通过 `@JvmStatic` 将一个函数编译为 `static`
```kotlin
object Test {
fun a() { }
@JvmStatic
fun b() { }
}
```
```java
public final class Test {
public static final Test INSTANCE = new Test();
private Test() {}
public void a() { }
public static void b() { }
}
```
#### 伴生对象
- `class` 可以拥有 `companion object`
- 伴生对象内的 `@JvmField` 定义将会被编译到外部 `class`
- 伴生对象内的 `@JvmStatic` 函数以成员方法编译到伴生对象,然后以静态方法编译到外部 `class`
```kotlin
class Test {
companion object {
@JvmField
val CONST: String = ""
fun a() { }
@JvmStatic
fun b() { }
}
}
```
```java
public final class Test {
public static final Companion Companion = new Companion();
public static final String CONST = "";
public static void b() {
Companion.b();
}
public static final class Companion {
public void a() { }
public void b() { }
}
}
```
#### 协程
Kotlin 协程是语言级特性,`suspend` 修饰的函数会在编译期被处理。
```kotlin
class A {
suspend fun getValue(): String { /* ... */ }
}
```
```java
public final class A {
public Object getValue(Continuation<? super String> $completion) {
// 由 Kotlin 编译器生成非常复杂的方法体
}
}
```
`$completion` 参数类似于一个回调。需要熟悉 Kotlin 协程原理才能实现。为帮助 Java 用户mirai 使用编译器插件处理 `suspend` 函数。
```kotlin
class A {
@JvmBlockingBridge
suspend fun getValue(): String { /* ... */ }
}
```
```java
public final class A {
public Object getValue(Continuation<? super String> $completion) {
// 由 Kotlin 编译器生成非常复杂的方法体
}
// 通过 @JvmBlockingBridge 生成的方法
public String getValue() {
// 由 @JvmBlockingBridge 的编译器生成方法体,调用 getValue(Continuation)
}
}
```
Java 使用者可以认为 `@JvmBlockingBridge suspend fun getValue(): String` 相当于 `fun getValue(): String`

View File

@ -2,13 +2,19 @@
***此文档假设你是 JVM 平台的开发者。若不是,请参考 [其他语言 SDK](README.md#确定-sdk)***
本章节介绍 Mirai 的环境和开发要求。预计阅读时间 2 分钟。
## JVM 环境要求
- 桌面 JVM最低 Java 8但推荐 Java 11要使用一键启动器需要 11
- AndroidAndroid SDK 26+ Android 8.0Oreo)
**但注意不要使用 Oracle JDK**[原因](https://github.com/mamoe/mirai/discussions/779)),推荐使用 OpenJDK可以在 [Red Hat Developer](https://developers.redhat.com/products/openjdk/download) 下载)。
**但注意不要使用 Oracle JDK**[原因](https://github.com/mamoe/mirai/discussions/779)),可以使用其他任何 JDK。
> 实用链接:
> [AdoptOpenJDK 下载](https://adoptopenjdk.net/)
> 如果你使用 IntelliJ IDEA可以在 `Project Structure`(`Ctrl+Shift+Alt+S`) -> `SDKs` -> `+` -> `Download JDK` 下载 JDK。
## 开发的准备工作
@ -16,39 +22,20 @@
推荐使用 [IntelliJ IDEA](https://www.jetbrains.com/idea/) 或 [Android Studio](https://developer.android.com/studio)。Mirai 提供一系列 IntelliJ 插件来提升开发体验。
- [Kotlin Jvm Blocking Bridge](https://github.com/mamoe/kotlin-jvm-blocking-bridge) ([JetBrains 插件仓库](https://plugins.jetbrains.com/plugin/14816-kotlin-jvm-blocking-bridge), [一键安装](https://plugins.jetbrains.com/embeddable/install/14816))**帮助 Java 用户调用 Kotlin suspend 函数**
- [Mirai Console IntelliJ](https://github.com/mamoe/mirai-console/tree/master/tools/intellij-plugin) ([JetBrains 插件仓库](https://plugins.jetbrains.com/plugin/15094-mirai-console), [一键安装](https://plugins.jetbrains.com/embeddable/install/15094)):提供错误检查等功能
- [Kotlin Jvm Blocking Bridge](https://github.com/mamoe/kotlin-jvm-blocking-bridge) ([查看 JetBrains 插件仓库](https://plugins.jetbrains.com/plugin/14816-kotlin-jvm-blocking-bridge) / [点击一键安装](https://plugins.jetbrains.com/embeddable/install/14816))**帮助 Java 用户调用 Kotlin suspend 函数**
- [Mirai Console IntelliJ](https://github.com/mamoe/mirai-console/tree/master/tools/intellij-plugin) ([查看 JetBrains 插件仓库](https://plugins.jetbrains.com/plugin/15094-mirai-console) / [点击一键安装](https://plugins.jetbrains.com/embeddable/install/15094)):提供 mirai-core 的错误检查和 mirai-console 的插件开发辅助
*如果你不知道这俩是什么,安装就对了。*
如果使用 Kotlin 开发,可以不安装插件。但非常推荐安装 Mirai Console IntelliJ 以获得一些错误检查功能。
如果使用 Java 或其他语言,请务必安装 Kotlin Jvm Blocking Bridge否则会无法使用[为什么?](KotlinAndJava.md#协程))。同时请确保 Kotlin 插件是最新版本(在 `Settings -> Plugins` 启用并更新 Kotlin 到最新)。
*如果你不知道这俩是什么,都安装就对了。*
## 前置知识
要能流畅使用 Mirai, 建议学习:
Kotlin 是[让开发人员更快乐的一门现代编程语言](https://www.kotlincn.net/),由 [IntelliJ IDEA](https://www.jetbrains.com/idea/) 的开发公司 [JetBrains](https://www.jetbrains.com/) 维护,被 Google 推举为 Android 首选编程语言。
- 掌握 Java 基础
- 粗略了解 Kotlin 基础语法15 分钟):
- [基本类型](https://www.kotlincn.net/docs/reference/basic-types.html)
- [类与继承](https://www.kotlincn.net/docs/reference/classes.html)
- [属性与字段](https://www.kotlincn.net/docs/reference/properties.html)
- [接口](https://www.kotlincn.net/docs/reference/interfaces.html)
- [扩展](https://www.kotlincn.net/docs/reference/extensions.html)
- [数据类](https://www.kotlincn.net/docs/reference/data-classes.html)
- [对象](https://www.kotlincn.net/docs/reference/object-declarations.html)
- [密封类](https://www.kotlincn.net/docs/reference/sealed-classes.html)
- **[Java 中调用 Kotlin](https://www.kotlincn.net/docs/reference/java-to-kotlin-interop.html)**
- 对于 Java 使用者请阅读1 分钟):
- [在 Java 使用 Kotlin `suspend` 函数](#在-java-使用-kotlin-suspend-函数)
使用 Mirai 是一个不错的学习 Kotlin 机会,使用者可以在 [官方中文文档](https://www.kotlincn.net/docs/reference/) 学习 Kotlin。
### 在 Java 使用 Kotlin `suspend` 函数
`suspend` 函数中文是「挂起函数」,是 Kotlin 「[协程](https://www.kotlincn.net/docs/reference/coroutines/coroutines-guide.html)」的一部分。例如 `public suspend fun foo(): String``suspend` 修饰,它就是一个挂起函数。
对于一个挂起函数:
```kotlin
suspend fun test(): String
```
它会被 Kotlin 编译器编译为等同于 Java 的 `public Object test(Continuation<String> $completion)`。`Continuation` 类似一个回调,要实现它需要熟悉 Kotlin 协程实现原理。
Mamoe 为此开发了 Kotlin 编译器插件 [Kotlin Jvm Blocking Bridge](https://github.com/mamoe/kotlin-jvm-blocking-bridge),通过 `@JvmBlockingBridge` 注解,在编译期额外生成一个供 Java 使用的方法,让 Java 用户可以使用拥有源码内相同的函数签名的方法。
Java 开发者如果只希望使用 Mirai 而不学习 Kotlin可以阅读 [KotlinAndJava.md](KotlinAndJava.md)5 分钟)。

View File

@ -8,13 +8,11 @@
## 确定 SDK
mirai 官方提供 Kotlin/Java 等 JVM 平台语言开发支持。如果你不熟悉该语言,请使用以下社区提供的 SDK
### 基于 [`mirai-console`]
**mirai 官方提供 Kotlin/Java 等 JVM 平台语言开发支持。如果你不熟悉该语言,请使用以下社区提供的 SDK**
[`mirai-console`]: https://github.com/mamoe/mirai-console
这些 SDK 基于 [`mirai-console`],意味着需要使用 [`mirai-console`] 框架。[`mirai-console`] 也是 mirai 的官方项目之一
这些 SDK 基于 [`mirai-console`]。[`mirai-console`] 是 mirai 官方维护的一个*应用程序*。可以在 [这里](https://github.com/mamoe/mirai-console/blob/master/docs/Run.md) 了解如何启动 [`mirai-console`](也可以稍后在各 SDK 的说明中了解)
[mamoe/mirai-api-http]: https://github.com/mamoe/mirai-api-http
[iTXTech/mirai-native]: https://github.com/iTXTech/mirai-native
@ -32,43 +30,48 @@ mirai 官方提供 Kotlin/Java 等 JVM 平台语言开发支持。如果你不
[theGravityLab/ProjHyperai]: https://github.com/theGravityLab/ProjHyperai
[yyuueexxiinngg/cqhttp-mirai]: https://github.com/yyuueexxiinngg/cqhttp-mirai
| 技术 | 维护者及项目地址 | 描述 |
|:----------------|:--------------------------------------------|:-----------------------------------------------------------------------|
| *Http* | [mamoe/mirai-api-http] | Mirai 官方维护的 HTTP API 插件 |
| `JavaScript` | [iTXTech/mirai-js] | 支持使用 `JavaScript` 编写插件并**直接**与 mirai 交互 |
| `Python` | [Graia Framework][GraiaProject/Application] | 基于 `mirai-api-http` 的机器人开发框架 |
| `Node.js` | [RedBeanN/node-mirai] | mirai 的 Node.js SDK |
| `Go` | [Logiase/gomirai] | 基于 mirai-api-http 的 GoLang SDK |
| `Mozilla Rhino` | [StageGuard/mirai-rhinojs-sdk] | 为基于 Rhino(如 Auto.js 等安卓 app 或运行环境)的 JavaScript 提供简单易用的 SDK |
| `C++` | [cyanray/mirai-cpp] | mirai-http-api 的 C++ 封装,方便使用 C++ 开发 mirai-http-api 插件 |
| `C++` | [Chlorie/miraipp] | mirai-http-api 的另一个 C++ 封装,使用现代 C++ 特性,并提供了较完善的说明文档 |
| `C#` | [Executor-Cheng/mirai-CSharp] | 基于 mirai-api-http 的 C# SDK |
| `Rust` | [HoshinoTented/mirai-rs] | mirai-http-api 的 Rust 封装 |
| `TypeScript` | [YunYouJun/mirai-ts] | mirai-api-http 的 TypeScript SDK附带声明文件拥有良好的注释和类型提示 |
| `易语言` | [only52607/e-mirai] | mirai-api-http 的 易语言 SDK使用全中文环境开发插件适合编程新手使用 |
| `.Net/C#` | [Hyperai][theGravityLab/ProjHyperai] | 从 mirai-api-http 对接到机器人开发框架再到开箱即用的插件式机器人程序一应俱全 |
| *酷 Q 插件* | [iTXTech/mirai-native] | 支持酷 Q 插件在 mirai 上运行 |
| *酷 Q HTTP* | [yyuueexxiinngg/cqhttp-mirai] | 在 mirai-console 开启酷 Q HTTP 服务。 |
| 技术 | 维护者及项目地址 |
|:----------------|:--------------------------------------------|
| *Http* | [mamoe/mirai-api-http] |
| `JavaScript` | [iTXTech/mirai-js] |
| `Python` | [Graia Framework][GraiaProject/Application] |
| `Node.js` | [RedBeanN/node-mirai] |
| `Go` | [Logiase/gomirai] |
| `Mozilla Rhino` | [StageGuard/mirai-rhinojs-sdk] |
| `C++` | [cyanray/mirai-cpp] |
| `C++` | [Chlorie/miraipp] |
| `C#` | [Executor-Cheng/mirai-CSharp] |
| `Rust` | [HoshinoTented/mirai-rs] |
| `TypeScript` | [YunYouJun/mirai-ts] |
| `易语言` | [only52607/e-mirai] |
| `.Net/C#` | [Hyperai][theGravityLab/ProjHyperai] |
| *酷 Q 插件* | [iTXTech/mirai-native] |
| *酷 Q HTTP* | [yyuueexxiinngg/cqhttp-mirai] |
> *想在这里添加你的项目?欢迎提交 PR。*
### 基于 `mirai-core` 的 SDK
特别的,有一些 SDK 直接基于 mirai-core 开发,不需要 [`mirai-console`]
- `Lua`: [lua-mirai](https://github.com/only52607/lua-mirai) 基于 mirai-core 的 Lua SDK并提供了 Java 扩展支持,可在 Lua 中调用 Java 代码开发机器人
## 开发
## JVM 平台 Mirai 开发
- [准备工作](Preparations.md#mirai---preparations)
**Mirai 文档没有废话,请务必仔细阅读每一个字。仔细阅读文档花费的 1 分钟可能相当于不阅读文档而自己摸索解决办法的 1 小时。**
### 配置 JVM 项目使用 mirai
1. [准备工作2 分钟)](Preparations.md#mirai---preparations)
> 可以首先体验让机器人发送消息:在 IDE 克隆 [mirai-hello-world](https://github.com/project-mirai/mirai-hello-world) 并运行其中入口点。
2. 配置项目
要把 mirai 作为一个依赖库使用,请参考 [Configuring Projects](ConfiguringProjects.md)。
- 要把 mirai-core 嵌入一个应用使用,请阅读 [配置项目依赖](ConfiguringProjects.md)。
- 要为 [`mirai-console`] 框架开发插件,请阅读 [mirai-console 的配置插件项目](https://github.com/mamoe/mirai-console/blob/master/docs/ConfiguringProjects.md)。
要使用 mirai-console 框架,请前往 [mirai-console](https://github.com/mamoe/mirai-console)。
### API 文档
> 如果你不知道 [`mirai-console`] 是什么,请阅读 [Mirai 生态概览](mirai-ecology.md)。
>
> 如果你希望先确认 mirai 能够正常运行才能安心阅读文档,可克隆 [mirai-hello-world](https://github.com/project-mirai/mirai-hello-world) 并运行其中 Kotlin 或 Java 入口点 `main`
### mirai-core API 文档
***本文档正在更新中***