如何在Rake文件任务依赖项中使用匹配模式替换硬编码路径?
在Rake中实现模式匹配的文件任务依赖
嗨,这个需求太常见啦!你之前用的file是针对单个文件的任务定义,要实现类似*.json对应lib/$1.rb的动态依赖,得用Rake的**rule规则**——它专门用来处理通用的文件生成模式。
下面给你两种常用的实现方式:
方法一:正则捕获组
用正则表达式匹配目标文件名,捕获前缀部分来生成对应的依赖路径:
# 匹配所有xxx.json文件,捕获xxx部分 rule /^(.*)\.json$/ => lambda { |target_file| "lib/#{$1}.rb" } do |task| # 这里写生成json文件的逻辑,比如: # 1. 加载对应的rb依赖文件 require_relative task.source # 2. 调用生成逻辑(假设你的rb文件里有生成方法) generate_json_file(task.name) end
- 正则
/^(.*)\.json$/会捕获feed.json里的feed,存到$1变量里; lambda会动态生成依赖路径lib/feed.rb;- 任务块里的
task对象可以拿到目标文件(task.name)和依赖文件(task.source)。
方法二:用pathmap简化路径替换
如果只是简单的扩展名和路径替换,Rake的pathmap方法更简洁,不用写正则:
rule '.json' => ->(target) { target.name.pathmap("lib/%n.rb") } do |task| # 同样写你的生成逻辑 require_relative task.source generate_json(task.name) end
%n是pathmap的占位符,表示去掉扩展名的文件名,所以feed.json会被转换成lib/feed.rb;- 这种写法更直观,适合规则简单的场景。
怎么用?
当你执行rake feed.json时,Rake会自动检查:
- 是否存在
lib/feed.rb; lib/feed.rb的修改时间是否比feed.json新;
如果满足,就执行规则里的代码生成feed.json。
内容的提问来源于stack exchange,提问作者Molfar
相关产品推荐
相关产品推荐

