2013-04-20 153 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