2013-04-20 65 views
2

我使用Rake从Markdown文件生成PDF。如果Markdown文件是filename.md,我喜欢PDF为filename.md.pdf而不是filename.pdf,以便自动完成按我喜欢的方式工作,以便清楚PDF文件的来源是什么。Rake无法识别具有多个扩展名的规则

我有这个Rake文件,它工作正常。

MDFILES = FileList["*.md"] 
PDFS = MDFILES.ext("pdf") 

desc "Build PDFs of all chapters" 
task :pdfs => PDFS 

# Build PDFs from Markdown source 
rule ".pdf" => ".md" do |t| 
    sh "pandoC#{t.source} -o #{t.name}" 
end 

如果我运行rake pdfsrake filename.pdf的PDF文件生成如预期,但PDF文件被命名为filename.pdf

但我想的Rake文件是这个:

MDFILES = FileList["*.md"] 
PDFS = MDFILES.ext("md.pdf") 

desc "Build PDFs of all chapters" 
task :pdfs => PDFS 

# Build PDFs from Markdown source 
rule "md.pdf" => ".md" do |t| 
    sh "pandoC#{t.source} -o #{t.name}" 
end 

运行rake pdfsrake filename.md.pdf返回错误Don't know how to build task 'filename.md.pdf'

如何以我想要的方式生成文件名?

顺便说一句,这种类型的规则的正常工作与制作,即:

%.md.pdf : %.md 
     pandoc $< -o [email protected] 

回答

3

我也曾有过类似的问题,我最近当我试图指定与规则中的多个点的延伸。

rule(/\.md\.pdf$/ => [ 
    proc {|task_name| task_name.sub(/\.md\.pdf$/, '.md') } 
]) do |t| 
    sh "pandoC#{t.source} -o #{t.name}" 
end 
+0

这真是棒极了:我通过使用不同的规则语法描述here.

尝试这样的事情为您的规则解决它。感谢您指出可选的规则语法。它当然更强大,但比Make更丑陋。 – 2013-05-11 17:05:31