2013-07-29 18 views
2

(聲明:我是一個UX設計師,這是我的第一個「自造」的makefile)用玉 - 需要一個makefile命令編譯源玉公共目錄,並保持源目錄結構

我想添加到我的makefile一行,以獲取我的src/jade目錄的內容,並在public /中輸出爲html。我的makefile位於包含src和public兩個項目目錄的目錄中。所以,我想的是:

src/jade 
    |--Enterprise/index.jade 
    |--SmallBusines/index.jade 
    |--Public Sector/index.jade 

並獲得

public 
    |--Enterprise/index.jade 
    |--SmallBusines/index.jade 
    |--Public Sector/index.jade 

我無法弄清楚是怎麼把它抓取子目錄中的src /玉。這是我有:

jade -P -p . -o public src/jade/ 

這隻需要在src /玉的東西,但沒有subdirs。我已經嘗試過Google並進行了相當多的搜索,但沒有任何結果。

編輯: 這是我實際的makefile

all: 
    mkdir -p public 
    make jade 
    make coffee 
    make less 
    make statics 

jade: 
    jade -P -p . -o public src/jade/ 

coffee: 
    coffee --compile --output public/js src/coffee 

less: 
    lessc --strict-imports src/less/styles.less public/css/styles.css 

statics: 
    cp -a src/less/img public/css/ 
    cp -a src/font public/ 
    cp -a src/coffee/bootstrap.min.js public/js/ 

clean: 
    rm -rf public 

而且 - 一旦我搞清楚,我需要排除目錄也因爲在src /玉會之類的東西/包括和/塊被進口進入網站的實際「頁面」,而不是頁面本身。

我已經完成了玉 - 幫助,並沒有任何關於子目錄和排除,以及人造。有沒有其他的地方可以看,或有人跑過來呢?

回答

1

我不知道什麼玉,但如果它需要一個.jade文件並生成一個文件.html,那麼你可能想是這樣的:

JADE := jade 
JADEFLAGS := -P -p . 
SRCDIR := src/jade 
HTMLDIR := public 

JADEFILES := $(shell find $(SRCDIR) -type f -name \*.jade) 
HTMLFILES := $(patsubst $(SRCDIR)/%,$(HTMLDIR)/%,$(JADEFILES)) 

.PHONY: all 
all: $(HTMLFILES) 

$(HTMLDIR)/%.html : $(SRCDIR)/%.jade 
     $(JADE) $(JADEFLAGS) -o $(HTMLDIR) $< 

如果你這樣做,你的方式之前這樣做,那麼無論更改了什麼,每次運行make時都會創建所有輸出文件。如果這就是你想要做的,那麼使用make就是無用的複雜功能。 Make用於避免不必要的重建,這取決於文件何時更改;如果您希望每次運行命令時都重建所有內容,只需編寫一個shell腳本,而不是makefile。

ETA:

如果你真的只是想最簡單的版本,試試這個(再次,我從來沒有用過的玉,所以我不知道它是如何工作的,但如果它需要的玉文件這樣的列表應工作):

# Use the UNIX find(1) command to locate all the jade files under src/jade 
jade: 
     jade -P -p . -o public `find src/jade -name \*.jade` 

ETA:

看來你的例子輸出是錯誤的:它表明玉會產生這樣foo.jade文件,但這不是正確的:玉似乎產生像foo.html文件。如果玉不保持目錄結構本身,那麼你需要更接近我原來的建議。我會盡力把它簡化一下:

SRCDIR := src/jade 
HTMLDIR := public 

# Find all the .jade files, using UNIX find(1) 
JADEFILES := $(shell find $(SRCDIR) -type f -name \*.jade) 

# Convert all the .jade files to .html in the output directory 
HTMLFILES := $(patsubst $(SRCDIR)/%.jade,$(HTMLDIR)/%.html,$(JADEFILES)) 

# A target that depends on all the .html files we will generate 
.PHONY: jade 
jade: $(HTMLFILES) 

# A pattern rule that shows how to build a single .jade file 
# into a single .html file 
$(HTMLDIR)/%.html : $(SRCDIR)/%.jade 
     jade -P -p . -o $(@D) $< 

要了解你應該閱讀GNU就「自動變量」手冊中的模式規則,但基本上$<站在第一個先決條件(在.jade文件在這種情況下)和[email protected]是目標文件(。在這種情況下的html文件)。變量$(@D)是目標文件的目錄。

+0

我現在有的makefile文件添加到原始問題中。它的設置使我可以一次編譯一種類型的東西。 老實說,我甚至不知道我知道如何閱讀答案。也許我應該在這裏親自找人解釋一下?我可以嘗試替換變量並運行它,看看會發生什麼。 – helloerik

+0

把它變成一個makefile似乎還不是很有用。使用參數並運行命令的shell腳本會更容易(假設您知道如何編寫shell腳本),並且不需要您學習如何使用make。在這裏,你實際上並沒有使用make的任何優點。不過,我會編輯我的答案更簡單。 – MadScientist

+0

新的命令確實有效,它只是不維護目錄。它找到所有的玉文件,並將它們輸出給公衆。也許玉沒有這樣做,因爲我實際上不能運行排除嵌套文件的編譯。作爲一個網頁模板引擎,你認爲它會。哦,我沒有使用shell腳本或任何腳本的經驗。我通常使用Codekit來構建所有的東西,這是一個所有/更少/咖啡等的圖形用戶界面(也可以僅供參考,我無法支持任何人或我)。 – helloerik

1

由於我在很多項目中使用Jade和Node,我做了一個簡單的(儘管不那麼聰明)的腳本來抓取jade文件夾並將結構輸出到目標文件夾。由於我在幾個項目中使用了這個,所以我通過CLI輸入源文件夾和目標文件夾。該CoffeeScript的代碼如下:

fs = require 'fs' 
path = require 'path' 
exec = require('child_process').exec 

# Get base from cli 
jadePath = process.argv[2] 
base = process.argv[3] 

_build = (dir) -> 
    files = fs.readdirSync dir 
    for f in files 

    if f == path.basename __filename 
     continue 

    fullPath = path.join(dir, f) 
    stat = fs.statSync fullPath 

    if stat.isDirectory() 
     try 
     fs.mkdirSync path.join(base, fullPath) 
     _build fullPath 
    else if path.extname(f) == '.jade' 
     # Compile jade 
     dirName = path.join base, (path.dirname fullPath) 
     dirName = dirName.replace jadePath, '' 
     dirName = dirName.replace '//', '/' 
     console.log "Compiling jade file '#{fullPath}' to directory #{dirName}" 
     exec('jade -o ' + dirName + ' ' + fullPath) 

# Start process with path from cli 
_build jadePath 

作爲一個方面說明,一個通常建/在packages.json直接使用NPM,通過scripts會話我的自動化項目。例如:

"scripts": { 
    "build:js": "coffee -cb -o www/js/ www/_src/coffee/", 
    "build:html": "coffee run_jade.coffee www/_src/jade/ www/templates/", 
    "build:css": "sass www/_src/sass/style.scss www/css/style.css", 
    "build": "npm run build:js && npm run build:html && npm run build:css", 
    "watch": "watch 'npm run build' www/_src/", 
    "test": "karma start test/karma.conf.coffee" 
    } 

,然後如果我要建立我的HTML,我可以簡單地npm run build:html。希望這有助於:)

相關問題