杀戮尖塔Mod开发入门:从加载失败到可调试工程
简介本资源是一份面向Java初学者与游戏模组开发新手的《杀戮尖塔》MOD制作系统入门教程聚焦零基础环境搭建与核心开发流程。内容覆盖ModTheSpire、StsLib、BaseMod三大依赖库的订阅与配置原理IntelliJ IDEA集成开发环境搭建Maven项目结构初始化含pom.xml关键依赖配置以及Mod代码编写基础——包括控制台调试、变量与函数使用、类作用域、监听机制、继承关系等面向对象实践要点。资源为单文件PDF文档1.5MB结构清晰含图示说明如MOD运行架构图、分步操作指引与典型代码片段便于边学边练。目前已有2097人学习下载适合希望从环境配置起步、扎实掌握杀戮尖塔MOD开发全流程的编程入门者与独立游戏爱好者。1. 为什么刚做完第一个Mod就崩溃在启动界面杀戮尖塔Mod制作不是改个JSON就能跑通的事你照着某篇“三分钟上手”的教程把mod.info填好、classes目录扔进mods文件夹、双击启动器——结果游戏卡在黑屏三秒后弹出报错窗口“Failed to load mod: No main class found”。这不是玄学是杀戮尖塔Slay the SpireMod生态里最典型的「信任陷阱」它表面是个Java桌面游戏实则用了一套高度定制的类加载机制反射入口资源热重载链你写的每个类都得精准对齐它的运行时契约差一个注解、少一行SpireInitializer、甚至包名里多一个空格都会让整个Mod变成黑匣子。这个标题说的不是“怎么写技能”而是“怎么让游戏承认你的代码存在”——它是所有后续功能新卡牌、新角色、新事件的前提是Mod开发者的「启动验证关」。适合刚配好JDK 17、能跑通HelloWorld但没碰过Java注解和Gradle依赖管理的开发者也适合被“Mod加载失败”反复暴击、想从根上理清类加载路径的老手。别急着抄技能逻辑先让System.out.println(Mod loaded!)真正在控制台里跳出来。2. 用Gradle JDK 17搭出可编译、可调试、可复现的Mod工程骨架杀戮尖塔Mod不是靠手动复制class文件硬塞进去的野路子它依赖一套稳定的构建链源码编译 → 字节码注入 → 资源打包 → 运行时加载。这套链的起点必须是一个能被IntelliJ或VS Code识别、能断点调试、能一键生成mod.jar的工程。常见误区是直接用IDE新建Java项目——它缺了三个关键东西StS官方SDK的依赖声明、字节码增强插件用于注入SpirePatch、以及资源路径映射规则。我们用Gradle来收口。2.1 初始化Gradle工程并声明StS SDK依赖在空目录下执行gradle init --type java-application --dsl kotlin --test-framework junit-jupiter然后编辑build.gradle.kts替换全部内容为plugins { java maven-publish } repositories { mavenCentral() // StS官方Maven仓库必须否则找不到BaseMod等核心类 maven { url uri(https://maven.scryfall.com/) } } dependencies { // 核心Mod框架版本必须与你本地StS游戏版本严格匹配 implementation(com.megacrit.cardcrawl:modthespire:3.4.0) implementation(com.evacipated.cardcrawl.mod:BaseMod:5.38.0) // 游戏本体SDK关键提供Card, AbstractPlayer等类定义 implementation(com.megacrit.cardcrawl:slay-the-spire:2.0.0) // 注意此版本号需与你Steam库中StS的版本一致 // 测试依赖方便写单元测试验证逻辑 testImplementation(org.junit.jupiter:junit-jupiter:5.10.0) } java { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } // 强制使用JDK 17编译StS 2.0已弃用JDK 8 tasks.withTypeJavaCompile { options.encoding UTF-8 options.release.set(17) }提示slay-the-spire:2.0.0这个坐标不是随便写的。它对应StS 2.0正式版2023年10月发布如果你玩的是Beta测试分支或旧版StS如1.19.x必须去 StS Modding Wiki 查对应SDK版本号。用错版本编译通过但运行时报NoClassDefFoundError——这是血泪经验。2.2 创建标准Mod结构mod.info、主类、资源目录Gradle工程建好后在src/main下创建以下结构src/main/ ├── java/ │ └── com/example/myfirstmod/ # 包名必须小写不能含大写字母或下划线 │ ├── MyFirstMod.java # 主初始化类必须有SpireInitializer │ └── patches/ # 存放所有SpirePatch类非必须但推荐 ├── resources/ │ ├── mod.info # 必须游戏靠它识别Mod元数据 │ └── images/ # 卡牌图标、角色立绘等图片放这里 └── assets/ # 音效、字体等二进制资源可选mod.info内容必须严格按JSON格式注意逗号和引号{ name: My First Mod, author: dev, description: A minimal working mod for learning., version: 0.1.0, stspire_version: 2.0.0, modthespire_version: 3.4.0, requires: [basemod] }参数说明stspire_version必须与build.gradle.kts中slay-the-spire依赖版本一致modthespire_version必须与modthespire依赖版本一致requires声明依赖的其他Mod如BaseMod是几乎所有Mod的基础文件名必须是mod.info全小写无扩展名错误且必须放在resources/根目录——放错位置游戏完全无视该Mod。2.3 写出第一个能被StS识别的主类SpireInitializer是钥匙在MyFirstMod.java中写package com.example.myfirstmod; import com.evacipated.cardcrawl.mod.stslib.patches.core.AbstractCreature.HpChangeEffect; import com.megacrit.cardcrawl.core.CardCrawlGame; import com.megacrit.cardcrawl.localization.UIStrings; import com.megacrit.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.modthespire.lib.SpirePatch; import com.megacrit.cardcrawl.modthespire.lib.SpireReturn; import com.megacrit.cardcrawl.screens.mainMenu.MainMenuScreen; SpireInitializer // 关键没有这行StS启动时根本不会扫描这个类 public class MyFirstMod { public static final String MOD_ID my_first_mod; // 构造函数不重要重点是静态初始化块 static { System.out.println([MyFirstMod] Initializing...); } // 此方法会被ModTheSpire自动调用必须是public static void无参数 public static void initialize() { System.out.println([MyFirstMod] Loaded successfully!); // 这里可以注册卡牌、角色、事件等 } // 可选打一个最简单的补丁验证patch机制是否生效 SpirePatch( clz MainMenuScreen.class, method update ) public static class TestPatch { public static SpireReturnVoid Prefix(MainMenuScreen _inst) { System.out.println([MyFirstMod] Patch executed on main menu update!); return SpireReturn.Continue(); } } }逻辑说明SpireInitializer是ModTheSpire的钩子它告诉加载器“这个类是Mod入口请在启动时执行其initialize()方法”initialize()方法名是约定死的不能改成init()或start()TestPatch是可选的但它能验证你是否真的打通了字节码注入链——如果控制台出现Patch executed...说明SpirePatch已生效包名com.example.myfirstmod必须全小写且与mod.info中name字段无强关联但必须和src/main/java/下的目录结构完全一致大小写敏感。3. 把Mod编译成jar并让StS真正加载它三步验证法编译出的jar包不是普通Java程序它必须满足StS的类加载器要求主类在META-INF/MANIFEST.MF中声明、资源路径与代码路径对齐、无冗余依赖。直接gradle build会生成带依赖的fat jar但StS不需要——它只加载你的代码资源依赖由ModTheSpire统一提供。3.1 用Gradle任务生成StS兼容的精简jar在build.gradle.kts末尾添加// 专门生成StS可用的mod.jar不含依赖仅代码resources val modJar by tasks.registering(Jar::class) { archiveBaseName.set(my_first_mod) from(sourceSets.main.get().output) from(sourceSets.main.get().resources.srcDirs) duplicatesStrategy DuplicatesStrategy.EXCLUDE manifest { attributes[Main-Class] com.example.myfirstmod.MyFirstMod attributes[Mod-ID] my_first_mod // 必须与mod.info中name一致 } } // 让build任务依赖它 tasks.named(build) { dependsOn(modJar) }执行./gradlew modJar生成的jar位于build/libs/my_first_mod.jar。参数说明archiveBaseNamejar文件名建议与mod.info中name小写化后一致如My First Mod→my_first_modfrom(sourceSets.main.get().output)只打包编译后的.class文件from(sourceSets.main.get().resources.srcDirs)只打包resources/下的文件含mod.infoduplicatesStrategy DuplicatesStrategy.EXCLUDE避免mod.info被重复打包导致解析失败manifest.attributes[Mod-ID]这是StS内部识别Mod的ID必须与mod.info中name完全一致包括大小写和空格不mod.info中name是显示名Mod-ID是技术ID建议全小写无空格。3.2 将jar放入StS mods目录并配置启动参数找到你的StS安装目录Steam默认路径Steam\steamapps\common\SlayTheSpire\确认以下结构存在SlayTheSpire/ ├── mods/ # 必须存在若无则手动创建 │ └── my_first_mod.jar # 放这里 ├── ModTheSpire.jar # 必须已安装ModTheSpirev3.4.0 └── SlayTheSpire.exe # 启动器注意mods/目录必须是StS根目录下的子目录不是SlayTheSpire/mods/也不是SlayTheSpire/ModTheSpire/mods/。放错静默忽略。3.3 启动StS并验证三阶段日志启动StS前先打开命令行进入StS根目录用以下命令启动强制输出日志到控制台java -Dfile.encodingUTF-8 -jar ModTheSpire.jar观察控制台输出分三阶段验证加载阶段出现Loading mod: my_first_mod且无ERROR字样初始化阶段出现[MyFirstMod] Initializing...和[MyFirstMod] Loaded successfully!运行阶段进入主菜单后出现[MyFirstMod] Patch executed on main menu update!每帧一次。如果只看到阶段1没阶段2说明SpireInitializer未生效检查包名/类名拼写、JDK版本、mod.info位置如果阶段1、2都有但没阶段3说明SpirePatch未注入成功检查clz和method参数是否拼错MainMenuScreen.class必须导入正确包如果控制台一片空白检查java -jar ModTheSpire.jar是否真的执行了不是双击exe以及ModTheSpire.jar是否为v3.4.0。4. Mod加载失败的5个高频坑现象→原因→解决Mod开发初期80%的失败不是逻辑错误而是环境契约没对齐。以下是我在模拟项目X中踩过的、被问得最多的5个坑按发生频率排序4.1 现象控制台报java.lang.NoClassDefFoundError: com/megacrit/cardcrawl/core/CardCrawlGame原因build.gradle.kts中slay-the-spire依赖版本与本地StS游戏版本不匹配。例如你StS是v2.0.0但SDK写了2.0.1或用了1.19.0的SDK。StS启动时加载的是自己jar里的类而你的Mod引用了不同版本的类签名JVM拒绝链接。解决查你Steam库中StS的版本号右键→属性→更新→当前分支版本去 StS Modding Wiki - SDK Versions 查对应slay-the-spireMaven坐标修改build.gradle.ktsclean后重编译./gradlew clean modJar。4.2 现象StS启动后Mods列表里看不到你的Mod控制台无任何相关日志原因mod.info文件名错误如mod_info.json、MOD.INFO、mod.info.txt或放置路径错误如放在mods/子目录里或放在resources/之外。StS只认mods/根目录下、文件名为mod.info全小写无扩展名的JSON文件。解决用ls -la mods/确认文件名是mod.info不是mod_info或mod.info.json用file mods/mod.info确认是UTF-8纯文本不是UTF-8-BOM删除mods/下所有其他文件只留my_first_mod.jar和mod.info。4.3 现象SpirePatch补丁从不执行但initialize()正常打印原因SpirePatch的clz参数指向的类在StS启动时尚未加载。例如MainMenuScreen.class在CardCrawlGame初始化前就尝试patch但此时MainMenuScreen类还没被ClassLoader加载补丁注册失败。解决换更晚的时机打补丁比如CardCrawlGame的create方法SpirePatch(clz CardCrawlGame.class, method create) public static class GameCreatePatch { ... }或用SpirePatch的optional true参数容忍类不存在但不推荐掩盖问题。4.4 现象Mod能加载但自定义卡牌不显示图标控制台报TextureAtlas not found: images/cards/MyCard.png原因资源路径大小写不一致。Windows文件系统不区分大小写但StS的TextureLoader在Linux/macOS下严格区分。你代码里写images/cards/mycard.png但文件实际叫MyCard.png在Windows能跑Linux直接报错。解决统一用小写字母命名所有资源文件my_card.png在代码中引用时路径字符串必须与文件名完全一致包括大小写用Gdx.files.internal(images/cards/my_card.png).exists()在initialize()里提前校验。4.5 现象修改代码后重新编译modJarStS仍加载旧版本控制台日志还是老的println原因StS或ModTheSpire缓存了旧jar。ModTheSpire会把jar解压到临时目录如%TEMP%\ModTheSpire\mods\即使你替换了mods/下的jar它仍用缓存。解决完全退出StS和ModTheSpire删除%TEMP%\ModTheSpire\整个文件夹Windows或/tmp/ModTheSpire/macOS/Linux重启ModTheSpire它会重新解压jar。5. 用断点调试定位“Mod加载但逻辑不执行”的真实原因从黑匣子到白盒当initialize()能打印但你加的卡牌没注册、事件没触发问题往往藏在StS的异步初始化链里。这时候光看日志不够必须进代码里看变量值。我一般用三步法把黑匣子捅穿5.1 在IntelliJ中配置远程调试让StS连接你的IDEStS本身是Java进程支持JDWP协议。在build.gradle.kts的modJar任务后加// 为调试准备生成带调试信息的jar可选但推荐 tasks.withTypeJavaCompile { options.debug true options.debugOptions.debugLevel source,lines,vars }然后启动StS时加JVM参数java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -Dfile.encodingUTF-8 -jar ModTheSpire.jar在IntelliJ中Run → Edit Configurations → → Remote JVM DebugHost填localhostPort填5005点击Debug按钮等待显示Connected to the target VM。5.2 在关键节点打条件断点过滤无关调用不要在initialize()第一行打普通断点——它只停一次。要停在StS真正调用你逻辑的地方。例如你想知道“为什么新卡牌没出现在卡池”就在BaseMod的卡牌注册入口设断点打开BaseMod.javaIntelliJ会自动下载源码找到addCard()方法在方法第一行设断点右键→More→勾选Condition输入card ! null card.cardID ! null card.cardID.contains(my_first_mod)这样只有你的卡牌注册时才暂停避免被StS内置卡牌刷屏。5.3 用CardCrawlGame.logger替代System.out让日志进StS日志文件System.out.println在StS里可能被重定向或丢弃。真正的日志应该进StS/logs/latest.logimport com.megacrit.cardcrawl.core.CardCrawlGame; public static void initialize() { CardCrawlGame.logger.info([MyFirstMod] Starting initialization...); // 注册卡牌... CardCrawlGame.logger.info([MyFirstMod] Registered 3 cards.); // 如果出错 CardCrawlGame.logger.error([MyFirstMod] Failed to register card: e.getMessage(), e); }技巧latest.log文件实时追加用tail -f logs/latest.logLinux/macOS或Get-Content logs/latest.log -WaitPowerShell监控比盯着控制台高效十倍。5.4 验证Mod生命周期四个必查状态点StS Mod有明确生命周期每个点都可能失败。我在每个点加一句日志形成诊断链状态点触发时机日志示例失败意味着SpireInitializerModTheSpire扫描类时[INIT] Class scanned类未被发现包名/注解错initialize()StS启动后、游戏初始化前[INIT] Method called入口方法未执行依赖缺失receivePostInitialize()BaseMod回调游戏对象已创建[POST] BaseMod readyBaseMod未正确依赖requires漏写onPlayerTurnStart()第一次玩家回合开始[TURN] First turn补丁未生效时机太早把这四句日志写进MyFirstMod.java启动后看哪一句没出现就精准定位断点在哪一层。我做模拟项目X时曾卡在receivePostInitialize()三天——最后发现是mod.info里requires写了basemod但实际应该写BaseMod首字母大写。这种细节文档里不会写只能靠日志链一层层剥。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

换脸进入实时时代:1080P 12fps 直播级工作流刚在 CSDN 刷屏,BFS 生态开始“卷速度“

换脸进入实时时代:1080P 12fps 直播级工作流刚在 CSDN 刷屏,BFS 生态开始“卷速度“

换脸进入实时时代:1080P 12fps 直播级工作流刚在 CSDN 刷屏,BFS 生态开始"卷速度" 【免费下载链接】BFS-Best-Face-Swap 项目地址: https://ai.gitcode.com/hf_mirrors/Alissonerdx/BFS-Best-Face-Swap 从"上传两张图&#xff0c…

2026/10/11 11:14:14 阅读更多 →
openJiuwen agent-core 图记忆实体与关系抽取模块解析:从 Pydantic 模型到 LLM 提示词组装的全链路实践

openJiuwen agent-core 图记忆实体与关系抽取模块解析:从 Pydantic 模型到 LLM 提示词组装的全链路实践

人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习 【免费下载链接】agent-core openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力 项目地址: https://gitcode.com/openJiuwen/agent-core 点击查看 免费下载 本文围绕 ope…

2026/10/11 11:14:07 阅读更多 →
DBeaver CE 24.2.2 Windows 可用性全指南:安装、配置与问题排查

DBeaver CE 24.2.2 Windows 可用性全指南:安装、配置与问题排查

简介:这是一份面向Windows平台的DBeaver Community Edition 24.2.2 免安装压缩包,属于开源数据库管理工具与SQL客户端,支持MySQL、PostgreSQL、Oracle等多种数据库。其定位是让用户无需经历复杂安装配置即可启动,尤其适合数据库初…

2026/10/11 11:13:37 阅读更多 →

最新新闻

递归函数与软件测试实战:从组合优化到协议生成的工程实践

递归函数与软件测试实战:从组合优化到协议生成的工程实践

我有个挺扎心的项目经验:一个软件测试工程师,被塞了个需求,要写代码自动生成离婚协议里的房产分割条款,核心算法用的是递归函数。乍一听像段子,但真做起来,我发现这项目正好把“递归”和“软件测试”这两个…

2026/10/12 5:48:25 阅读更多 →
自动化测试维护陷阱:从选择器稳定性到AI生成代码的避坑指南

自动化测试维护陷阱:从选择器稳定性到AI生成代码的避坑指南

1. 维护陷阱的底层逻辑:自动化测试从资产到负债的转折点我见过太多自动化测试项目,头两个月跑得轰轰烈烈,到了第四个月就开始人人喊打。原因不是测试写得不认真,而是大家普遍低估了一件事:自动化测试的真正成本不在编写…

2026/10/12 5:48:25 阅读更多 →
Maven安装配置与Idea集成实战:从环境变量到依赖管理

Maven安装配置与Idea集成实战:从环境变量到依赖管理

写这篇文章的起因很简单:这些年我见过太多人在 Maven 配置上栽跟头,明明只是二三十分钟能搞定的事,硬是折腾一整天。环境变量写错、settings 没配、Idea 里指错了版本,每一步都有坑,而且报错信息对新手极不友好。所以我…

2026/10/12 5:48:25 阅读更多 →
Abaqus隧道开挖模拟实战:双洞、双盾构、小净距与连拱隧道建模要点

Abaqus隧道开挖模拟实战:双洞、双盾构、小净距与连拱隧道建模要点

一提到Abaqus隧道开挖模拟,很多刚接触的同行第一反应是:不就是把土体单元Remove掉、衬砌单元Add回来嘛?真到自己上手做双洞隧道、双盾构隧道、小净距隧道或者连拱隧道的时候,才会发现完全不是这么回事。双洞涉及先后洞顺序&#x…

2026/10/12 5:48:25 阅读更多 →
AI应用工程化补零件:数据管道、推理调度与上下文管理

AI应用工程化补零件:数据管道、推理调度与上下文管理

1. 这期周报里藏着的两条暗线每周翻热门项目榜,大部分人看的是"哪个 star 涨得快",但我更习惯先看这批项目在解决什么共性问题。10 月 7 日这一周的热门榜单里,有个现象挺有意思:四个项目都在做同一件事——给 AI 系统补…

2026/10/12 5:48:25 阅读更多 →
你的项目不是一次性的:vibe-vibe 迭代思维实战指南——从“做完“到“好用“

你的项目不是一次性的:vibe-vibe 迭代思维实战指南——从“做完“到“好用“

文档教程Vibe Coding示例工程 【免费下载链接】vibe-vibe The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零…

2026/10/12 5:47:24 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →