maturin 平台支持全景:操作系统、CPU 架构、Python 解释器与 manylinux/musllinux 兼容性指南
开发工具构建工具【免费下载链接】maturinBuild and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages项目地址https://gitcode.com/gh_mirrors/ma/maturin点击查看免费下载maturin 是一个用于构建和发布 Python 包的构建工具能够将基于 pyo3、cffi、uniffi 绑定的 Rust crate 以及纯 Rust 二进制文件打包为 Python wheel。本文以官方文档 guide/src/platform_support.md 为主线结合仓库源码系统梳理 maturin 支持的操作系统、CPU 架构、Python 解释器版本以及 manylinux / musllinux 兼容策略。读完本文你将掌握 maturin 在哪些平台上可以构建与发布 wheel、不同平台对应的 wheel 平台标签platform tag如何生成、如何为新的操作系统添加支持以及 manylinux 合规检查的底层原理。总体原则平台上限由 rustc 决定maturin 构建在 cargo 与 rustc 之上因此其平台支持能力首先受限于 Rust 编译器的平台支持范围。官方文档明确指出Being built on cargo and rustc, maturin is limited by rusts platform support.这意味着一个平台只有先被 Rust 工具链支持包括 target triple、标准库、链接器等maturin 才有可能在该平台上构建 wheel。从源码结构看这一约束被直接固化在目标平台解析逻辑中Target::from_triple在 src/target/mod.rs 中根据 rustc 报告的 host triple 或用户指定的--target参数解析出操作系统与 CPU 架构并通过get_supported_architectures校验该操作系统架构组合是否在 maturin 的支持清单内不在清单中的组合会直接报错{arch} is not supported on {os}。因此在评估我的平台能否用 maturin 构建 Python 包时第一道门槛是 Rust 官方平台支持矩阵第二道门槛才是 maturin 自身的支持清单。自动化测试覆盖的 CI 平台maturin 的持续集成CI覆盖情况如下GitHub ActionsWindows、macOS、Linux 三个平台均为 64 位 x86 架构Cirrus CIFreeBSD 也有测试覆盖但官方文档提示该测试might get removed at some point可能在未来某个时间点被移除。由于 CI 的维护成本极高官方倾向于将测试面收敛在 GitHub Actions 上的三大主流平台。这意味着Windows、macOS、Linux 三平台是经过 CI 持续回归验证的一等公民其余平台的正确性更多依赖 Rust 工具链与社区反馈。官方发布产物可下载二进制与 wheel 的目标平台maturin 的 Releases 中会构建出两类产物可下载的 maturin 可执行文件以及 maturin 自身作为 Python 包pip install maturin的 wheel。官方文档明确列出的发布目标如下操作系统支持的发布目标Windows32 位 x86i686、64 位 x86x86_64、arm64aarch64Linuxx86i686、x86_64、armv7、aarch64、ppc64lemusl、s390xgnumacOSx86_64、aarch64这与源码中get_supported_architectures在 src/target/mod.rs 的定义一一对应Windows 只发布X86、X86_64、Aarch64三个架构macOS 只发布Aarch64、X86_64两个架构Linux 则覆盖了Aarch64、Armv5teL、Armv6L、Armv7L、Powerpc、Powerpc64、Powerpc64Le、S390X、X86、X86_64、Riscv32、Riscv64、Mips64el、Mips64、Mipsel、Mips、Sparc64、LoongArch64等更宽的架构集合。需要注意的是官方 Release 只覆盖上述发布目标并不代表 maturin 只能在上述平台上运行——见下文其他操作系统。其他操作系统如何让 maturin 支持一个新平台理论上只要 Rust 支持某平台maturin 就应该能够在该平台上构建自身并为其构建 wheel。官方文档给出了为新增操作系统添加支持的明确步骤在 target.rs 中添加该 OS将新操作系统加入Target平台解析逻辑即当前仓库中的 src/target/mod.rs 的Os枚举与from_triple匹配分支必要时扩展标签生成逻辑如果该 OS 的行为与其他 Unix 系统不同需要在PythonInterpreter::get_tag中做相应处理。该函数位于 src/python_interpreter/mod.rs用于生成 PEP 425 格式的 wheel 文件名标签{python tag}-{abi tag}-{platform tag}提交 sysconfig 快照把该平台上python -m sysconfig的输出作为一个文件提交到仓库的sysconfig文件夹中。该文件夹见 sysconfig/Readme.md专门收集各版本、各操作系统下python -m sysconfig的输出因为这些配置在不同版本和操作系统之间差异巨大但对于 wheel 与扩展库的命名至关重要。仓库中已收录如cpython-linux-3.9.txt、cpython-win-mingw64-3.9.txt、pypy-linux-ppc64le-3.9-7.3.txt等数十个快照setup.py 允许放宽默认特性官方文档说明为了pip install能正常工作修改setup.py以停用默认特性deactivate default features是可以接受的避免复杂 workaround新平台不应要求在compile.rs即 src/compile.rs中加入复杂的特殊处理逻辑。从源码结构看maturin 的Os枚举目前已经覆盖了 Linux、Windows、macOS、iOS、FreeBSD、NetBSD、OpenBSD、DragonFly、Solaris、Illumos、Haiku、Emscripten、WASI、AIX、Hurd、Cygwin、Android 等十余种操作系统见 src/target/mod.rs对应的平台标签生成逻辑也已在 src/target/platform_tag.rs 中实现——例如 FreeBSD 生成freebsd_{release}_{machine}格式标签、Emscripten 生成pyemscripten_{year}_{patch}_wasm32PEP 783或回退到旧式emscripten_{emcc_version}_wasm32、AIX 则匹配 CPython_aix_support.aix_platform()生成aix_{ver:x}{rel}{tl:02}_{builddate:04}_{bitsize}格式标签。架构支持与 manylinux 架构对齐官方文档明确所有被 manylinux 项目覆盖的架构——aarch64、armv7l、ppc64le、ppc64、i686、x86_64、s390x——maturin 均支持。同时官方也对是否应该允许 manylinux 都不支持的架构持保留态度Im not sure whether it makes sense to allow architectures that arent even supported by manylinux.从实现看这一对齐体现在两点架构解析Arch枚举src/target/mod.rs覆盖了Aarch64、Armv7L、Powerpc64Le、Powerpc64、X86、X86_64、S390X等 manylinux 支持的架构也包含了Riscv64、LoongArch64、MIPS 系、SPARC 系等更边缘的架构平台标签src/target/platform_tag.rs 中的get_platform_tag为 Linux 目标生成manylinux_{major}_{minor}_{arch}标签及其 legacy 别名如manylinux2014并且只有当别名出现在 PyPI 静态白名单中才会被加入标签集合——例如manylinux2014从未为 riscv64 定义过因此不会为 riscv64 生成该 legacy 别名。此外针对不同架构 maturin 还维护了最低 manylinux 标签的映射get_minimum_manylinux_tagaarch64、armv7l、ppc64、ppc64le、s390x最低为manylinux2014x86与x86_64在 rustc ≥ 1.64.0 时也最低为manylinux2014因为 rustc 1.64.0 将 glibc 最低要求提升到 2.17更早的 rustc 则允许manylinux2010而riscv64、loongarch64分别对应manylinux_2_31、manylinux_2_36。Python 解释器支持CPython、PyPy 与 GraalPy支持的版本范围官方文档对 Python 解释器支持给出了明确声明CPython3.8 到 3.14 受支持并在 CI 上测试整个 3.x 系列理论上都应可用。该范围会随新版本发布、旧版本生命周期结束而调整PyPyPyPy 3.8 及更高版本可用GraalPyGraalPy 23.0 及更高版本可用。从源码看这一范围与 src/python_interpreter/mod.rs 中的常量一致MINIMUM_PYTHON_MINOR 7放宽到 Python 3.7 以覆盖旧版、MAXIMUM_PYTHON_MINOR 14该上限特意放宽以包含预览版本、MINIMUM_PYPY_MINOR 8、MAXIMUM_PYPY_MINOR 11。InterpreterKind枚举定义了CPython、PyPy、GraalPy三种实现类型并支持大小写不敏感的字符串解析cpython、pypy、graalvm/graalpy。不同解释器的 wheel 标签差异maturin 为不同解释器生成不同的 PEP 425 标签详见get_wheel_tagsrc/python_interpreter/mod.rsCPythoninterpreter 标签为cp{major}{minor}ABI 标签为cp{major}{minor}{abiflags}例如cp39-cp39若启用 abi3PEP 384 稳定 ABI则使用通用的abi3标签并附带最低版本号PyPyinterpreter 标签为pp{major}{minor}ABI 标签由EXT_SUFFIX计算得出例如pp311-pypy311_pp73GraalPy与 PyPy 类似GraalPy 的版本也参与 ABI 组成例如graalpy310-graalpy231_310_native。标签生成还会考虑系统平台信息仅当目标是 Windows、非 portable 的 Linux 标签或 Illumos 时才使用sysconfig.get_platform()的结果其余情况使用根据 target 推导的平台标签以避免 macOS deployment target 等复杂因素的干扰。当sys.implementation.name与platform.python_implementation()不一致时如 Pyston则回退到通用标签生成逻辑。Manylinux / Musllinux 兼容策略、命令与审计支持的兼容标准官方文档声明 maturin 支持manylinux2014即manylinux_2_17及其更新版本musllinux_1_1及其更新版本。在 src/auditwheel/platform_tag.rs 中PlatformTag::is_supported的判断正是manylinux的(major, minor) (2, 17)、musllinux始终为 true。manylinux2014的字符串解析同时接受2014、manylinux2014、manylinux_2_17等形式。兼容策略数据policy JSONmanylinux/musllinux 合规检查的底层依据是两份策略 JSONsrc/auditwheel/manylinux-policy.json定义linux、manylinux_2_5别名manylinux1、manylinux_2_12别名manylinux2010、manylinux_2_17别名manylinux2014等策略每个策略按优先级priority排序并包含各架构允许的符号版本如GLIBC、GLIBCXX、CXXABI、LIBATOMIC、ZLIB、白名单库lib_whitelist如libc.so.6、libgcc_s.so.1、libstdc.so.6以及黑名单符号src/auditwheel/musllinux-policy.json定义musllinux_1_1、musllinux_1_2等策略。在 src/auditwheel/policy.rs 中两份 JSON 被编译期内联加载为MANYLINUX_POLICIES与MUSLLINUX_POLICIES并按 priority 从高到低排序。musllinux 还有一个特殊修复逻辑fixup_musl_libc_so_name由于不同架构上 musl libc 的 SONAME 不同如 aarch64 为libc.musl-aarch64.so.1、x86_64 为libc.musl-x86_64.so.1策略中的通用libc.so会被替换为对应架构的 SONAME。这与官方文档中Linux 发布目标包含 ppc64lemusl的声明相互印证。通过命令行控制兼容性maturin 通过--compatibility别名--manylinux命令行参数控制平台标签与 PyPI 兼容性定义见 src/build_options.rspypi适用于所有平台确保只使用能够上传到 PyPI 的标签manylinux系列如manylinux2014/manylinux_2_24musllinux系列如musllinux_1_2linux使用原生 Linux 标签但此类 wheel 会被 PyPI 拒绝除非另行通过 auditwheel 校验默认值最低兼容的 manylinux 标签若没有匹配则回退到linux。此外--auditwheel用于启用 manylinux 合规审计--zig需安装pip install maturin[zig]可使用 zig 链接器确保 manylinux 合规。注意manylinux1和manylinux2010不受 Rust 编译器支持rustc 1.64.0 起 glibc 最低要求为 2.17因此实际上限以manylinux2014为起点这与策略中is_supported的判断一致。合规审计的验证测试仓库中的测试脚本直观展示了合规性的验证方式tests/manylinux_compliant.sh在 CI 的 manylinux 镜像中遍历/opt/python/cp3[89]*/bin下的各 Python 版本对test-crates/pyo3-mixed执行maturin build --manylinux tag验证合规构建能够成功tests/manylinux_incompliant.sh反向验证两类失败场景——在 manylinux_2_28 环境下试图构建--manylinux 2010因 glibc 版本不满足而必须失败以及链接了带黑名单符号如 zlib 的gzflags的lib_with_disallowed_lib测试 crate 时构建--manylinux 2014必须失败。这两份脚本表明maturin 的 manylinux 兼容性不仅是打标签还会在构建产物层面审计所链接库的符号版本与白名单不满足策略的 wheel 会被直接拒绝。版本策略manylinux 版本号升级方式由于 Rust 与 manylinux 项目有时会停止支持旧的 manylinux/musllinux 版本官方文档明确了版本号策略after maturin 1.0 manylinux version bumps will be minor versions rather than major versions.即 maturin 1.0 之后若因上游Rust、manylinux 项目放弃旧版本而导致最低支持版本上移这类变更将通过 minor 版本号次版本发布而不是 major 版本号主版本发布——以降低对用户的破坏性影响。该策略同样适用于 musllinux 的最低版本。小结如何判断你的平台能否使用 maturin综合官方文档与源码实现判断一个平台是否可用的快速路径如下先查 Rust 平台支持目标平台是否在 Rust 官方支持矩阵中且有对应的 target triple再查 maturin 的 OS 支持清单对应操作系统是否出现在 src/target/mod.rs 的Os枚举与get_supported_architectures中核对架构与标签架构是否在Arch枚举内且 src/target/platform_tag.rs 是否能为该OS架构组合生成平台标签核对 Python 版本CPython 3.8–3.14整个 3.x 可用、PyPy 3.8、GraalPy 23.0核对 Linux libc 策略manylinux2014manylinux_2_17及以上、musllinux_1_1 及以上且构建产物需通过符号白名单审计。满足上述条件后即可通过maturin build --compatibility tag构建对应平台标签的 wheel或通过--target triple进行交叉编译。对于官方尚未收录的新平台可参照其他操作系统一节中的步骤向项目贡献支持其中最关键的一步是提交该平台python -m sysconfig的输出到sysconfig目录为后续 wheel 命名提供依据。赞分享开发工具构建工具【免费下载链接】maturinBuild and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages项目地址https://gitcode.com/gh_mirrors/ma/maturin点击查看免费下载相关推荐SSL4MIS10分钟快速上手指南 - 医学图像半监督分割入门SSL4MIS10分钟快速上手指南 医学图像半监督分割入门 SSL4MISSemi Supervised Learning for Medical Imag人工智能机器学习深度学习计算机视觉医疗健康sqlc跨平台兼容性支持多种操作系统和架构的终极指南sqlc跨平台兼容性支持多种操作系统和架构的终极指南 sqlc是一款能从SQL生成类型安全代码的强大工具它的跨平台兼容性让开发者可以在各种操作系统和架构上无开发工具代码生成数据库Ouroboros 平台支持全解操作系统、Python 版本与运行时后端的兼容性指南Ouroboros 平台支持全解操作系统、Python 版本与运行时后端的兼容性指南 OuroborosAgent OS是一个以规范Seed驱动、具备AI Agent人工智能代码智能体Agent 编排AI 评测CLI开发工具上一篇突破AI心理陪伴技术壁垒efaqa-corpus-zh如何重塑中文心理咨询数据生态下一篇GHelper深度解析华硕笔记本轻量级控制工具的终极实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

drawio-mcp Mermaid 生成指南:28 种图类型语法、ELK 布局与样式实战

drawio-mcp Mermaid 生成指南:28 种图类型语法、ELK 布局与样式实战

AI 应用MCP 服务交互助手 【免费下载链接】drawio-mcp 项目地址: https://gitcode.com/gh_mirrors/dr/drawio-mcp 点击查看 免费下载 本篇指南以 drawio-mcp 仓库中面向 LLM 的 shared/mermaid-reference.md 为骨架,系统讲解在 draw.io 中生成可正确渲染…

2026/10/12 2:01:06 阅读更多 →
蓝鲸 CMDB 批量创建 Workload 接口(batch_create_kube_workload)实战指南

蓝鲸 CMDB 批量创建 Workload 接口(batch_create_kube_workload)实战指南

后端企业应用运维 【免费下载链接】bk-cmdb 蓝鲸智云配置平台(BlueKing CMDB) 项目地址: https://gitcode.com/gh_mirrors/bk/bk-cmdb 点击查看 免费下载 本文围绕蓝鲸智云配置平台(BlueKing CMDB)API Gateway 提供的 batch_create_kube_wor…

2026/10/12 2:01:06 阅读更多 →
电大计算机平面设计形考作业:Illustrator临摹与InDesign杂志排版答案包

电大计算机平面设计形考作业:Illustrator临摹与InDesign杂志排版答案包

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

2026/10/12 2:01:06 阅读更多 →

最新新闻

季节尺度M-K突变检测的Python实现:原理、代码与实用避坑指南

季节尺度M-K突变检测的Python实现:原理、代码与实用避坑指南

简介:基于Python的季节尺度M-K突变检测脚本,面向气候、水文、环境等领域的科研人员与有一定编程基础的学生,用于从SPEI等季节性时间序列数据中识别趋势突变点。脚本以SPEI3.xlsx为示例数据,完整演示了数据读取、缺失值检查、季节性…

2026/10/12 4:23:37 阅读更多 →
用md2wechat-skill将Markdown转换为公众号排版:本地转换工具实战指南

用md2wechat-skill将Markdown转换为公众号排版:本地转换工具实战指南

做技术公众号的人大概都有一份隐蔽的困扰:内容管理用Markdown,发布却要面对微信编辑器那一套网页排版。写的时候行云流水,粘贴进后台就原形毕露——代码块塌掉、表格错位、图片裂开。前前后后我折腾过好几套转换方案,目前用得最顺…

2026/10/12 4:23:37 阅读更多 →
OBCA题库拆解OceanBase硬知识:Paxos、Zone与运维实战

