====== 使用 MC-Publish 将模组发布到 Curseforge、Modrinth 和 Github ======
:!: **本页翻译自 [[tutorial:publishing_mods_using_github_actions]],如有过时的地方可参考原文。**
MC-Publish 是一个 GitHub action,由 Kir-Antipov 制作,可以在 GitHub、CurseForge 和 Modrinth API 中交互,以上传您的模组文件。本页面会大致描述基本的设置过程,你需要 [[https://github.com/Kir-Antipov/mc-publish#publish-minecraft-mods---github-action|阅读 GitHub 文档以了解详细信息。]]
===== 什么是 GitHub Actions? =====
[[https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions|Github Actions]] 本质上是由 GitHub 服务器执行的命令,可以免费试用,只要你的 GitHub 存储库是公开的,且有限制,如果不是那么就不会妨碍您的使用。在软件开发中,Github Actions 和类似的工作流自动化系统是标准场所,并且极大地帮助您使得部署过程(例如发布新版本的模组)尽可能无缝衔接。
如果您不愿手动将您的模组上传到多个平台上,那么这就是解决方案。
===== 开始之前 =====
您需要已完成以下操作:
- 在 GitHub 上,创建您的模组的存储库
- 将您的模组的一个版本上传到 Curseforge 和 Modrinth 上并且被批准
===== 设置 =====
如果需要让 GitHub 为我们做点什么,我们需要告诉服务器,我们到底需要什么。因此,我们需要在 ''/.github/workflows'' 中创建一个 ''.yml'' 文件。你可以将这个 ''.yml'' 文件想象成您的 GitHub Action 的配置文件。文件的命名方式不重要,但您应该选择一个相关的名称。YAML 的概念与 JSON 的类似,但是语法不同。就像 Python 那样,你不需要使用花括号 ''{}'',而只需要使用缩进来声明你的结构。
你的 ''.yml'' 文件的基本结构看上去应该像这样:
name: 发布到 Github、Curseforge 和 Modrinth #你的 github.com 上的 GitHub Action 的名称
on: [ pull_request, workflow_dispatch ] #何时执行你的 GitHub Action,'pull_request' -> 在每次合并(拉取)请求,'workflow_dispatch' -> 允许通过 github.com 手动执行
env: #环境变量,后续可以使用 ${{ env.MINECRAFT_VERSION }} 引用,可以用作重复的信息并允许后续模组新的更新中快速更改
MINECRAFT_VERSION: 1.19.2
JAVA_VERSION: 17
permissions:
contents: write
jobs: #在这里你就会实际告诉 GitHub 的服务器需要做什么
build: #要发布你的模组,你只需要一个 job,这里称为 build。
runs-on: ubuntu-latest #'runs-on' 指定了操作系统(linux)。
steps: #在 'steps' 中你会列举出所有单独的命令,例如 Kir-Antipov 的 MC-Publish。
...
我建议保持 ''on: [ pull_request, workflow_dispatch ]'' 并相应地使用 git 分支。这意味着,在每个分支上开发自己的更新,并在准备发布的时候合并到主分支中。如果这个确实无法满足你的需求,可以[[https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows|检查不同的触发]]或者直接使用 ''workflow_dispatch''。记住,设置的时候你不需要意外地运行你的 GitHub Action。
基本的环境变量应该包括:
* Minecraft 版本
* Java 版本
* 你的模组版本
* 你的模组发行名称
* 发布令牌(后面讲到)
==== 发布步骤 ====
这可以说是你的 ''.yml'' 文件中最重要的部分!
首先我们需要看看一个步骤的语法,准备所有的先行步骤,然后在走 MC-Publish。
=== 语法 ===
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 示例设置
if: ${{ condition is met }}
uses: actions/common-action
with:
variable1: 一些值
variable2: 另一些值
run: ls -a
- name: 另一个示例设置
...
* ''name'' 步骤的名称,应该准确描述该步骤。
* ''if'' 需要返回 true 的条件,符合条件才执行步骤。
* ''uses'' 这里你可以指定额外的 GitHub Action。你应该自己编写一切,但如果已经有人帮你写好了呢?Kir-Antipov 的 MC-Publish 就是其中一个例子。
* ''with'' 如果你指定 GitHub Action 时使用了 ''uses'',你可以输入预先定义的变量以及各自的值。
* ''run'' 在命令行中执行命令。
=== 先行步骤 ===
以下步骤复制了你能够在电脑上开发模组之前需要完成的步骤,就想象一下你是一个简单的 linux 服务器,突然有人想要你上传他们的 minecraft 模组,你甚至不知道 Java 是什么。
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检查环境变量
run: env
- name: 签出存储库
uses: actions/checkout@v3
with:
submodules: true
- name: 设置 Java
uses: actions/setup-java@v2
with:
distribution: "temurin"
java-version: 17
- name: 使 Gradle Wrapper 可执行
if: ${{ runner.os != 'Windows' }}
run: chmod +x ./gradlew
- name: 构建
run: ./gradlew clean build
...
虽然上面这些步骤是必要的,但是你不需要完全理解。如果你有兴趣想要完全理解的话,我建议你入门 linux。
执行“Build”步骤可能要最长时间(大概 3 分钟),所以不要担心是否出错,出错了会提示的。
=== MC-Publish ===
本段落本质上并不完整,如要有全面的了解可以 [[https://github.com/Kir-Antipov/mc-publish#publish-minecraft-mods---github-action|检查 MC-Publish 的官方 GitHub 文档]]。
jobs:
build:
runs-on: ubuntu-latest
steps:
...
- name: 发布(CurseForge/Modrinth/Github)
uses: Kir-Antipov/mc-publish@v3.2 #指定 MC-Publish Github Action 版本 3.2
with:
curseforge-id: 123456 #你的 curseforge 项目的 id
curseforge-token: "${{env.CURSEFORGE_TOKEN}}"
modrinth-id: 1q2w3e4r #你的 modrinth 项目的 id
modrinth-token: "${{env.MODRINTH_TOKEN}}"
github-tag: "v${{env.VERSION}}"
github-token: "${{env.GITHUB_TOKEN}}"
name: "${{env.RELEASE_NAME}}"
version: "${{env.VERSION}}"
version-type: release
changelog-file: CHANGELOG.md #指定新更新的内容的文件(路径从项目根目录开始)
loaders: fabric
game-versions: "${{env.MINECRAFT_VERSION}}"
java: "${{env.JAVA_VERSION}}"
''CURSEFORGE_TOKEN''、''MODRINTH_TOKEN'' 和 ''GITHUB_TOKEN'' 本质上是用来验证你自己的密码,这意味着对应了你的账号,而不是你的模组。这可以确保只有你能通过 API 来推送更新。当你正常上传的时候,你会在登录的时候验证自己。在哪里找到这些令牌呢?每个平台有不同的步骤:
**//Github//** Settings > Developer Settings > Personal access tokens > Tokens (classic) => 按 "Generate new token" and choose classic => select the 'repo' scope (write a descriptive note, 90 days
expiration is recommended, you will need to generate a new token afterwards) => 按"Generate token"
**//Modrinth//** Settings => Authorization token
**//Curseforge//** Settings > My API Tokens => 选择一个描述性的名称并点击 "Generate Token"
It is **strongly recommended** that you save the authentication tokens somewhere safe, e.g. a password manager. **Github //won't// let you access your token after you have generated it!**
**强烈建议**将这些令牌存储在安全的地方,例如密码管理器。**GitHub//不会//在你生成之后让你访问这些令牌!**
现在你有了需要的所有令牌,你需要让 GitHub Action 能够访问这些令牌。到你的 GitHub 模组存储库的 Settings 页面,并前往 Secrets > Actions。将所有的令牌添加为 secrets。你需要在你的 ''.yml'' 文件中引用你在这里提供的名称。例如,命名为 ''PUBLISH_CURSEFORGE_TOKEN'' 的 secret 可以这样引用:
${{ secrets.PUBLISH_CURSEFORGE_TOKEN }}
==== 完整的 .yml 例子 ====
name: 发布到 Github、Curseforge 和 Modrinth
on: [ pull_request, workflow_dispatch ]
env:
MINECRAFT_VERSION: 1.19.2
JAVA_VERSION: 17
VERSION: 1.1.0+1.19.2
RELEASE_NAME: 用于 Minecraft 1.19.2 的示例模组 1.1.0
MODRINTH_TOKEN: ${{ secrets.PUBLISH_MODRINTH_TOKEN }}
CURSEFORGE_TOKEN: ${{ secrets.PUBLISH_CURSEFORGE_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PUBLISH_GITHUB_TOKEN }}
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检查环境变量
run: env
- name: 签出存储库
uses: actions/checkout@v3
with:
submodules: true
- name: 设置 Java
uses: actions/setup-java@v2
with:
distribution: "temurin"
java-version: 17
- name: 使 Gradle Wrapper 可执行
if: ${{ runner.os != 'Windows' }}
run: chmod +x ./gradlew
- name: 构建
run: ./gradlew clean build
- name: 发布(CurseForge/Modrinth/Github)
uses: Kir-Antipov/mc-publish@v3.2
with:
curseforge-id: 123456
curseforge-token: "${{env.CURSEFORGE_TOKEN}}"
modrinth-id: 1q2w3e4r
modrinth-token: "${{env.MODRINTH_TOKEN}}"
github-tag: "v${{env.VERSION}}"
github-token: "${{env.GITHUB_TOKEN}}"
name: "${{env.RELEASE_NAME}}"
version: "${{env.VERSION}}"
version-type: release
changelog-file: CHANGELOG.md
loaders: fabric
game-versions: "${{env.MINECRAFT_VERSION}}"
java: "${{env.JAVA_VERSION}}"
===== 设置完成 =====
回顾一下,这是您现在应该拥有的:
* Wie每个平台新生成的验证令牌
* 验证令牌存储在你的 GitHub 存储库的 secrets 中
* 在 ''/.github/workflows'' 的一个 ''.yml'' 文件,并推送到你的 GitHub 存储库中
* 你的项目根目录中的空白 ''CHANGELOG.md'' 文件
如果你拥有所有这些,你就完成了!您现在可以使用新创建的 Github Action 为您的模组部署更新!
===== 额外步骤 =====
以下是不适合一般教程的有用资源列表。
==== 更新检查列表 ====
更新你的模组时,你需要看看的几个地方。
* 更新版本号
* 在 ''src/fabric.mod.json'',中,在 ''"version": "1.1.0+1.19.2"''
* 在 ''gradle.properties''(通常情况),在 ''mod_version = 1.1.0+1.19.2''
* 在 ''.github/workflows/publish.yml'' 在 ''VERSION: 1.1.0+1.19.2'' 和 ''RELEASE_NAME: 用于 Minecraft 1.19.2 的示例模组 1.1.0''
* 更新 ''CHANGELOG.md'' 中的更新记录
* (如果你使用推荐的工作流程)将更新分支合并到当前默认分支
==== 处理依赖 ====
[[https://github.com/Kir-Antipov/mc-publish#dependencies|请检查官方文档]]。我建议使用 ''fabric.mod.json'' 方法。
==== 上传到 Modrinth 的错误 ====
由于 Modrinth 更新了 API,一些人可能在通过这些 API 上传时会遇到问题,这种情况下可以将 modrinth 的部分从 GitHub 和 Curseforge 分开。你可以复制 MC-Publish 步骤并删除 ''with'' 中的现在不必要的输入部分来轻松完成此操作。你现在应该有两个独立的步骤。
将发布到 modrinth 的步骤的版本更改为 2.1 -> ''uses: Kir-Antipov/mc-publish@v2.1''