используя make build / свернуть измененные JS-файлы - PullRequest
0 голосов
/ 03 апреля 2012

Я работаю над использованием Makefile, чтобы помочь выполнить шаги сборки для моего JS в моем приложении. Цель состоит в том, чтобы использовать способность Make работать только с измененными файлами, чтобы предотвратить постороннее копирование и тому подобное.

Чтобы построить JS, вам нужно

  1. скопировать исходные файлы .js из основного каталога dev в каталог сборки
  2. сверните скопированный файл и создайте версию файла -min.js
  3. сгенерируйте meta.js, который содержит информацию о модулях YUI во встроенных файлах JS для комбинированного загрузчика.

Так что я работал над 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

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

Заставьте подстановочные знаки работать не так, как вы думаете. Давайте начнем с этого правила:

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

% подразумевает, что это правило шаблона, поэтому Make ожидает соответствующий % в списке предварительных требований. Вместо этого выглядит так, как будто вы пытаетесь использовать либо автоматическую переменную $* (которую нельзя использовать в списке предварительных требований), либо подстановочный знак * (который нельзя использовать без команды wildcard) , Попробуйте это так:

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

Это работает, но только если вы точно указываете, какие файлы вы хотите; он не копирует каждый файл .js в каталог dev (подробнее об этом позже).

Теперь для -min.js. Я не могу точно сказать, как работает это правило, но похоже, что вы запускаете скрипт python, который действует на все файлы * .js в каталоге одновременно. Если это правильно, то не имеет смысла иметь правило, которое делает foo-min.js из foo.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$

EDIT:
Я думаю, что вижу, что ты пытаешься сделать. Есть несколько способов сделать это; самое простое - объединить три правила в одно:

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 файлов в dev, которые новее meta.js (или всех из них, если meta.js еще не существует).

0 голосов
/ 03 апреля 2012

Ваши рецепты немного сложны для понимания, потому что ваши утилиты не являются фильтрами в стандартном Unix-стиле: они не воспринимают входные имена файлов в качестве аргументов или читают входные данные из stdin, а также не записывают выходные данные в stdout.

Я предполагаю (основываясь на all в имени файла), что ваши утилиты конвертируют все файлы в определенном каталоге.Это не то, с чем make может справиться изящно: оно действительно разработано для поддержки правил, которые создают отдельные выходные файлы (цели) из отдельных входных файлов (зависимостей).

Шаблонные правила просто позволяют указывать такиеправило для целой категории файлов одновременно, но они не определяют обработку коллекции файлов в рамках одного правила.Вы, кажется, пытаетесь сделать именно это.

Я постоянно сталкиваюсь с этим make ограничением.В качестве обходного пути вы можете использовать каталоги, в которых находятся файлы, в качестве целей и зависимостей ваших правил (если вы убедитесь, что там не будет создано никаких других файлов), или специальные файлы маркеров без содержимого, которое вы просто используете для отметки завершенияправила.Правильное решение потребует фундаментального расширения синтаксиса и семантики make правил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...