OBCA题库拆解OceanBase硬知识:Paxos、Zone与运维实战

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

2026/10/12 4:23:36 阅读更多 →
专业数据库数据共享策略:从数据孤岛到可控流通的落地拆解

专业数据库数据共享策略:从数据孤岛到可控流通的落地拆解

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

2026/10/12 4:23:36 阅读更多 →
lakeFS Java SDK 中的 GarbageCollectionRules:垃圾回收保留策略的数据模型与配置实战

lakeFS Java SDK 中的 GarbageCollectionRules:垃圾回收保留策略的数据模型与配置实战

数据工程数据湖大数据对象存储后端 【免费下载链接】lakeFS lakeFS - Data version control for your data lake | Git for data 项目地址: https://gitcode.com/gh_mirrors/la/lakeFS 点击查看 免费下载 本文以 GarbageCollectionRules.md 为骨架,系统…

2026/10/12 4:23:36 阅读更多 →
PS5游戏信息聚合工具实战:Python爬虫、数据清洗与全文搜索构建记录

PS5游戏信息聚合工具实战:Python爬虫、数据清洗与全文搜索构建记录

先交代一下背景。我是个游戏库存控,平时最大的爱好就是逛各个商店页面和评分站,看看最近有什么值得入手的PS5游戏。可时间一长,我发现自己每天至少要在五六个不同站点之间来回切换——想确认口碑得去媒体评分站,想比价格得看商店页…

2026/10/12 4:22:36 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →