codegraph实战:从AST解析到依赖图谱的可视化架构分析
1. 项目定位codegraph 到底解决了什么问题做后端开发或者接盘老项目的朋友应该都有过这种体验新到一个团队leader 甩给你一个几十万行的代码仓库让你“先看看熟悉一下”。你打开 IDE从入口类开始一个文件一个文件地点点着点着就迷路了。模块之间的依赖关系像一团乱麻A 依赖 BB 又反过来依赖 A你想搞清楚调用链到底怎么走的结果在 IDE 的“Find Usages”里来回跳了半小时脑子里的图还是散的。codegraph 就是干这个的。它是个命令行工具能把你的源代码仓库自动解析成一张依赖关系图谱。不是那种简单的文件树而是模块、类、函数、接口之间真实调用关系构成的图结构。你跑一条命令几分钟之后就能拿到一张清晰的架构图哪个模块是底层基础、哪个模块是业务门面、哪些地方出现了循环依赖、哪些包已经严重腐化一眼就能看出来。这个工具的核心价值在于把“读代码的脑力活”变成“看图的理解活”。人脑对图结构的理解效率远高于对线性文本的追踪尤其是面对陌生代码库的时候一张准确的图谱胜过十遍通读。它不只适合新人上手项目对老手做架构评审、重构之前的依赖分析、技术债盘点甚至是写周报的时候给团队展示模块关系都非常实用。2. 核心设计拆解从源码到图谱的关键环节2.1 语言解析层AST 是起点codegraph 最底层的部分是做静态代码解析。这活儿听起来简单实际上坑很深。它首先要逐个读取源文件把文本转换成抽象语法树AST。AST 会把代码里的类、函数、变量、方法调用这些元素结构化地提取出来不是看字符串而是看语法结构。举一个特别直观的例子同样是“调用了一个方法”在 JavaScript 里可能是foo()是全局函数也可能是obj.foo()是对象方法还有可能是this.foo()是当前类的方法。单靠正则去匹配字符串一定会把这三个场景搞混。AST 能区分开因为它在解析的时候就记录了完整的上下文。我实际用下来codegraph 在这块做得比较扎实。它对 Python、JavaScript、TypeScript、Java、Go 这几门主流语言都做了完整的解析支持PHP、Ruby、Rust 这些也有覆盖。不同的语言在依赖提取上的难度完全不一样像 Python 这种动态语言import语句相对好识别但要准确判断一个名字是模块引用还是普通变量就需要更细致的符号表分析Java 必须处理包名和类名的全限定关系还要面对同一个类名在不同包里重复出现的尴尬场面。这里有个实操心得codegraph 不是靠文件路径猜依赖关系而是靠 AST 里的真实符号引用。这意味着它生成的图谱依赖关系是准的。相比某些重构工具用“文件夹层级”硬推出来的架构图codegraph 的结果要可信得多。2.2 依赖提取与图模型节点和边怎么定义解析完 AST 之后codegraph 会进入依赖提取阶段。它做的事情就是把代码元素抽取成两类东西——节点和边。节点是什么就是图中的实体。通常包括模块、类、函数。赋予每个节点一个全局唯一的 ID并且记录它的类型、全限定名、源码位置哪个文件哪一行。边是什么就是节点之间的关系。codegraph 主要提取以下几种关系调用关系calls函数 A 调用了函数 B。继承关系inherits类 A 继承了类 B。实现关系implements类 A 实现了接口 B。组合/引用关系references模块 A 引用了模块 B 的某个符号。提取完成之后整个代码库就变成了一张有向图。可以想象成一张城市地图节点是地标建筑边是连接它们的道路。方向是有含义的标注着依赖从哪边指向哪边。这里给一个非常关键的补充如果你要自己写类似工具图模型的设计决定了后续分析能力的上限。codegraph 选择的是“有向图 多种关系类型”的模型而不是简单的“文件包含”模型。这个选择是深思熟虑的——它让“循环依赖检测”、“模块分层”、“影响分析”这些事情变得很自然。如果你只有一个“文件 A import 文件 B”的模型那你永远无法回答“哪个类和哪个类真正耦合在一起”这种问题只能说“这两个文件有关系”而这种粗粒度信息对架构评审基本没有帮助。2.3 可视化输出让数据被眼睛吸收数据提取出来之后最终要呈现给用户看这就是可视化输出层。codegraph 支持多种输出格式常见的包括DOT 格式Graphviz 官方的描述语言可以用 dot 命令直接渲染成 PNG、SVG。JSON 格式适合程序化处理可以喂给其他工具做进一步分析。HTML 交互式图谱基于前端图可视化库渲染成可以拖拽、缩放、点击的网页。我日常用得最多的是 HTML 格式因为可以交互点开一个节点能看到它依赖谁、被谁依赖还可以搜索节点定位。DOT 格式适合出正式文档比如架构评审的时候贴到文档里。JSON 格式适合做 CI 集成在流水线里跑一遍然后自动把分析结果上传到某个可视化平台。这里我要拉出来单独说一句“graphify”这个热词。最近社区里讨论 codegraph 时经常跟“graphify”绑定出现指的是“把代码图谱化”这一整套能力。从本质上看graphify 解析 构图 渲染codegraph 恰好就是这套思路的标准实现。很多朋友看到 graphify 以为是什么魔法其实核心还是上面这套静态分析流程只不过它把“从源码到图谱”的完整链路打磨得很顺滑让你感觉一条命令就完成了像变魔术。在实操层面你不需要关心 AST 的细节codegraph 已经帮你把“graphify”这件事做完了你只需要提供仓库路径让它跑就好。3. 实操过程安装、配置、跑一次完整流程3.1 环境准备与安装codegraph 的安装非常简单。我以 macOS 和 Linux 为例装的是官方提供的二进制包# macOS 通过 Homebrew 安装 brew install codegraph # Linux 直接下载编译好的二进制 wget https://github.com/codegraph/codegraph/releases/download/v1.2.4/codegraph-linux-amd64.tar.gz tar -xzf codegraph-linux-amd64.tar.gz sudo mv codegraph /usr/local/bin/Windows 用户可以用 Scoop 安装或者从 Releases 页面下载 exe 文件放到 PATH 里没什么区别。装完验证一下codegraph version能看到版本号就说明装成功了。3.2 基本命令扫描一个 Python 项目拿一个真实的 Python 项目来演示。假设项目结构是这样的~/workspace/demo-project/ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── services/ │ │ ├── __init__.py │ │ ├── user_service.py │ │ └── order_service.py │ ├── models/ │ │ ├── __init__.py │ │ ├── user.py │ │ └── order.py │ └── utils/ │ ├── __init__.py │ ├── db.py │ └── logger.py └── tests/ ├── test_user.py └── test_order.py进入项目根目录执行codegraph scan --lang python --src ./src --out graph.json这条命令的含义是用 python 语言解析器扫描 src 目录把结果输出到 graph.json。跑完之后你会看到终端里滚动了一些解析日志显示扫描了多少个文件、提取了多少个节点和边。出现类似下面这个输出就说明成功了Scanned 12 files Extracted 45 nodes Extracted 83 edges Write graph to graph.json3.3 渲染成可视化页面得到 JSON 之后下一步就是渲染codegraph render graph.json --format html --output graph.html然后用浏览器打开 graph.html你会看到一个交互式依赖图谱。图谱里的每个圆点代表一个模块或类连接线代表依赖关系。你可以拖拽节点调整布局在搜索框输入user_service直接定位到对应节点点击节点会弹出详情面板显示它的依赖和反向依赖。如果不需要交互可以直接生成静态图codegraph render graph.json --format dot --output graph.dot dot -Tpng graph.dot -o graph.png这里dot命令来自 Graphviz如果你没装用brew install graphviz或者apt install graphviz装一下就行。3.4 按包粒度聚合不要让细节淹没重点扫描一个大型项目节点数动不动就上万全量渲染出来会糊成一团。这时候需要做聚合。codegraph 提供了按包名聚合的功能codegraph scan --lang java --src ./src --group-prefix com.example --depth 2 --out graph-package.json--group-prefix指定包前缀--depth指定聚合层数。它会把同一个包下的类聚合成一个“包节点”这样整个图就从“类粒度”变成了“包粒度”视觉上清爽很多更适合架构评审。我用一个真实案例感受一下之前分析过一个 Spring Boot 项目类结节有 1800 多个全量渲染出来完全没法看。按包聚合到第 2 层之后只剩下 20 多个包节点架构分层一目了然controller、service、repository、domain、config谁依赖谁清清楚楚。3.5 关键参数控制扫描范围的三个选项codegraph scan 有三个参数是我每次跑项目都必调的--ignore忽略目录比如--ignore tests或--ignore **/generated/**。生成代码和测试代码通常会引入大量无意义的依赖关系忽略掉之后图谱会干净很多。--include-external是否包含第三方库的依赖信息。默认不包含因为第三方库之间的依赖关系对你理解业务架构没有帮助。但如果你想看某个类和某个框架的耦合程度可以打开试试。--focus聚焦模式。比如--focus src/services/order_service.py只分析这个文件以及它的依赖闭包非常适合做局部代码审查。这些参数都是为了回答不同的问题而设计的。搞清楚你这次分析的目标再决定用哪一组参数不要每次都是默认三连跑不然输出结果大概率不是你想要的。4. 常见问题与排查实战4.1 解析失败文件报错后直接跳过怎么办有一次我扫描一个 TypeScript 项目控制台报了一大堆parse error然后 codegraph 把出错的文件直接跳过了。我一开始觉得没毛病跳过就跳过吧。结果图出来之后发现一个核心模块的依赖信息不完整有些边明显是断的。排查思路是这样的先看清楚报错的具体原因。codegraph 的报错信息分两类——一类是“文件不存在”或者“目录找不到”这是路径问题另一类是“语法错误”“不支持的语法结构”这是真正的解析问题。前者的处理办法是检查--src参数后者的处理办法是去查该文件是否用了实验性的新语法比如 TypeScript 的新装饰器特性还没被 codegraph 的解析器完全支持。避坑点扫描完先看一眼日志里的error count如果大于零就要决定是继续跑还是先处理错误。我的建议是先处理掉导致解析失败的硬错误再去看分析结果否则分析图上会有一堆“假漏洞”。4.2 图太乱节点太多导出后糊成一团这个坑我踩过不止一次。一个小型项目扫出几千个节点直接render成 SVG用浏览器打开那叫一个壮观肉眼只能看到一团黑色马赛克啥也看不清。碰到这种情况我的处理顺序是聚合粒度把类聚类成包按包出图。过滤孤岛节点。--min-degree 2这个值表示只显示至少有 2 条边的节点可以把那些“飘在边缘的孤立小模块”过滤掉。分模块出图不要试图把整个系统塞进一张图按业务模块分别生成更有针对性。我的经验做法先用聚合模式出全局图把握整体架构然后针对你关心的模块用--focus出局部图看具体依赖细节。一全局、一局部两层次就能把问题讲清楚。4.3 循环依赖明明存在但图上看不出来你可能遇到过这种情况代码里明明有循环依赖但图上找不到明显的环因为节点太多环的形状不显眼。跑完 scan 之后我习惯直接用命令行做一个环检测codegraph analyze graph.json --find-cycles如果命中了循环依赖输出会是类似这样的Cycle found: A - B - C - A普通用户理解这些环可能有点抽象我来具体解释A 模块调用了 B 模块的方法B 又调用了 C 模块C 回过头来调用了 A 模块的方法这就形成了 A、B、C 之间的死循环依赖。在代码库里这种情况如果出现在不合适的层级比如 A 是基础工具层C 是业务层业务层的 C 反向依赖了基础工具层的 A架构上就是明目张胆的“底层依赖了上层”让系统很难维护和测试。这个命令对架构评审特别有用。我用它在一个中等规模的项目里揪出过近 20 组循环依赖分布在不同的业务模块交界处后来命名和结构重整就有的放矢了。4.4 扫描特别慢大型仓库的性能调优面对一个百万行级别的仓库codegraph 第一次 scan 可能需要十几分钟这个正常。如果觉得慢到不可接受可以按下面顺序优化只扫描 src 目录不扫描 tests 和 node_modules。这是最有效的一招我一般直接--ignore **/node_modules/** --ignore tests/**扫描时间直接少一半还多。开启多线程。--workers 8参数控制并发数我一般设为 CPU 核数两倍。拆分扫描。按模块分别建立索引最后用codegraph merge合并多个 JSON。补充一个实测数据有一个次 480 万行的 Java 仓库第一次全量 scan 跑了 24 分钟。加上 ignore 之后大概 8 分钟出结果。按模块拆成 5 个部分每个部分并发扫最终 merge 一次全程大约 10 分钟效果还不错。4.5 常见问题速查表症状可能原因处理方式scan 报“src directory not found”--src路径写错检查路径是否相对于当前工作目录多个文件报 parse error项目用了解析器不支持的语法查看具体错误考虑升级版本或忽略该目录导出的 DAG 图中文乱码系统缺中文字体安装字体如 Noto Sans CJK后重新 renderrender 出的图全是点节点太多未聚合手动调整粒度或过滤低度节点不同机器上 scan 结果不一致版本差异固定 codegraph 版本推荐锁发行版而非滚动更新命令一直卡在“analyzing...”文件数过多或误扫了二进制/大目录加 ignore把 node_modules/build/generated 排除掉生成的 PNG 过大打不开节点数量过大且未优化用--format html代替或者降低聚合深度5. 实际场景复盘一个重构前的依赖分析案例前面讲的都是功能点我把一个真实场景完整串一遍方便你看清楚它到底是怎么用的。之前我接手一个微服务项目业务逻辑分散在几个模块里service 层和 controller 层的职责边界越来越模糊核心问题是“要不要拆服务、怎么拆”。我没有凭代码直觉拍脑袋而是先跑了一次依赖分析步骤如下第一步对单体仓库做全量 scancodegraph scan --lang java --src ./services --group-prefix com.company --depth 2 --out services.json第二步全局渲染出包级依赖矩阵找出耦合最高的几组包。这时能直观看到order-service和payment-service相互依赖的频率最高而inventory-service几乎独立说明拆出去的难度很低。第三步针对高耦合部分做局部聚焦codegraph scan --lang java --src ./services --focus com.company.order.OrderService.java --out order-detail.json codegraph render order-detail.json --format html --output order-detail.html局部图出来后能看到OrderService直接操作了PaymentService和InventoryClient它自己还持有大量的数据访问对象。依赖箭头全朝着同一个方向没有环。这告诉我order 模块虽然依赖多但单向下沉明显拆服务时只需要把数据模型拆出来不要让它反向依赖支付模块就行。第四步用--find-cycles检查整个服务间的环codegraph analyze services.json --find-cycles输出里面有几组环集中在user、order、payment三个包之间。这些环是拆服务时最容易翻车的点因为拆开之后就需要改成服务间调用网络延迟和事务边界都要重新设计。整个过程大约一个半小时比我传统的“靠读代码理依赖”快出太多。省下来的时间全用在判断拆分方案上而不是水面下的依赖收集。6. 一些实操心得和扩展用法codegraph 用到现在我把它的扩展价值也挖掘了一下一是接入 CI在每次合并请求之前自动生成“依赖变更图”。可以这样理解每次提交代码后自动对比当前分支和主干分支的图谱变化这比静态代码检查工具给“覆盖率”要直观得多。我们可以直接在 CI 里加一个步骤生成一个 HTML 报告团队里每个关注架构的人都直接看可视化结果而不是去翻 git diff 的代码行变更。二是做版本间的架构差异对比。codegraph diff graph-main.json graph-feature.json能对比两个版本的图谱差异输出新增的节点、删除的节点、新增的依赖边、消失的依赖边。我经常用这个做重构验收重构完成之后跑一次 diff确认目标依赖边消失、预期的新依赖边出现一目了然比 review 代码要快得多。三是给新人做代码导航。新同学入职我给他们的第一个任务往往不是“读哪几个文件”而是“跑一次 scan生成全项目图谱然后在图谱上标注出你将要负责的模块、它依赖的底层模块、依赖它的业务模块”。这个方法实测下来效果很好比让新同学对着 IDE 跳转效率高很多也更容易形成宏观认识。四是自定义脚本处理 JSON 输出。codegraph 的 JSON 格式是结构化且稳定的我写过一个简单的脚本把所有“高度数节点”导出来这就是整个系统里变动最容易引发连锁故障的关键节点是测试投入的重点对象。类似这种二次加工的玩法有很多只要你能拿到 JSON能做的东西就很多。最后我再分享一个在实操中判断“图是否正确”的小技巧找一个你熟悉的模块比如你手头正在写或者最近review过的那个类在图谱上先定位它看它的出边和入边是否和你的认知一致。如果一致你就知道解析结果整体是可信的如果不一致优先怀疑是不是解析版本的问题而不是代码的依赖关系。这个动作每次只花一两分钟但能帮你建立起对工具结果的信任度避免在错误的图上做浪费时间的大动作。总体来说codegraph 是我手头少有的“用了就回不去”的工具尤其是面对陌生代码库或者大规模重构场景时它节省的远不止时间还有脑力。

相关新闻

Servlet容器原理与Spring Boot性能调优实战

Servlet容器原理与Spring Boot性能调优实战

1. Servlet容器基础认知Servlet容器本质上是一个符合Java EE规范的Web服务器扩展组件,它负责管理Servlet生命周期并处理HTTP请求/响应流程。当我们在浏览器地址栏输入URL时,容器就像个尽职的交通警察:先解析请求路径找到对应的Servlet&#x…

2026/10/15 11:31:12 阅读更多 →
PCA图像压缩:原理、实现与MATLAB优化

PCA图像压缩:原理、实现与MATLAB优化

1. 主成分分析在图像处理中的应用价值 主成分分析(PCA)作为一种经典的降维技术,在图像处理领域展现出独特的优势。当我们需要处理高维图像数据时,PCA能够有效提取关键特征,去除冗余信息,实现数据压缩。这种…

2026/10/15 11:31:12 阅读更多 →
改进天鹰优化算法(AOA)的MATLAB实现与工程应用

改进天鹰优化算法(AOA)的MATLAB实现与工程应用

1. 算法优化背景与核心思路在智能优化算法领域,天鹰优化器(Aquila Optimizer, AOA)作为一种新兴的元启发式算法,近年来受到广泛关注。其灵感来源于自然界天鹰的狩猎行为,通过四种不同的捕猎策略实现全局探索和局部开发。但在处理高维复杂问题…

2026/10/15 11:30:11 阅读更多 →

最新新闻

一个人运营10个账号是什么体验?工具选对了真的不累

一个人运营10个账号是什么体验?工具选对了真的不累

朋友问我:一个人管10个账号,是不是天天熬夜?我认真算了算,真正忙的其实不是“写”,而是“发”和“复盘”。同一个动作重复十遍,才是把人拖垮的根源。今天不堆方法论,只讲真实体验,以…

2026/10/15 15:14:58 阅读更多 →
跨平台GUI框架选型与性能优化实战指南

跨平台GUI框架选型与性能优化实战指南

1. 图形界面框架的桌面应用开发全景 十年前我刚入行时,用MFC开发Windows桌面应用还要手动绘制按钮状态。如今站在2023年回望,跨平台GUI框架的演进简直是一场静默的革命。从Electron引发的Web技术入侵桌面端,到Flutter的横空出世,再…

2026/10/15 15:14:58 阅读更多 →
端到端自动驾驶四阶段演进:从模块化到One Model的架构拆解与落地挑战

端到端自动驾驶四阶段演进:从模块化到One Model的架构拆解与落地挑战

简介:这份《2024端到端自动驾驶行业发展及技术落地报告》由辰韬资本、南京大学上海校友会自动驾驶分会与九章智驾联合撰写,面向自动驾驶从业者、研究者及投资者,系统梳理2023年以来端到端技术从行业共识到量产落地的全貌。报告访谈30余位一线…

2026/10/15 15:14:58 阅读更多 →
从语音助手到AI OS:Bixby的系统级调度逻辑深度解析

从语音助手到AI OS:Bixby的系统级调度逻辑深度解析

“Bixby是真正的AI OS”,这句话我一开始是不信的。当时我拿这句话去问身边几个数码圈朋友,大家第一反应都差不多:Bixby不就是三星那个“半死不活”的语音助手吗?从Galaxy S8时代就在了,后来手机上都快没人提了&#xf…

2026/10/15 15:14:58 阅读更多 →
2026AI辅助写作网站怎么选?四款科研工具横评与搭配思路

2026AI辅助写作网站怎么选?四款科研工具横评与搭配思路

摘要:本文围绕 AI 辅助写作网站怎么选这件事,把沁言学术、Writefull、Consensus、Figdraw 放进同一场比较,从语言润色、证据检索到科研绘图,按使用阶段和语种偏好分别拆开来看,客观说明各自擅长的部分,最后给出一套可以落地的搭配思路,适合准备开题、做综述或者投稿的研究生与科…

2026/10/15 15:14:58 阅读更多 →
SpringBoot+Vue宠物领养系统答辩PPT解析:前后端分离毕设核心流程与避坑指南

SpringBoot+Vue宠物领养系统答辩PPT解析:前后端分离毕设核心流程与避坑指南

简介:在Java Web开发领域,前后端分离架构已成为主流实践。后端框架Spring Boot凭借自动配置与快速启动能力简化了工程搭建,前端Vue.js通过组件化开发实现界面高复用,数据层依托MySQL保证业务信息持久化。基于B/S三层架构&#xff…

2026/10/15 15:13:58 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →