news 2026/9/9 23:30:52

ty 类型检查器 CLI 完整参考:命令、选项、退出码与规则管理实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ty 类型检查器 CLI 完整参考:命令、选项、退出码与规则管理实战

ty 类型检查器 CLI 完整参考:命令、选项、退出码与规则管理实战

【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruff

导读

ty是本仓库中随 Astral 工具链一同开发的超高速 Python 类型检查器(源码位于 crates/ty,相关 crate 还包括类型语义分析 crates/ty_python_semantic 与项目解析 crates/ty_project),其核心日常操作全部集中在ty这一个命令及其子命令上。本文以官方文档 crates/ty/docs/cli.md 为骨架,逐条详解ty check的全部参数、ty serverty versionty explain等命令的语义,并结合 crates/ty/src/args.rs 与 crates/ty/src/lib.rs 的源码实现说明参数背后的真实行为(如规则覆盖顺序、退出码判定逻辑、配置优先级)。读完本文,你将能够熟练配置出适合本地开发与 CI 的类型检查命令。

文档一致性说明:cli.md是自动生成文件(文件头部注明由cargo dev generate-all生成),所有命令与参数的真实「唯一事实源」是 crates/ty/src/args.rs 中基于 clap 的 doc 注释与参数声明。若需修改 CLI 行为,正确做法是修改该文件后重新生成文档。

ty 顶层命令结构

ty本身不带子命令以外的直接参数,整体用法为:

ty <COMMAND>

顶层子命令共 5 个(外加 1 个隐藏命令),在 args.rs 的Command枚举中声明:

子命令说明对应文档章节
ty check检查项目中的类型错误(核心命令)# ty check
ty server启动语言服务器# ty server
ty version显示 ty 版本# ty version
ty generate-shell-completion生成 shell 补全(在 args.rs 中被标记为隐藏)见下文
ty explain解释规则及 ty 的其他组成部分# ty explain
ty help打印本消息或给定子命令的帮助# ty help

同时,ty --helpty -h的区别在 clap 中表现为:-h输出精简版帮助,--help输出完整帮助。整个 CLI 采用 clap 定义,入口在 crates/ty/src/lib.rs 的run():先进行通配符展开与@file参数文件展开,再按子命令分发执行。

ty check:项目类型检查主命令

ty check用于对一个 Python 项目(或一组路径)做全量类型检查,是本工具被调用频率最高的命令:

ty check [OPTIONS] [PATH]...

PATHS 参数与项目发现

  • PATHS:要检查的文件或目录列表。不传时默认检查「项目根目录」;传多个路径时逐个检查。
  • --project <project>:在给定的项目目录内运行命令。ty 会从该目录向上逐级发现pyproject.toml,并在未设置venv-path选项时顺带发现项目的虚拟环境.venv;但其他命令行参数(如相对路径)仍相对当前工作目录解析。

从源码 lib.rs 可以看到,所有传入路径在解析阶段都会被转换为相对当前工作目录的绝对路径;若命令行传入的是文件而非目录,ty 会按独立脚本处理(例如uv run --script场景),不继承外层 workspace。

环境解析:Python 解释器、typeshed 与额外搜索路径

选项说明
--python <path>--venvPython 环境或解释器路径。可指向三种对象:解释器(如.venv/bin/python3)、虚拟环境目录(如.venv)、系统 Python 的sys.prefix目录(如/usr)。ty 用它来解析代码中的第三方导入。若你正使用 uv、conda 或已激活的虚拟环境,通常无需指定本选项
--typeshed <path>--custom-typeshed-dir自定义的标准库 typeshed stub 目录
--extra-search-path <path>额外的模块解析来源路径,可多次传入。属高级选项,通常只用于以非常规方式安装、且不在当前 Python 环境中的一三方模块;若只是环境位置特殊,应改用--python

其中--python在 args.rs 中被声明为--python的 alias,两种写法等价。

Python 版本与平台

选项说明
--python-version <version>--target-version解析类型时假设的 Python 版本。会影响允许的语法、标准库类型定义,以及依赖 Python 版本的一三方模块类型定义

版本取值:3.7、3.8、3.9、3.10、3.11、3.12、3.13、3.14、3.15(定义见 crates/ty/src/python_version.rs,两端取值可在ty check --help中复核)。

未显式指定时的推导顺序(按优先级从高到低,来自 args.rs 的 doc 注释):

  1. 读取pyproject.tomlproject.requires-python设置,取该范围的最低版本;
  2. 检查已激活或已配置的 Python 环境,尝试推断其版本;
  3. 回退到 ty 支持的最新稳定版Python。
选项说明
--python-platform <platform>--platform解析类型时假设的目标平台。用于特化sys.platform的类型,并影响平台专属函数与属性的可见性;设为all表示不对平台做任何假设;不指定时使用当前系统平台

规则启用与禁用:--error / --warn / --ignore

规则严重级别调整是ty check最具特色的能力,三参数均支持多次出现,并可用all表示作用于全部规则:

  • --error <rule>:将给定规则视为error级。可重复,可用all
  • --warn <rule>:将给定规则视为warn级。可重复,可用all
  • --ignore <rule>:禁用该规则。可重复,可用all

从源码角度,这三个参数由 args.rs 中自定义的RulesArg类型解析,其注释明确指出:后出现的规则参数会覆盖先前的严重级别("arguments last override previous severities")。实现上,RulesArg::from_arg_matches会记录每个参数出现的索引并按索引排序,从而保证覆盖语义正确。例如:

# 全部规则按 error 级别检查,但禁用 call-non-callable ty check --error all --ignore call-non-callable # 只把 conflicting-metaclass 提级为 error、ambiguous-protocol-member 降级为 warn ty check --error conflicting-metaclass --warn ambiguous-protocol-member

可用的规则名以 crates/ty/docs/rules.md 列出的为准,例如abstract-and-final-methodcall-non-callableconflicting-metaclass等。

修复与自动抑制:--fix 与 --add-ignore

选项说明
--fix应用修复以解决错误
--add-ignore添加ty: ignore注释以抑制全部规则诊断

二者在 args.rs 中声明了conflicts_with(互斥,不能同时使用)。底层行为可追溯至 lib.rs 的主循环:

  • --fix调用ty_python_semantic::fix_all_diagnostics,并以Applicability::Safe为界限,只应用安全的自动修复;
  • --add-ignore调用ty_python_semantic::suppress_all_diagnostics,将诊断替换为行内ty: ignore注释;
  • 在人类可读输出下,--add-ignore结束时还会打印 "Added N ignore comment(s)" 汇总。

文件选择与排除

选项说明
--exclude <exclude>排除出类型检查的文件 glob 模式。使用 gitignore 风格语法,支持如tests/*.tmp**/__pycache__/**等写法
--force-exclude/--no-force-exclude即使路径被直接传给 ty 命令行,也强制执行排除规则;--no-force-exclude关闭
--respect-ignore-files/--no-respect-ignore-files遵循.gitignore及其他标准 ignore 文件的排除规则;--no-respect-ignore-files关闭
--exclude-scripts/--include-scripts排除包含 PEP 723 行内脚本元数据的文件(除非显式传入);--include-scripts关闭

注意这些布尔开关在 args.rs 中均为「配对」定义:一个公开的正向开关配一个隐藏的反向开关,最终通过resolve_bool_arg合并成Some(true)/Some(false)/None三态——只有当用户显式传参时才覆盖配置文件中的对应设置,避免 CLI 默认值意外压过配置文件里已显式声明的值。

诊断输出格式

选项说明
--output-format <output-format>诊断信息的打印格式,也可通过环境变量TY_OUTPUT_FORMAT设置

五种可选值(枚举定义在 args.rs):

取值语义
full冗长打印诊断,附上下文与有用提示(默认
concise每条诊断精简为一行打印,仅含最核心信息,丢弃上下文
gitlab以 GitLab Code Quality 报告期望的 JSON 格式输出
github以 GitHub Actions 工作流错误注解格式输出
junit输出为 JUnit 风格 XML 报告

例如在 GitHub Actions 中可直接使用--output-format github让错误以工作流注解形式内联显示;JUnit 与 GitLab 格式则面向对应的 CI 平台报表。

退出码控制

选项说明
--error-on-warning只要存在 warning 级诊断就使用退出码 1。不可与--exit-zero--exit-zero-on-warning同时使用
--exit-zero即使存在 error 级诊断也始终使用退出码 0。不可与--error-on-warning同时使用
--exit-zero-on-warning若不存在 error 级诊断就使用退出码 0。不可与--error-on-warning同时使用

底层退出码判定见 lib.rs 的exit_status_from_diagnostics:程序先扫描所有诊断的最高严重级别(Info < Warning < Error < Fatal),再结合error_on_warning终端设置决定成败;若诊断中同时含有 IO 错误则直接返回「命令错误」。ExitStatus的完整语义如下:

退出码含义来源
0命令成功(或存在诊断但按规则不视为失败)ExitStatus::Success
1检查完成但存在 error 级诊断;或--error-on-warning下有 warning 诊断;或可执行文件发现失败ExitStatus::Failure
2调用错误(如当前目录不存在、CLI 参数错误)ExitStatus::Error
101ty 内部错误(panic 或非用户原因的错误)ExitStatus::InternalError
130被 Ctrl+C 中断ExitStatus::Interrupted

这使 ty 可以直接嵌入 CI 判断:默认命令ty check返回 1 即表示需要修复,而--exit-zero可用于「只报告不阻断」的持续集成场景。

其他控制选项

选项说明
--color <when>控制彩色输出时机:auto(输出到交互终端时着色,默认)、always(总是着色)、never(永不着色)
--no-progress隐藏全部进度输出(spinner、进度条等)
--quiet-q安静输出;-qq表示完全静默
--verbose-v详细输出;-vv-vvv更详细(对应 tracing 级别的提升)
--watch-W监听文件变化,对与变更文件相关的文件增量重查
--config-file <path>指定用于配置的ty.toml文件路径。虽然 ty 配置也可以放入pyproject.toml,但在此场景下不被接受。也可通过环境变量TY_CONFIG_FILE设置
--config <key> = <value>-c以 TOML<KEY> = <VALUE>键值对形式覆盖单个配置项(写法与ty.toml中一致),可多次传入

配置优先级值得一提:CLI 通过--config传入的单项覆盖,其优先级始终高于所有配置文件。这在 args.rs 的ConfigsArg中实现——每个-c键值对被解析为一份OptionsOptions::from_toml_str),随后在 lib.rs 中按「先应用配置文件、再应用 CLI 覆盖」的顺序合并,CLI 覆盖天然胜出。完整配置项语义参见 crates/ty/docs/configuration.md。

示例——将配置与命令结合使用:

# 在指定 Python 3.12 环境下做全量检查 ty check --python .venv/bin/python3 --python-version 3.12 # 检查单个目录,并额外排除两个目录 ty check src/ --exclude "tests/" --exclude "**/generated/**" # 一次性查看所有错误并自动应用安全修复 ty check --fix # CI 中按 warning 即失败,并输出 GitHub 注解格式 ty check --error-on-warning --output-format github # 交互式持续开发:监听变化、增量重查 ty check --watch

watch 模式与主循环的内部结构

从源码看,--watch并非简单循环重跑:ty check的检查流程由基于 Salsa 增量数据库的MainLoop驱动(lib.rs)。主循环通过消息通道接收「检查请求、变更事件、uv 环境同步完成」三类消息,并让检查任务在 rayon 线程池中异步执行;文件系统变更会通过watch::directory_watcher上报,变更时自动取消进行中的查询并按 revision 丢弃过期的检查结果。Ctrl+C 处理被注册为取消令牌,触发后返回退出码 130。进度条由IndicatifReporter呈现(Checking {pos}/{len} files),因此--no-progress能关闭包括脚本同步进度在内的全部进度 UI。

ty server:启动语言服务器

ty server

ty server以无参数形式启动语言服务器,除--help/-h外没有公开选项。在 args.rs 中还存在一个被隐藏的调试参数--find-executable:它会打印当前目录对应项目应使用的 ty 可执行文件绝对路径(若已通过environment.python配置则优先使用,否则按常规顺序发现 Python 环境),供编辑器集成定位后端,退出码 0 表示找到、1 表示发现失败、2 表示意外错误。该命令的实际服务实现位于 crates/ty/src/server.rs,完整的 LSP 功能栈由 crates/ty_server 提供。

ty version:查看版本

ty version [OPTIONS]

唯一选项为--output-format,默认值text,可选textjson

  • text:输出形如ty 0.5.1+24 (53b0f5d92 2026-01-01)的单行信息;
  • json:输出结构化 JSON。

版本数据的组装在 crates/ty/src/version.rs:VersionInfo由版本号字符串与可选的CommitInfo组成,其中提交信息(短哈希、完整哈希、提交日期、最近 tag、距最近 tag 的提交数)在构建期由build.rs注入环境变量读取;text格式规则为<version>[+N] (<short_commit_hash> <date>)+N仅在距最近 tag 存在未发布提交时出现。发布版本号来自工作区的dist-workspace.toml(本仓库内ty包本身处于开发期,版本为0.0.0且不发布,见 crates/ty/Cargo.toml)。

ty generate-shell-completion:生成 shell 补全

ty generate-shell-completion <SHELL>

该命令在官方文档中有记录,但在 args.rs 中被标注为隐藏(#[clap(hide = true)])。它接收一个 shell 名(由clap_complete_command支持)并输出对应 shell 的补全脚本到 stdout,例如可在 bash/zsh/fish 配置中将其输出重定向到补全目录。

ty explain:规则速查与解释

ty explain <COMMAND>

ty explain是面向文档与排查的子命令,下辖ty explain rule与帮助入口ty explain help

ty explain rule:查看单条或全部规则

ty explain rule [OPTIONS] [RULE]
  • 位置参数RULE:要解释的规则名;省略时默认解释全部规则
  • --output-format:输出格式,默认text,可选textjson

实现位于 crates/ty/src/rule.rs:它会查询default_lint_registry()注册表,将匹配的LintId渲染为包含以下字段的说明:

  • 规则名(如call-non-callable);
  • 默认级别(ignore / warn / error);
  • 状态Preview (since X)Stable (since X)Deprecated (since X): reasonRemoved (since X): reason
  • 规则的完整文档正文。
# 查看某条规则 ty explain rule call-non-callable # 以 JSON 输出全部规则的说明(可用于生成工具链) ty explain rule --output-format json

text输出以 Markdown 风格呈现,每条规则从# <rule-name>标题开始,可直接作为阅读材料;json输出为序列化数组,方便被脚本消费。所有规则的完整人类可读文档集中在 crates/ty/docs/rules.md。

常见组合:本地开发与 CI 两套命令

结合上述选项,可沉淀两套典型用法:

本地开发(自动修复 + 增量监听):

# 一键安全检查并自动修复可安全修复的问题 ty check --fix # 开发期间持续监听 ty check --watch

CI 门槛(报警即失败 + 平台格式):

# GitHub Actions:warning 也视为失败,输出注解 ty check --error-on-warning --output-format github # GitLab:输出 Code Quality 报告 JSON ty check --output-format gitlab # 只读报告、不阻断:即使有 error 也返回 0 ty check --exit-zero

相关参考

  • 本命令参考文档原文件:crates/ty/docs/cli.md
  • CLI 定义与参数解析(唯一事实源):crates/ty/src/args.rs
  • 入口与主循环、退出码: crates/ty/src/lib.rs、crates/ty/src/main.rs
  • 规则文档与配置说明:crates/ty/docs/rules.md、crates/ty/docs/configuration.md
  • 环境变量(如TY_CONFIG_FILETY_OUTPUT_FORMAT)完整清单:crates/ty/docs/environment.md

【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruff

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 23:29:32

MFC CListCtrl列标题自动换行实现:CHeaderCtrl子类化与DrawText用法

简介&#xff1a;一套VC List标题栏自动换行的完整工程源码&#xff0c;面向MFC开发者&#xff0c;解决ListView控件在显示长标题时被截断为省略号的问题。通过自定义HeaderCtrl控件接管标题绘制&#xff0c;实现多行文本自动换行&#xff0c;让界面信息更清晰。压缩包共30个文…

作者头像 李华
网站建设 2026/9/9 23:29:14

n8n读写本地文件实战:场景、Docker权限与自动清理

我从 n8n 里第一次真正把文件写到服务器磁盘&#xff0c;其实是被一个很老的业务系统逼的。那套系统不支持任何接口&#xff0c;供应商只留了一个“把 CSV 放到指定目录”的入口&#xff0c;而且每天凌晨必须更新。当时我新接手的 n8n 是个纯 API 编排工具&#xff0c;四处找了…

作者头像 李华
网站建设 2026/9/9 23:28:28

家政物业费返佣小程序开发实战:佣金结算模块设计指南

家政物业费返佣小程序开发实战&#xff1a;佣金结算模块设计指南 在许多同城上门服务场景中&#xff0c;物业费代缴、家政服务推广与小区物业之间存在天然的返佣联动需求。家政物业费返佣小程序的本质&#xff0c;并不是一个单独的“缴费工具”&#xff0c;而是将家政服务订单…

作者头像 李华
网站建设 2026/9/9 23:23:05

深夜跨链桥Gas异常排查记:Nonce卡顿与守护者脚本的诞生

凌晨两点半&#xff0c;手机连着震了七下。第一反应是“又来”&#xff0c;第二反应是“最近三周没白过&#xff0c;终于轮到我了”。打开告警群一看&#xff0c;果然是跨链桥那边出了事&#xff1a;一条链上的充值交易已经确认超过四十分钟&#xff0c;目标链上迟迟没有任何响…

作者头像 李华
网站建设 2026/9/9 23:22:26

书霸AI问卷设计:把模糊想法变成好问题

书霸AI官网&#xff1a;www.shubaai.com晚上十点&#xff0c;林悦还盯着电脑发愁。她准备做一项关于“大学生线上学习体验”的调查&#xff0c;脑子里有很多想了解的内容&#xff1a;学习频率、平台选择、课程满意度、遇到的困难……可真正打开问卷工具后&#xff0c;她才发现&…

作者头像 李华