如何仅列出Rails应用自定义Rake任务,无需使用难维护的grep语句
仅列出Rails应用自定义Rake任务的实现方案
Rake原生支持记录任务的定义文件路径,我们可以直接基于路径过滤出存放在应用lib/tasks/目录下的自定义任务,完全规避shell grep方案的所有缺陷。
实现步骤
- 在应用
lib/tasks/目录下新建list_custom.rake文件,写入以下代码:
namespace :list do desc "仅展示当前应用自定义的Rake任务,可传入关键词过滤,用法:rake list:custom_tasks [关键词]" task custom_tasks: :environment do # 开启任务元数据记录,确保能拿到任务定义路径 Rake::TaskManager.record_task_metadata = true # 加载应用所有Rake任务 Rails.application.load_tasks custom_task_dir = Rails.root.join("lib/tasks").to_s filter_keyword = ARGV.drop(1).first Rake.application.tasks.each do |task| # 跳过无描述的隐藏任务,和原生rake -T行为保持一致 next unless task.full_comment # 过滤自定义目录下的任务 is_custom = task.locations.any? { |path| path.start_with?(custom_task_dir) } next unless is_custom # 支持关键词过滤 next if filter_keyword && !task.name.include?(filter_keyword) # 输出格式和原生rake -T保持一致 printf "%-#{Rake.application.max_column_width}s # %s\n", task.name, task.full_comment end # 避免rake把额外参数当成任务执行 exit 0 end end
- 执行命令使用:
- 列出所有自定义任务:
rake list:custom_tasks - 按关键词过滤自定义任务(比如过滤所有和
db相关的自定义任务):rake list:custom_tasks db
- 列出所有自定义任务:
方案优势
- 完全基于Rake、Rails原生能力实现,不受Rails版本升级、新增/更新gem的影响,过滤规则永久有效
- 不存在误过滤问题,不需要要求自定义任务命名避开特定关键词
- 可扩展性强,可根据需求调整为按子目录分类展示、导出任务列表等功能
内容的提问来源于stack exchange,提问作者iconoclast
相关产品推荐
相关产品推荐

