@typeorm/codemod 实战指南:TypeORM v0.3 自动迁移到 v1.0 的完整方案
后端数据库ORM【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址https://gitcode.com/GitHub_Trending/ty/typeorm点击查看免费下载typeorm/codemod是 TypeORM 官方仓库中随 v1.0 发布的自动化代码迁移工具它基于 jscodeshift 的 AST 重写能力把 v0.3.x 到 v1.0 之间的大部分破坏性变更Connection→DataSource、find 选项语法、驱动与依赖升级等自动应用到你的源码和package.json上。阅读本文后你将掌握该工具的全部 CLI 用法、36 个 v1 转换规则的内部实现原理、TODO 人工审查流程以及如何在大型代码库中安全地执行一次可回滚的版本升级。为什么需要自动化迁移v0.3 → v1.0 的破坏性变更TypeORM v1.0 对公共 API 做了大规模重构核心概念从Connection更名为DataSourceconnect()/close()变为initialize()/destroy()Repository.exist()更名为exists()findByIds/findOneById/getCustomRepository等 API 被移除驱动选项与 find 选项语法也有多处调整。手工迁移这些变更不仅枯燥而且极易遗漏。官方在 升级指南 中直接推荐使用typeorm/codemod完成大部分迁移它会原地更新你的代码处理导入重命名、API 替换、find 选项语法、依赖升级等并把无法自动化的变更以TODO注释形式留给你人工处理。快速上手一行命令完成大部分迁移typeorm/codemod的 CLI 约定为typeorm/codemod version [options] paths...。目前仓库只注册了一个版本迁移目标v1描述为 Migrate from v0.3.x to v1.0见 transforms/index.ts因此基本用法是# 运行全部 v1 转换规则原地修改 npx typeorm/codemod v1 src/ # 预演模式只显示将要发生的修改不写入任何文件 npx typeorm/codemod v1 --dry src/ # 只运行某一个转换规则 npx typeorm/codemod v1 --transform connection-to-datasource src/ # 按 glob 模式排除文件可重复指定 npx typeorm/codemod v1 --ignore **/generated* --ignore **/e2e/** src/ # 控制并行 worker 进程数 npx typeorm/codemod v1 --workers 4 src/ # 列出该版本下所有可用的转换规则 npx typeorm/codemod v1 --listCLI 入口位于 index.ts不带参数或带--help/-h时打印用法说明带--version/-v时打印已安装的typeorm/codemod版本号当前仓库为 1.0.3见 package.json其余情况进入参数解析与执行流程。未指定版本、指定未知版本、或未提供任何路径时会报错并退出。运行环境前提Node.js 20 以上package.json 的engines字段与依赖配置中的minNodeVersion: 20.0.0均指向该要求这也是 TypeORM v1 的运行时下限迁移前建议先提交当前代码git commit因为 codemod 是原地改写git diff是你核对每一处变更的依据。CLI 选项全参考README 中给出的选项表对应 parse-args.ts 的实现完整内容如下选项短选项说明--dry-d预演模式显示变更但不写入文件--help-h显示帮助信息--ignore pattern-i追加的排除 glob 模式可重复与默认排除规则合并--list-l列出当前版本可用的转换规则--transform name-t仅运行指定的单个转换规则--version-v打印已安装的typeorm/codemod版本--workers num-wworker 进程数默认值为 CPU 核数减 1参数解析的细节从 parse-args.ts 可以看到几个值得注意的行为位置参数中的第一个非选项参数被解释为version其余作为待处理路径paths--workers必须是正整数否则直接报错退出--ignore支持多次出现内部累积成数组--transform等带值选项如果缺值下一个参数以-开头或不存在会输出Error: flag requires a value并退出。永远排除.d.ts文件**/*.d.ts是硬编码的默认排除项DEFAULT_IGNORE_PATTERNS见 run-transforms.ts。原因是.d.ts环境类型声明描述的是使用者依赖的类型形状改写其中的标识符会静默破坏已发布的类型。用户提供的--ignore模式通过buildIgnorePatterns叠加在默认规则之后两者同时生效。transform 体系36 个 v1 转换规则typeorm/codemod的转换规则以 版本 分组。当前唯一的v1分组定义在 transforms/v1/index.ts其中导出了一个有序的 36 个 transform 数组。顺序为什么重要该文件的注释明确说明了排序的约束connection-to-datasource必须最先运行这样后续 transform 看到的是DataSource而不是ConnectiondatasourceName必须在globalFunctions之前运行这样在createConnection导入被剥离之前还能先改写createConnection({ name })的参数。这说明迁移规则之间存在依赖关系不能随意调整顺序。36 个规则一览按源码顺序它们覆盖了 v1 破坏性变更的方方面面连接与数据源connection-to-datasourceConnection→DataSource、datasource-namecreateConnection({ name })参数改写、connection-manager、connection-options-reader全局函数与容器global-functionscreateConnection/getConnection等全局函数、use-containerIoCuseContainer移除Repository APIrepository-find-by-ids、repository-find-one-by-id移除的findByIds/findOneById、repository-existexist()→exists()、repository-abstractQueryBuilderquery-builder-print-sql、query-builder-native-parameters、query-builder-where-expression、query-builder-on-conflict、query-builder-or-update、query-builder-replace-property-namesfind 选项find-options-join、find-options-lock-modes、find-options-string-select、find-options-string-relations列选项column-readonly、column-width-zerofill、column-unsigned-numeric驱动与数据源选项datasource-mysql-connector、datasource-sqlite-options、datasource-sqlite-type、datasource-mongodb、datasource-mssql、datasource-sap、datasource-expoMongoDBmongodb-stats、mongodb-types其他migrations-get-all、query-runner-loaded-tables-views、relation-count、file-logger。运行npx typeorm/codemod v1 --list会输出全部规则名称与描述其中标记为(*)的规则在运行后需要人工复核实现见 list-transforms.ts。以 connection-to-datasource 为例AST 重写的典型思路connection-to-datasource.ts 是规模最大也最典型的规则其处理层次可以概括为文件级作用域闸门文件里没有任何typeorm或typeorm/...导入/再导出时直接跳过避免误伤其他库中同名标识符如 mongoose 的Connection类型重命名Connection→DataSource、ConnectionOptions→DataSourceOptions、BaseConnectionOptions→BaseDataSourceOptions同时改写导入说明符、类型引用TSTypeReference、类型查询TSTypeQuery与new表达式并处理Connection as Foo这类别名导入和 CJSrequire(typeorm)解构驱动特定选项类型MysqlConnectionOptions这类深层类型会被重写为ExtractDataSourceOptions, { type: mysql | mariadb }内联表达式MySQL 选项同时覆盖mariadb所以生成联合字面量避免用户依赖typeorm/driver/...深层导入路径方法重命名只在接收者被识别为 DataSource 实例时把.connect()→.initialize()、.close()→.destroy()。接收者识别来自带类型标注的变量、函数参数、类属性、构造器参数属性private readonly x: DataSource、getter 返回类型以及访问链推断如dataSource.manager推导为EntityManager、dataSource.getRepository()推导为Repository属性重命名.connection→.dataSource覆盖QueryRunner、EntityManager、各类Repository、各类QueryBuilder、EntityMetadata以及BaseEvent/InsertEvent等订阅者事件类型ColumnMetadata、IndexMetadata则特殊处理为.entityMetadata.dataSourcev1 中它们的.connectiongetter 被整体移除再导出与去重export * from typeorm/...的深层路径同步改写并对重命名后产生的重复 import 去重。测试夹具可以直观印证这些行为例如 connection-to-datasource-class-members.input.ts 展示了this.tenantConnection.connect()→this.tenantConnection.initialize()、getter 返回类型参与接收者识别同时保证未标注类型、与 TypeORM 无关的类属性不被误改。转换的两种结果改写源码 或 留下 TODO每个 transform 要么直接改写源码要么在无法自动化处插入 TODO 注释。例如 query-builder-print-sql 的输出夹具 中.printSql()调用原样保留但在其上插入了// TODO(typeorm-v1): printSql() was removed — use getSql() or getQueryAndParameters() to inspect SQLTODO 前缀统一为TODO(typeorm-v1):由 todo.ts 集中定义。该模块还保证了幂等性再次运行时如果同一节点已有相同 TODO 注释不会重复插入同时会把注释插在// prettier-ignore指令之前避免破坏该指令。运行机制基于 jscodeshift 的流水线与统计执行入口在 run.ts一次运行的完整链路为resolveTransforms解析出要运行的 transform 文件路径resolve.ts指定--transform时只解析单个文件否则解析整个 version 的index文件runTransforms逐规则调用 jscodeshift Runner 处理所有路径runDependencies扫描并升级package.jsonprintSummary输出统计汇总printGuide提示格式化建议任一环节出现错误transform 解析错误或依赖升级错误都会把process.exitCode置为 1便于 CI 感知失败。runTransformsAST 转换的执行细节run-transforms.ts 直接调用jscodeshift/src/Runner关键配置包括文件扩展名ts,tsx,js,jsx解析器tsx可同时处理 TS 与 TSX 语法ignorePattern为默认规则与用户--ignore的合并结果cpus仅在用户显式传入--workers时设置否则交给 jscodeshift 默认README 所述默认值为 CPU 核数减 1通过拦截process.stdout.write解析 jscodeshift 输出的Processing N files、ERR、OKK、NOC、SKIP行驱动进度 spinner含剩余时间 ETA 估算并把无法分类的 worker 输出缓冲起来、在运行结束后打印避免警告与堆栈被吞掉每个 transform 结束后输出一行摘要如✔ Changed 12 out of 40 files (3.2s)。transformer 管道规则如何在单文件内串联单个 transform 文件本质上是导出{ name, description, fn }的模块。transformer.ts中的transformer(transforms)工厂把这些规则串成一条管道按顺序对同一个文件的源码依次应用每个规则的fn任一规则返回了字符串就累计hasChanges最后只把有变更的文件写回。同时通过api.stats记录每个规则实际命中了多少个文件applied:name供汇总输出展示。输出汇总的内容print-summary.ts 最终打印Statistics处理文件总数、被转换文件数、跳过文件数、解析错误数、耗时Transforms applied按命中文件数降序排列的规则命中统计Parse errors解析失败的文件与错误信息按文件排序Files requiring manual review所有被插入 TODO 注释的文件按规则分组Dependency changespackage.json的变更、警告与错误重复项按(N times)聚合。运行后需要人工处理的 TODOREADME 明确提示部分 transform 会在代码中留下TODO注释标记需要人工修改的位置codemod 完成后会列出所有需要人工审查的文件对应printTodos的 Files requiring manual review 分组列表。这些 TODO 是迁移流程的安全阀——凡涉及业务逻辑判断、无法通过类型/上下文推断的变更工具都不会替你拍板而是明确标注出来。处理建议先用git diff通读 codemod 的全部改动逐个搜索TODO(typeorm-v1):按注释给出的替代 API 手工修改重新运行类型检查与测试。依赖升级package.json 的自动处理除了改写源码typeorm/codemod还会自动扫描项目中的package.json并做依赖升级。查找逻辑见 find-package-json.ts递归搜索给定路径下的所有package.json排除node_modules搜索根为当前工作目录与用户传入路径的并集。三类依赖处理策略依赖规则配置在 dependencies/v1.ts按四类处理包替换replacements——旧包被新包取代旧包新包目标版本mysqlmysql2^3.22.0sqlite3better-sqlite3^12.9.0版本升级upgrades——版本低于最低要求时自动提升到目标版本实现在 upgrade.ts 中通过semver.minVersion比较非标准版本号如file:/link:/git 依赖会报错要求手动处理包名最低版本升级目标typeorm^1.0.0^1.0.0nestjs/typeorm^11.0.1^11.0.1mongodb^7.0.0^7.1.1mssql^12.0.0^12.3.0mysql2^3.15.3^3.22.0ioredis^5.0.4^5.10.1redis^5.0.0^5.12.1expo^52.0.0^55.0.0google-cloud/spanner^8.0.0^8.6.0better-sqlite3^12.0.0^12.9.0typeorm-aurora-data-api-driver^3.0.0^3.0.2不兼容包incompatible——检测到即报错Errors并附上迁移建议包括typeorm-seeding使用被移除的ConnectionAPI、pg-mem使用被移除的getConnectionManager()、typeorm-naming-strategies依赖内部路径并覆盖已移除接口方法、typeorm-typedi-extensions与typeorm-routing-controllers-extensionsIoCuseContainer移除、mock-typeorm与opentelemetry/instrumentation-typeorm等。警告warnings——检测到即提示不阻断如dotenvv1 不再自动加载.env需在DataSource中显式配置、typeorm-transactional仍使用已弃用的.connection属性、以及 peer dependency 尚未支持 v1 的nestjs-typeorm-paginate、typeorm-encrypted、typeorm-fixtures-cli等。Node 版本检查若engines.node低于20.0.0会产生警告提示更新。写回package.json时会保留原有的缩进风格2 空格或 4 空格自动探测且在--dry模式下不做任何写入。运行后的收尾格式化与 git diff 审查格式化codemod 基于 AST 重写可能引入细微的格式差异多余括号、引号风格变化等。README 与printGuide都建议迁移后运行项目自身的格式化器恢复代码风格npx typeorm/codemod v1 src/ npx prettier --write src/ # 或npx eslint --fix src/Scoping 限制没有类型信号的代码可能不会被转换README 的 Scoping 一节对转换边界做了诚实说明重命名属性或方法的 transform如.connection→.dataSource依赖类型标注来识别 TypeORM 实例同时它们也能识别初始器是已知访问链的未标注类字段如private manager this.dataSource.manager见resolveAccessorChainType对dataSource.manager/getRepository()/createQueryRunner()等访问链的推导。但完全没有类型信号的代码可能无法被自动转换——例如纯 JS 中未标注类型且初始器无法追溯的变量。因此运行结束后务必逐行检查git diff对遗漏处手工修补。验证与测试仓库为每个 transform 都配备了输入/输出夹具测试位于 test/transforms/v1/fixtures 下可直接作为迁移效果的预期行为说明书。几个值得阅读的示例connection-to-datasource-class-members.input.ts类属性、getter 返回类型、构造器参数属性的接收者识别以及对无关类的保护connection-to-datasource-chained-access.output.ts链式访问this.entityManager.connection→this.entityManager.dataSource以及事件解构const { queryRunner } event后的属性改写repository-exist-typed.input.tsuserRepo.exist()→userRepo.exists()同时保证文件系统中同名.exist()方法、Redis 风格缓存客户端的.exist()不被误改query-builder-print-sql.output.tsTODO 注释的插入位置与措辞。这些夹具也提醒我们codemod 的核心设计原则是只在有充分把握时改写拿不准就留 TODO这正是它适合大规模代码库的原因。延伸阅读升级指南Upgrading from 0.3 to 1.0v1 全部破坏性变更的权威说明是人工处理 TODO 时的主要参考v1 release notesv1.0 的发布说明与路线图run-transforms.tsjscodeshift Runner 调用与进度/错误捕获的实现dependencies/v1.ts依赖替换、升级、不兼容检测的完整规则表。赞分享后端数据库ORM【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址https://gitcode.com/GitHub_Trending/ty/typeorm点击查看免费下载相关推荐散落各处的教案别再孤军奋战用GraphRAG知识图谱RAG把教育数据串成一张网散落各处的教案别再孤军奋战用GraphRAG知识图谱RAG把教育数据串成一张网 教师、教研团队和教育产品团队把分散在各系统的教案、课件、学生档案交给Grap人工智能RAG知识图谱数据工程大模型TypeORM 1.0 升级指南从 0.3.x 迁移的完整 Breaking Changes 清单与实战方案TypeORM 1.0 升级指南从 0.3.x 迁移的完整 Breaking Changes 清单与实战方案 本文是一份面向 TypeORM 0.3.x 存量后端数据库ORMTypeORM迁移生成失败终极指南从报错到修复的完整解决方案TypeORM迁移生成失败终极指南从报错到修复的完整解决方案 TypeORM迁移是数据库版本控制的核心功能但在实际使用中迁移生成失败是开发者经常遇到的痛点后端数据库ORM上一篇800 免费API接口速查指南无需认证的API与选型清单下一篇个人博客评论系统集成gh_mirrors/v41/v4中Disqus与Commento对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Zonotope方法在虚拟电厂广域聚合调控中的鲁棒调度应用

Zonotope方法在虚拟电厂广域聚合调控中的鲁棒调度应用

简介:面向智能电网虚拟电厂(VPP)场景,这份资料复现了基于奇诺多面体(Zonotope)的分布式资源广域聚合调控方法,适合具有电力系统背景和Python编程基础的研究人员与开发人员。内容涵盖空调负荷、储…

2026/10/10 5:31:35 阅读更多 →
Python的索引与切片原来该这样理解

Python的索引与切片原来该这样理解

前言 索引(indexing)和切片(slicing)是 Python 序列的两把基础钥匙,但很多人是"用得会、说不出"。一旦遇到边界情况——为什么 s[100] 报错而 s[100:200] 不报错?为什么 s[::-1] 能反转&#xff…

2026/10/10 5:31:35 阅读更多 →
Webogram图片处理:WebP格式支持与客户端压缩技术

Webogram图片处理:WebP格式支持与客户端压缩技术

Webogram图片处理:WebP格式支持与客户端压缩技术 在即时通讯应用中,图片处理的效率直接影响用户体验和数据流量消耗。Webogram作为Telegram的Web端实现,采用了多种优化技术来平衡图片质量与传输效率。本文将深入解析Webogram的图片处理机制&…

2026/10/10 5:31:35 阅读更多 →

最新新闻

LeetCode 2413 Smallest Even Multiple 题解:奇偶分类与位运算的 O(1) 解法(codeforces-go 仓库实战指南)

LeetCode 2413 Smallest Even Multiple 题解:奇偶分类与位运算的 O(1) 解法(codeforces-go 仓库实战指南)

科学计算 【免费下载链接】codeforces-go 算法竞赛模板库 by 灵茶山艾府 💭💡🎈 项目地址: https://gitcode.com/GitHub_Trending/co/codeforces-go 点击查看 免费下载 本篇技术指南以 codeforces-go 仓库中 LeetCode 第 311 场周…

2026/10/10 6:06:48 阅读更多 →
纯虚函数与抽象类:接口该怎么设计

纯虚函数与抽象类:接口该怎么设计

设计一套可扩展的 C 系统时,你迟早会写出「只定义契约、不提供实现」的类:它规定「凡是我的子类都必须有 area() 和 draw(),但怎么实现我不管」。这种类就是抽象类(abstract class),靠 纯虚函数&#xff08…

2026/10/10 6:06:48 阅读更多 →
业务参与者规则不显示构件包?沿工作流运行时加载链路排查

业务参与者规则不显示构件包?沿工作流运行时加载链路排查

看到“业务参与者规则没有显示构件包及构件包下流程事件,work目录下也未生成当前构件包目录”这个描述,我第一反应是:这不是一个单纯的界面显示问题,而是服务在运行态压根没有把目标构件包加载进来。业务参与者规则界面显示的构件…

2026/10/10 6:06:48 阅读更多 →
Linux 端口不通怎么排查?firewalld 不是超时而是 No route to host,三台真机实测 firewalld / ufw / iptables / SELinux

Linux 端口不通怎么排查?firewalld 不是超时而是 No route to host,三台真机实测 firewalld / ufw / iptables / SELinux

这一篇讲什么 「端口不通」是最常见也最容易瞎折腾的问题:服务起了、防火墙也开了,外面还是连不上。本篇在三台机器上把排查链条从头到尾实跑一遍:先分清报错类型 → 本机在不在监听 → 防火墙 → SELinux / AppArmor。 实测环境同(一):CentOS 7.9(VMware)、Rocky 9.8、Ubuntu …

2026/10/10 6:06:48 阅读更多 →
CentOS 7 yum 源失效怎么办?vault 返回 403、EPEL 7 卡死,三台真机实测能用的换源方法(附 Rocky 9 / Ubuntu 24.04)

CentOS 7 yum 源失效怎么办?vault 返回 403、EPEL 7 卡死,三台真机实测能用的换源方法(附 Rocky 9 / Ubuntu 24.04)

这个系列是什么 「Linux 实战」按线上真正会撞上的事情排:认清系统和装软件(本篇)、端口不通、服务起不来、磁盘满了、网络和 SSH、日志与性能…… 每一篇都做两件事:①所有命令在真机上跑过、贴原始输出;②同一件事在三个系统上各跑一遍 —— CentOS 7 还大量在线上跑着,新机器…

2026/10/10 6:06:48 阅读更多 →
极点五笔10周年版:确定性优先的五笔输入法重构

极点五笔10周年版:确定性优先的五笔输入法重构

1. 项目概述:这不只是一个输入法,而是一次对中文输入底层逻辑的重新校准“极点五笔:10周年版全面升级体验”——看到这个标题,我第一反应不是点开下载,而是下意识摸了摸键盘右下角那块被手指磨得发亮的空格键。十年&am…

2026/10/10 6:05:48 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →