2012-04-02 68 views
0

我正在使用Makefile來幫助爲我的應用程序中的JS執行構建步驟。目標是使用Make的能力只處理修改後的文件以防止無關複製等。使用make build /最小化已更改的JS文件

要構建JS你需要

  1. 副本從主dev目錄下原來的.js文件到一個build目錄
  2. 最小化複製的文件,並創建該文件的版本-min.js
  3. 生成一個meta.js,其中包含組合加載器的內置JS文件中的YUI模塊信息。

所以我一直在努力向後工作的Makefile。 meta.js取決於-min.js取決於$builddir/b/*.js這是從%origdir/*.js

複製在貫穿東西看,似乎我應該能夠使用%的.js爲了捕捉任何匹配的文件,但是當我嘗試這我得到:

make: *** No rule to make target `bookie/static/js/build/b/%-min.js', needed by `bookie/static/js/build/b/meta.js'. Stop. 

這就是我正在與誰一起工作,任何人都知道我做錯了什麼?我希望當我make js它複製改變後的.js文件,縮小它們,然後重新生成meta.js.

# Makefile to help automate tasks in bookie 
WD := $(shell pwd) 
PY := bin/python 
BOOKIE_JS = bookie/static/js/bookie 
JS_BUILD_PATH = bookie/static/js/build 
JS_META_SCRIPT = $(PY) scripts/js/generate_meta.py 

EXTENSION = $(WD)/extensions 
CHROME_BUILD = $(EXTENSION)/chrome_ext/lib 


# JAVASCRIPT 
# 
# Javascript tools for building out combo loader build directory, out meta.js, 
# and syncing things over to the chrome extension directory. 

.PHONY: js 
js: $(JS_BUILD_PATH)/b/meta.js 

$(JS_BUILD_PATH)/b/meta.js: $(JS_BUILD_PATH)/b/%-min.js 
    echo "META" 
    $(JS_META_SCRIPT) -n YUI_MODULES -s $(JS_BUILD_PATH)/b/ \ 
     -o $(JS_BUILD_PATH)/b/meta.js \ 
     -x -min.js$ 

$(JS_BUILD_PATH)/b/%-min.js: $(JS_BUILD_PATH)/b/$*.js 
    echo "MIN" 
    rm $(JS_BUILD_PATH)/b/meta.js || true 
    scripts/js/jsmin_all.py $(JS_BUILD_PATH)/b 

$(JS_BUILD_PATH)/b/%.js: $(BOOKIE_JS)/$*.js 
    echo "Initial" 
    cp $? $(JS_BUILD_PATH)/b/ 
    cp $? $(CHROME_BUILD)/ 

.PHONY: clean_js 
clean_js: 
    rm -rf $(JS_BUILD_PATH)/* || true 
+0

'$ *'只能在食譜中使用,不在依賴關係中,請使用'%' – reinierpost 2012-04-03 08:44:49

+0

'-min.js $'中的'$'做什麼? – reinierpost 2012-04-03 08:46:52

+0

對不起,我認爲$是剩餘的exeriments只匹配-min文件,因爲-main和non-min文件都在該build目錄中。 – Rick 2012-04-03 10:56:22

回答

0

使通配符不按您的想法工作。讓我們先從這個規則:

$(JS_BUILD_PATH)/b/%.js: $(BOOKIE_JS)/$*.js 
    echo "Initial" 
    cp $? $(JS_BUILD_PATH)/b/ 
    cp $? $(CHROME_BUILD)/ 

%意味着它是一個模式的規則,因此,請在預計的先決條件列表中的相應%。相反,它看起來好像試圖使用自動變量$*(不能在前提條件列表中使用)或通配符*(如果沒有wildcard命令,則不能使用該變量)。試試這個方法:

$(JS_BUILD_PATH)/b/%.js: $(BOOKIE_JS)/%.js 
    echo "Initial" 
    cp $? $(JS_BUILD_PATH)/b/ 
    cp $? $(CHROME_BUILD)/ 

這是有效的,但只有當你明確地指定了你想要的文件時,它不會複製dev目錄中的每個.js文件(稍後會詳細介紹)。

現在爲-min.js。我無法確切知道這個規則是如何工作的,但是看起來好像你運行了一個python腳本,該腳本一次作用於目錄中的所有* .js文件。如果這是正確的,那麼有一條規則使得foo-min.jsfoo.js沒有意義;應該有運行腳本的規則,我們需要所有的.js文件的列表,它需要:

DEV_JS_FILES := $(wildcard $(BOOKIE_JS)/*.js) 
BUILD_JS_FILES := $(patsubst $(BOOKIE_JS)/%.js,$(JS_BUILD_PATH)/b/%.js,$(DEV_JS_FILES)) 

.PHONY: min 
min: $(BUILD_JS_FILES) 
    echo "MIN" 
    rm $(JS_BUILD_PATH)/b/meta.js || true 
    scripts/js/jsmin_all.py $(JS_BUILD_PATH)/b 

最後,meta.js

$(JS_BUILD_PATH)/b/meta.js: min 
     echo "META" 
     $(JS_META_SCRIPT) -n YUI_MODULES -s $(JS_BUILD_PATH)/b/ \ 
     -o $(JS_BUILD_PATH)/b/meta.js \ 
     -x -min.js$ 

編輯:
我想我明白你想要做什麼。有幾種方法可以做到這一點;最簡單的只是三個規則組合成一個:

DEV_JS_FILES := $(wildcard $(BOOKIE_JS)/*.js) 

$(JS_BUILD_PATH)/b/meta.js: $(DEV_JS_FILES) 
    echo "Initial" 
    cp $? $(JS_BUILD_PATH)/b/ 
    cp $? $(CHROME_BUILD)/ 
    echo "MIN" 
    rm $(JS_BUILD_PATH)/b/meta.js || true 
    scripts/js/jsmin_all.py $(JS_BUILD_PATH)/b 
    rm $(addprefix $(JS_BUILD_PATH)/b/,$?) 
    echo "META" 
    $(JS_META_SCRIPT) -n YUI_MODULES -s $(JS_BUILD_PATH)/b/ \ 
    -o $(JS_BUILD_PATH)/b/meta.js \ 
    -x -min.js 
    rm $(JS_BUILD_PATH)/b/*-min.js 

這將在.js文件在開發中出現不到meta.js(或全部,如果meta.js尚不存在)只能採取行動。

+0

謝謝你會試試這個。你是正確的,因爲minify腳本正在處理整個目錄。我們的目標是讓它只能在上次Make運行後更改/更新的文件上工作,因爲我一直無法正確執行步驟和規則,所以我批量使用了整個目錄。對不起,在發佈之前不要恢復該更改。 – Rick 2012-04-03 11:00:17

0

你的食譜都有點難以理解,因爲你的事業是不是在標準的Unix風格的濾鏡:它們不會出現把輸入文件名作爲參數或讀取輸入從標準輸入,而不會出現將輸出寫入標準輸出。

我的猜測是(根據文件名中的all),您的實用程序將全部文件轉換爲特定目錄。這不是make可以正常處理的東西:它的設計確實是支持從單個輸入文件(依賴項)生成單個輸出文件(目標)的規則。

模式規則只是讓您一次爲整個類別的文件指定一個規則,但它們並未指定處理單個規則中的文件集合。你似乎正在努力做到這一點。

我一直遇到這個make限制。作爲一種解決方法,您可以使用文件所在的目錄作爲規則的目標和依賴關係(如果您確定不會在其中創建其他文件),也可以使用不包含僅用於標記完成的內容的特殊標記文件的規則。一個適當的解決方案需要對規則的語法和語義進行基本擴展。

+0

謝謝,這是我開始思考的一種。我知道我正試圖在製作鞋子的過程中邁入爲建立我的js文件而需要的步驟。我希望能夠使用Make的功能來處理自上次make運行後發生更改的文件,以防止複製/縮小未更改的文件。 – Rick 2012-04-03 10:58:26

+0

您可以:使用模式規則轉換單個文件,並使用包含'for'循環的配方將單獨的規則轉換。在後一條規則中表達依賴關係就是問題所在。另一種方法是使用GNU make函數,如'$(patsubst ...)'從磁盤上的源文件列表中構建一個目標列表(請參閱http://stackoverflow.com/questions/4971865/patsubst- on-makefile),但這也很尷尬。 – reinierpost 2012-04-03 11:45:54