phpstan-todo-by

phpstan-todo-by

PHPStan扩展实现代码注释智能过期管理

phpstan-todo-by是PHPStan的扩展工具,用于管理代码中带有过期条件的TODO/FIXME/XXX注释。它支持日期、GitHub问题、语义版本和票据引用等多种格式,能将满足条件的注释自动转换为PHPStan错误。该工具提供灵活配置,兼容多种问题跟踪系统,并可匹配Composer依赖版本,有助于开发团队更高效地跟踪和处理代码中的待办事项。

PHPStanTODO注释代码分析过期检查PHPGithub开源项目

phpstan-todo-by: 带有到期日的注释

PHPStan扩展,用于检查带有到期日的TODO/FIXME/XXX注释。 灵感来自parker-codes/todo-by

示例

主要思想是,当满足某个条件时(例如达到某个日期、符合某个版本、某个问题追踪票据关闭),源代码中的注释将转化为PHPStan错误。

<?php // TODO: 2023-12-14 这条注释将在2023年12月14日变成PHPStan错误 function doFoo() { /* ... */ } // TODO https://github.com/staabm/phpstan-todo-by/issues/91 当这个GitHub问题关闭时修复我 class FooClass {} // TODO: <1.0.0 这必须在此仓库的第一个主要版本中完成 function doBar() { /* ... */ } // FIXME: phpunit/phpunit:5.3 当更新phpunit到5.3.x或更高版本时必须修复这个 function doFooBar() { /* ... */ } // XXX: php:8 当需要php 8.x时删除这个polyfill // TODO: APP-2137 当问题追踪票据解决时这个注释会报错 function doBaz() { /* ... */ }

支持的todo格式

todo注释也可以只包含一个约束条件而没有任何文本,如// @todo 2023-12-14。 如果在日期后给出文本,这个文本将被用作PHPStan错误消息。

  • todoTODOtOdOFIXMEXXX关键词不区分大小写
  • todo关键词可以前缀或后缀@字符
  • todo@后可能包含用户名
  • 注释中可能混有:-字符
  • 支持多行/* *//** */注释

开箱即用的注释可以通过不同的约束条件到期:

  • 通过YYYY-MM-DD格式的日期,与参考时间匹配
  • 通过完整的github问题URL
  • 通过语义版本约束,与Composer依赖匹配(通过composer.lock

还有更多内置约束,但这些需要额外配置

以下是支持的不同注释变体示例:

// todo 2023-12-14 // @todo: 2023-12-14 修复它 // @todo 2023-12-14: 修复它 // XXX - 2023-12-14 修复它 // FIXME 2023-12-14 - 修复它 // TODO@staabm 2023-12-14 - 修复它 // TODO@markus: 2023-12-14 - 修复它 // TODO https://github.com/staabm/phpstan-todo-by/issues/91 当这个GitHub问题关闭时修复我 /* * 其他文本 * * @todo 2023-12-14 经典多行注释 * 更多注释数据 */ // TODO: <1.0.0 这必须在第一个主要版本中完成 // TODO >123.4: 必须修复这个或提升版本 // TODO: phpunit/phpunit:<5 在更新到phpunit 5.x之前必须修复这个 // TODO@markus: phpunit/phpunit:5.3 当更新phpunit到5.3.x或更高版本时必须修复这个 // TODO: APP-123 当这个Jira票据关闭时修复它 // TODO: #123 当这个GitHub问题关闭时修复它 // TODO: GH-123 当这个GitHub问题关闭时修复它 // TODO: some-organization/some-repo#123 如果这个GitHub拉取请求关闭则更改我

配置

不可忽略的错误

默认情况下,扩展发出的错误是不可忽略的,因此它们不能被意外地放入基线中。 你可以在phpstan.neon中使用配置选项来更改此行为:

parameters: todo_by: nonIgnorable: false # 默认为true

参考时间

默认情况下,日期todo注释是根据今天的日期进行检查的。

你可能对哪些注释将在未来7天内到期感兴趣,这可以通过referenceTime选项配置。 你需要配置一个可被strtotime解析的日期。

parameters: todo_by: # 任何strtotime()兼容的字符串 referenceTime: "now+7days"

使用环境变量尤其方便,这样你可以通过CLI传递参考日期:

parameters: todo_by: referenceTime: %env.TODOBY_REF_TIME%

TODOBY_REF_TIME="now+7days" vendor/bin/phpstan analyze

参考版本

默认情况下,版本todo注释是根据"nextMajor"版本进行检查的。 它是通过获取最新的本地可用git标签并增加主版本号来确定的。

可以通过referenceVersion选项配置行为。 可能的值是"nextMajor""nextMinor""nextPatch"(这些将基于最新的本地git标签计算)或任何其他版本字符串,如"1.2.3"

parameters: todo_by: # "nextMajor"、"nextMinor"、"nextPatch"或版本字符串如"1.2.3" referenceVersion: "nextMinor"

如上面"参考时间"段落所示,你甚至可以使用环境变量代替。

[!注意] 参考版本不适用于包版本todo注释,这些注释是根据composer.lock匹配的。

先决条件

确保在你的git克隆中可用标签,例如通过运行git fetch --tags origin - 否则你可能会遇到"无法确定最新git标签"的错误。

在GitHub Action中,可以这样做:

- name: Checkout uses: actions/checkout@v4 - name: Get tags run: git fetch --tags origin

多GIT仓库支持

默认情况下,用于计算参考版本的最新git标签只会为所有被分析的文件获取一次。

可以通过singleGitRepo选项配置此行为。

如果你使用git子模块,或者被分析的代码库由多个git仓库组成, 将singleGitRepo选项设置为false,这将为每个被分析的目录解析参考版本。

虚拟包

在PHPStan配置文件中,你可以定义额外的包,以匹配包版本todo注释。

parameters: todo_by: virtualPackages: 'staabm/mypackage': '2.1.0' 'staabm/my-api': '3.1.0'

在你的todo注释中像引用任何其他包一样引用这些虚拟包:

// TODO staabm/mypackage:2.2.0 一旦staabm/mypackage更新到2.2.0就删除以下函数

问题追踪器键支持

可选地,你可以配置此扩展来分析带有问题追踪器票据键的注释。 扩展获取问题追踪器API以获取问题状态。如果远程问题已解决,将报告该注释。

目前支持Jira、GitHub和YouTrack。 此功能默认禁用。要启用它,您必须将 ticket.enabled 参数设置为 true。 您还需要设置以下参数:

parameters: todo_by: ticket: enabled: true # 以下之一: jira, github (区分大小写) tracker: jira # 区分大小写的状态名称列表。 # 只有具有这些状态之一的票据才被视为已解决。 # 支持的跟踪器: jira。其他跟踪器忽略此参数。 resolvedStatuses: - Done - Resolved - Declined # 如果您的票据键是 FOO-12345,则此值应为 ["FOO"]。 # 允许多个键前缀,例如 ["FOO", "APP"]。 # 只分析包含此前缀的键的注释。 # 支持的跟踪器: jira, youtrack。其他跟踪器忽略此参数。 keyPrefixes: - FOO jira: # 例如 https://your-company.atlassian.net server: https://acme.atlassian.net # 请参阅下面的可能格式。 # 如果此值为空,将使用凭据文件。 credentials: %env.JIRA_TOKEN% # 包含 Jira 凭据的文件路径。 # 请参阅下面的可能格式。 # 如果 credentials 参数不为空,将使用它而不是此文件。 # 此文件不能提交到存储库中! credentialsFilePath: .secrets/jira-credentials.txt github: # 引用存储库的账户所有者。 defaultOwner: your-name # 不带 .git 扩展名的存储库名称。 defaultRepo: your-repository # GitHub 访问令牌 # 如果此值为空,将使用凭据文件。 credentials: null # 包含 GitHub 访问令牌的文件路径。 # 如果 credentials 参数不为空,将使用它而不是此文件。 # 此文件不能提交到存储库中! credentialsFilePath: null youtrack: # 例如 https://your-company.youtrack.cloud server: https://acme.youtrack.cloud # YouTrack 永久令牌 # 如果此值为空,将使用凭据文件。 credentials: %env.YOUTRACK_TOKEN% # 包含 YouTrack 永久令牌的文件路径 # 如果 credentials 参数不为空,将使用它而不是此文件。 # 此文件不能提交到存储库中! credentialsFilePath: .secrets/youtrack-credentials.txt

Jira 凭据

此扩展使用 Jira 的 REST API 获取票据状态。如果您的看板不是公开的,您需要配置有效的凭据。 支持以下身份验证方法:

我们建议您使用 OAuth 而不是基本身份验证,特别是如果您在 CI 中使用 phpstan。 有多种方法可以将凭据传递给此扩展。 您应该选择其中一种 - 如果您同时定义了两个参数,则只考虑 credentials 参数,忽略文件。

在环境变量中传递凭据

配置 credentials 参数以从环境变量读取值:

parameters: todo_by: ticket: jira: credentials: %env.JIRA_TOKEN%

根据所选的身份验证方法,其内容应为:

  • 基于令牌的身份验证的访问令牌,例如 JIRA_TOKEN=ATATT3xFfGF0Gv_pLFSsunmigz8wq5Y0wkogoTMgxDFHyR...
  • 基本身份验证的 <用户名>:<密码或API密钥>,例如 JIRA_TOKEN=john.doe@example.com:p@ssword
在文本文件中传递凭据

在项目目录(或计算机上的其他位置)创建文本文件,并将其路径放入配置中:

parameters: todo_by: ticket: jira: credentialsFilePath: path/to/file

记住不要将此文件提交到存储库中! 根据所选的身份验证方法,其值应为:

  • 基于令牌的身份验证的访问令牌,例如 JATATT3xFfGF0Gv_pLFSsunmigz8wq5Y0wkogoTMgxDFHyR...
  • 基本身份验证的 <用户名>:<密码或API密钥>,例如 john.doe@example.com:p@ssword

GitHub

同时支持 issues 和 pull requests。如果引用的 issue/PR 已关闭,则会报告该注释。 有多种方法可以引用 GitHub issue/PR:

仅数字
// TODO: #123 - fix me // TODO: GH-123 - fix me

如果 defaultOwner 设置为 acme,defaultRepo 设置为 hello-world,则引用的 issue 解析为 acme/hello-world#123

所有者 + 存储库名称 + 数字
// TODO: acme/hello-world#123 - fix me

安装

要使用此扩展,请在 Composer 中安装它:

composer require --dev staabm/phpstan-todo-by

如果您还安装了 phpstan/extension-installer,那么一切就绪!

<details> <summary>手动安装</summary>

如果您不想使用 phpstan/extension-installer,请在项目的 PHPStan 配置中包含 extension.neon:

includes:
    - vendor/staabm/phpstan-todo-by/extension.neon
</details>

常见问题

意外的 '"php" 版本要求 ">=XXX" 已满足' 错误

如果您过早地遇到这些错误,可能是由于 composer.json 文件中的版本约束不正确。 例如,php 版本约束 ^7.4 意味着 >=7.4.0 && <= 7.999999.99999, 这意味着像 // TODO >7.5 这样的注释会发出错误。

对于 php 声明,建议使用带有固定上限的版本约束,例如 7.4.*^7 || <8.3

'无法确定最新的 git 标签' 错误

当 git 克隆中没有可用的 git 标签时,会抛出此错误。 按照上面"引用版本"章节中的描述获取 git 标签。

💌 给予一些爱

考虑支持该项目,这样我们就可以更快地为每个人做出更好的工具。

编辑推荐精选

蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多