From d52ba02fceb42fa545ef09caffc2ead10b1b6dc4 Mon Sep 17 00:00:00 2001 From: 3TUSK Date: Fri, 24 Apr 2020 00:16:39 -0700 Subject: [PATCH 1/4] feat(ch.32): initial gradle cheatsheet --- SUMMARY.md | 2 +- chapter-01/forgegradle.md | 2 ++ chapter-32/dependencies/curse.md | 39 ++++++++++++++++++++++++++++++++ chapter-32/dependencies/index.md | 36 +++++++++++++++++++++++++++++ chapter-32/dependencies/local.md | 26 +++++++++++++++++++++ chapter-32/index.md | 24 ++++++++++++++++++++ 6 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 chapter-32/dependencies/curse.md create mode 100644 chapter-32/dependencies/index.md create mode 100644 chapter-32/dependencies/local.md create mode 100644 chapter-32/index.md diff --git a/SUMMARY.md b/SUMMARY.md index 8e8f2ede..4c8ebaa2 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -179,7 +179,7 @@ ### 附录 * [31. 附录 I:相关开发资源](chapter-31/index.md) -* [32. 附录 II:???](chapter-32/index.md) +* [32. 附录 II:Gradle](chapter-32/index.md) * [33. 附录 III:???](chapter-33/index.md) * [34. 附录 IV:???](chapter-34/index.md) * [35. 附录 V:???](chapter-35/index.md) diff --git a/chapter-01/forgegradle.md b/chapter-01/forgegradle.md index 29b088bd..59c65d90 100644 --- a/chapter-01/forgegradle.md +++ b/chapter-01/forgegradle.md @@ -2,6 +2,8 @@ ForgeGradle 是 Forge 开发团队推出的 Gradle 插件,主要用途就是简化基于 MCP+Forge 的 Minecraft Mod 开发的流程。 +如果你还不知道 Gradle 是什么,[可以考虑先读一下这个](../chapter-32/index.md)。 + ## 为什么? 思考一下 Mod 开发和发布的流程。通常的情况下,玩家面对的 Minecraft 使用的是混淆名,但是开发者在开发 Mod 时不太可能硬啃混淆名,而是使用某种形式的反混淆名(比如 MCP)。这样一来,当开发者编译 Mod 时,编译器是基于反混淆后的代码,而非玩家实际上使用的混淆代码进行编译的。如此一来,如果不先把 Mod 所引用的 Minecraft 底层代码混淆回去,Mod 是肯定无法运行的。同样的,为了方便开发 Mod,首先你要对 Minecraft 进行反混淆。 diff --git a/chapter-32/dependencies/curse.md b/chapter-32/dependencies/curse.md new file mode 100644 index 00000000..3cf0de95 --- /dev/null +++ b/chapter-32/dependencies/curse.md @@ -0,0 +1,39 @@ +# CurseMaven + +[CurseMaven](https://github.com/Wyn-Price/CurseMaven) 是个把整个 CurseForge 包装成一个 Maven 仓库的 Gradle 插件。 +有了 CurseMaven 你就能轻松解决“这个 Mod 在 CurseForge 上发布,但是没有提供任何 Maven 仓库”的棘手问题。就像这样: + +```groovy +buildscript { + repositories { + maven { + url = "https://plugins.gradle.org/m2/" + } + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + } + dependencies { + classpath 'com.wynprice.cursemaven:CurseMaven:2.1.1' // 声明我们会用到 CurseMaven,版本 2.1.1 + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + } +} + +apply plugin: 'net.minecraftforge.gradle.forge' +apply plugin: 'com.wynprice.cursemaven' // 加载 CurseMaven 这个插件 + +dependencies { + // 这里我们声明了 JEI 的依赖,并使用 deobfCompile 自动转换 mapping。 + // CurseMaven 最终会去这个地址下载 jar,注意结尾的数字: + // https://www.curseforge.com/minecraft/mc-mods/jei/files/2724420 + deobfCompile "curse.maven:jei:2724420" + + // 另一个例子:Astral Sorcery。我们要使用的是这个版本的 Astral Sorcery: + // https://www.curseforge.com/minecraft/mc-mods/astral-sorcery/files/2920254 + // 那么我们这么声明: + deobfCompile "curse.maven:astral-sorcery:2920254" +} + +// 其余无关内容略去 +``` \ No newline at end of file diff --git a/chapter-32/dependencies/index.md b/chapter-32/dependencies/index.md new file mode 100644 index 00000000..27812224 --- /dev/null +++ b/chapter-32/dependencies/index.md @@ -0,0 +1,36 @@ +# Gradle 的依赖管理 + +写 Minecraft Mod 的时候时常会需要跟其他 Mod 打交道,引用其他的 jar 在所难免。 + +## 引入新的依赖项目 + +[和普通的基于 Gradle 的 Java 项目完全一致][ref-1]。就像这样: + +```groovy +repositories { + // 我们在这里声明阿里云的 maven 镜像站。 + maven { + url = "https://maven.aliyun.com/repository/central" + } +} + +dependencies { + // Efficient Java Matrix Library (EJML) 是个专门解决线性代数相关问题的库。 + // 网站:http://ejml.org/ + compile 'org.ejml:all:0.30' +} +``` + +## 我怎么确定哪个 Maven 镜像有[Mod 名字]? + +很遗憾这个问题非常棘手。 +一般来说,Mod 发布页或者它的源码仓库的 README 会提及 Maven 相关的信息,但奈何不是所有 Modder 都有时间折腾这个。 + +天无绝人之路,你仍然有这么几个选择: + + - [CurseMaven](./curse.md) + - [使用 `mavenLocal()`](./local.md) + + +[ref-1]: https://docs.gradle.org/4.10.2/userguide/declaring_dependencies.html + diff --git a/chapter-32/dependencies/local.md b/chapter-32/dependencies/local.md new file mode 100644 index 00000000..c4ad03a9 --- /dev/null +++ b/chapter-32/dependencies/local.md @@ -0,0 +1,26 @@ +# 本地 Maven 仓库 + +Maven 不一定非得是在互联网的某个角落里,也可以是在你自己的电脑上。 +比如所谓的 `mavenLocal()` 仓库。 + +```groovy +repositories { + mavenLocal() +} + +dependencies { + deobfCompile 'my_mod:my_lib:0.1.0' +} +``` + +需要搭配 [`publishToMavenLocal` 任务](../publish/local.md)使用。 + +## 这个仓库究竟在我电脑上的什么地方? + +按照 [Gradle 手册][ref-1] 的说法,一般来说是 `${USER_HOME}/.m2/`。也就是说: + + - 对于 Windows,是 `%USERPROFILE%/.m2/`。基本上就是 `C:\Users\[用户名]\.m2`。 + - 对于 Linux、macOS 等深受 Unix 影响的系统,是 `$HOME/.m2/` + - 或者说是 `~/.m2`,如果你用的 Shell 支持展开 `~`。 + +[ref-1]: https://docs.gradle.org/current/userguide/declaring_repositories.html#sub:maven_local \ No newline at end of file diff --git a/chapter-32/index.md b/chapter-32/index.md new file mode 100644 index 00000000..8bafe6e3 --- /dev/null +++ b/chapter-32/index.md @@ -0,0 +1,24 @@ +# Gradle 速查指南 + +[Gradle](https://gradle.org) 是个构建工具。 +果你之前用过 [Maven](http://maven.apache.org/),那 Gradle 本质上就是个功能更强的 Maven。 + +Gradle 的存在让我们可以直接一行 `gradle build` 命令就能搞定编译(甚至是发布)而不用头疼别的什么。 + +而这一章附录则收录一些在使用 Gradle 甚至是 ForgeGradle 时会遇到的常见需求解决方案。 + +## 速查指南索引 + + - [依赖管理](./dependencies/index.md) + - [CurseMaven](./dependencies/curse.md) + - [`mavenLocal()`](./dependencies/local.md) + - [自动化](./automation/index.md) + - 读取配置文件 + - 自动生成 `MANIFEST.MF` + - 信息安全 + - Jar 签名 + - [构建与发布](./publish/index.md) + - Shadow/Shade + - [`publishToMavenLocal` 任务](./publish/local.md) + - CurseGradle + From f01ae2623fe989c8b73b8f4cb0bcde91abe91dcb Mon Sep 17 00:00:00 2001 From: 3TUSK Date: Fri, 24 Apr 2020 00:26:23 -0700 Subject: [PATCH 2/4] fix(gitbook): add index --- SUMMARY.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/SUMMARY.md b/SUMMARY.md index 4c8ebaa2..212ebe4a 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -180,6 +180,18 @@ * [31. 附录 I:相关开发资源](chapter-31/index.md) * [32. 附录 II:Gradle](chapter-32/index.md) + * [依赖管理](./dependencies/index.md) + * [CurseMaven](./dependencies/curse.md) + * [`mavenLocal()`](./dependencies/local.md) + * 自动化 + * 读取配置文件 + * 自动生成 `MANIFEST.MF` + * 信息安全 + * Jar 签名 + * 构建与发布 + * Shadow/Shade + * `publishToMavenLocal` 任务 + * CurseGradle * [33. 附录 III:???](chapter-33/index.md) * [34. 附录 IV:???](chapter-34/index.md) * [35. 附录 V:???](chapter-35/index.md) From ef079476640edabe4f4c47c3151fcd07f8684e6a Mon Sep 17 00:00:00 2001 From: 3TUSK Date: Fri, 24 Apr 2020 00:29:17 -0700 Subject: [PATCH 3/4] fix(gitbook): fix index again --- SUMMARY.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 212ebe4a..bcfeedcb 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -180,9 +180,9 @@ * [31. 附录 I:相关开发资源](chapter-31/index.md) * [32. 附录 II:Gradle](chapter-32/index.md) - * [依赖管理](./dependencies/index.md) - * [CurseMaven](./dependencies/curse.md) - * [`mavenLocal()`](./dependencies/local.md) + * [依赖管理](chapter-32/dependencies/index.md) + * [CurseMaven](chapter-32/dependencies/curse.md) + * [`mavenLocal()`](chapter-32/dependencies/local.md) * 自动化 * 读取配置文件 * 自动生成 `MANIFEST.MF` From adad407752e49af925258f3644367a0f2d09496a Mon Sep 17 00:00:00 2001 From: 3TUSK Date: Mon, 4 May 2020 15:04:04 -0700 Subject: [PATCH 4/4] feat(ch.32): encoding, publishToMavenLocal --- chapter-32/index.md | 1 + chapter-32/publish/encoding.md | 16 ++++++++++++++++ chapter-32/publish/maven-local.md | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 chapter-32/publish/encoding.md create mode 100644 chapter-32/publish/maven-local.md diff --git a/chapter-32/index.md b/chapter-32/index.md index 8bafe6e3..c5e4877c 100644 --- a/chapter-32/index.md +++ b/chapter-32/index.md @@ -18,6 +18,7 @@ Gradle 的存在让我们可以直接一行 `gradle build` 命令就能搞定编 - 信息安全 - Jar 签名 - [构建与发布](./publish/index.md) + - [强制指定编码方式](./publish/encoding.md) - Shadow/Shade - [`publishToMavenLocal` 任务](./publish/local.md) - CurseGradle diff --git a/chapter-32/publish/encoding.md b/chapter-32/publish/encoding.md new file mode 100644 index 00000000..b985d796 --- /dev/null +++ b/chapter-32/publish/encoding.md @@ -0,0 +1,16 @@ +# 强制指定编码方式 + +出于跨平台的考虑,习惯上 Mod 编译时使用 UTF-8 编码方式对字符进行编码。 +但是 Windows 家族的操作系统的默认编码方式不是 UTF-8。 +这可能会导致构建时因为出现所谓的“非法字符”而导致构建失败。你可以通过在 `build.gradle` 的结尾加上这样一段来强制指定编码方式: + +```groovy +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} +``` + +## `JavaCompile`? + +是的,这个选项是在 `JavaCompile` 这一个 task type 下的。 +如果你的 Mod 里还有别的类型的源码,换成对应的 task type 即可。 \ No newline at end of file diff --git a/chapter-32/publish/maven-local.md b/chapter-32/publish/maven-local.md new file mode 100644 index 00000000..7c83791f --- /dev/null +++ b/chapter-32/publish/maven-local.md @@ -0,0 +1,20 @@ +# 发布到本机 Maven 仓库 + +一个 Maven 仓库的本质是有特殊目录格式的目录,或称文件夹,可通过一串 URL 索引。 + +所以你大可以把你电脑上某个目录改装成 Maven 仓库。不过我们甚至连改装都不用——因为 `mavenLocal()` 已经在那了。 + +## `publishToMavenLocal` + +在命令行中执行 + +``` +./gradlew publishToMavenLocal +``` + +然后你的 Mod 就会去本机的 `mavenLocal()` 仓库里了。 +一般来说,这个仓库的真实位置是 `${USER_HOME}/.m2/`,也就是说: + + - 对于 Windows,是 `%USERPROFILE%/.m2/`。基本上就是 `C:\Users\[用户名]\.m2`。 + - 对于 Linux、macOS 等深受 Unix 影响的系统,是 `$HOME/.m2/` + - 或者说是 `~/.m2`,如果你用的 Shell 支持展开 `~`。 \ No newline at end of file