Строительство веб-приложений с замыкающими

Большинство веб-разработчиков использовать построить toolкакой-то в наше время.Я не ссылаюсь на непрерывной интеграции программного обеспечения, как Дженкинс CI1(очень популярная система сборки), но программное обеспечение нижнего уровня он использует, чтобы на самом деле приобретают зависимостей и построить ваши приложения с .

Существует головокружительные массив вариантов на выбор:

  • Apache Ant2(На основе XML)
  • Rake3(Руби-основе)
  • Grunt4(JS-основе)
  • Gulp5(JS-основе)
  • Broccoli6(JS-основе)
  • NPM7(JS-основе)
  • Старый добрый скрипты (хотя никакого реального оркестровка вокруг него)

Инструмент сборки я хочу посмотреть на более подробно здесь, хотя это дедушка их всех: Make8.

Первоначально разработанный в 1976 году, сделать это ведущий утилиту сборки для UNIX, Linux и Mac OS X. Скорее всего, большинство компьютеров, войдите, чтобы будет уже установлена ​​и доступны для использования.Это действительно уменьшает наладки точку входа (что для других инструментов, перечисленных выше, могут быть утомительно и чревато ошибками — за исключением скриптов, как оболочка нечто изначально доступны для всех систем) .

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

Я не мог надеяться охватить каждый аспект того, что сделать предложения, поэтому, пожалуйста, не ошибочно считают эту должность ничего даже отдаленно исчерпывающий.Целые книги были написаны на тему Марка и писать make-файлов, так что я оставлю это до вас, чтобы исследовать дальше за этот пост, если мне удалось разжечь интерес .

Позвольте мне начать с помощью ссылки на GNU website9для его определения, что сделать это, и делает:

GNU Make является инструментом, который управляет созданием исполняемых идругие не исходные файлы программы из исходного files

Сделать опирается на Makefileкоторый определяется и который состоит из набора инструкций для создания вашего программного обеспечения.Если вы использовали другой сборки системы, такие, как Grunt10, Вы заметите, что большинство из них используют соглашение об именовании, принятое от Марка (например Gruntfile) .

Дело о Makefile (в традиционном смысле), чтобы построить программу;хотя Сделать можно использовать для запуска какой-либо задачи, и поэтому не ограничивается компиляции программного обеспечения.Многое, как, как другие инструменты сборки JavaScript-основе не ограничивается построения приложений JavaScript, они могут обрабатывать большинство задач, которые вы хотите запустить (возможно составление CSS или оптимизации изображений) .

Вы найдете Убедитесь широко распространен и, скорее всего, уже на вашем компьютере.Например, я использую ноутбук Apple, с установленной Mac OS X.Если я выполните следующую команду:

make --version

Я вернусь следующий ответ:

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0

Что означает, что уже есть makeКоманда доступна, и я могу начать писать свой Makefile сразу .

Простой пример Link

Let’с рассмотрим стандартную требование проекта, который должен запустить СУБД ЛИНТЕР, таких как JSHint11над файлом JavaScript (то есть, анализировать код для форматирования проблемы и общие ошибки и предупреждения) .

Note: Как уже упоминалось ранее, традиционно Сделайте используется для компиляции файлов программы.В этом случае I’ве выбрали простой пример, который doesn’т требует компиляции, но вместо этого он должен продемонстрировать, как сделать это, на самом деле полезно для различных типов задач .

Представьте себе, у вас есть test.jsфайл и он содержит следующее содержание:

function foo() {
  bar = "baz"
}

Если бы мы были выполнить команду jshint test.js --show-non-errors(если у вас есть версия CLI из JSHint установлен), то мы должны увидеть что-то вроде следующего отображается:

test.js: line 2, col 14, Missing semicolon.

1 error

test.js :
	Implied globals:
		bar: 2
	Unused Variables:
		foo(1),

Итак, мы видим из этого вывода, что JSHint предупреждает нас, что у нас есть функция foothat’ы не используется и переменная, по-видимому, были объявлены в глобальном масштабе;но это также означает, что у нас есть ошибки в нашей программе: we’Re отсутствует точка с запятой из строки 2 в нашем файле JavaScript .

ОК так велико, как нам принять этот пример дальше и автоматизировать процесс анализа (который получит более сложным, как наше приложение увеличивается в размере и возможностей) с помощью утилиты Make

Во-первых, мы должны создать Makefile,Ниже содержимое Makefile I’м собирается использовать, чтобы продемонстрировать, как сделать работы (I’ LL объяснить структуру файла в следующем разделе):

lint
  jshint *.js --show-non-errors

Note: Make-файлов использовать вкладки, а непространства, так что если ваш редактор настроен на замену пространства с вкладками, то вы могли найти вещи don’Т работы в expected

Чтобы запустить файл сборки выше, мы должны были бы использовать makeКомандная оболочка.Это само по себе будет работать первую цель он находит (это также называют | умолчанию target__3), который в данном случае составляет lint,Вы также можете быть более четкими и указать точное цель вы хотите, чтобы выполнить путем предоставления имя цели на makeКоманда, например, так:

make lint

Выполнение команды выше то же самое, как работает:

jshint test.js --show-non-errors

You’буду также заметил, что мы использовали подстановки *указать несколько файлов JavaScript сразу .

В этом случае, используя Make означает it’легче запомнить конкретные команды для выполнения общих задач, таких как этот.Имея помнить, формат команды оболочки JSHint теперь не проблема, особенно учитывая, что I’м с использованием самых голые кости пример работает JSHint, а сама команда оболочки может стать гораздо больше и громоздким .

Makefile, также выступает в качестве документально файл, который в настоящее время может быть совершено в управление версиями, то есть у нас теперь есть запись о шаге компиляции.Оба эти точки становятся еще более важно, как составление / построить шаги становятся все более и более сложным, что они будут, как ваше приложение или программное обеспечение системы, естественно, растет и развивается .

Note: Если ваш Makefile находится в другом каталоге, вы можете пройти его расположение на makeКоманда с помощью -fФлаг так: make -f <makefile>

Конвенция для написания make-файлов, чтобы иметь команду по умолчанию (точка входа) в верхней части файла и сделать процесс есть команды сверху вниз.Вы don’т придется сделать это, хотя (как you’ увидите, I’ ве не очень беспокоюсь об этом с примерами на протяжении всего этого поста), и you’вновь свободным положить ваши правила в любом порядке имеет смысл для вас.Но имейте в виду, что при вызове команды Марка, you’будете хотеть, чтобы указать конкретную цель, если it’S не по умолчанию .

Терминология Link

Есть три ключевые фразы вы должны быть в курсе, когда речь идет о Makefile:

  • Rules
  • Targets
  • Prerequisites

Следующий фрагмент демонстрирует основную структуру Makefile:

target: prereq1 prereq2
    commands

Вы можете видеть, что мы имеем: одну цель (это то, что мы ссылаемся при выполнении команды make <target>);набор зависимостей (т.е. предпосылки);и команда для выполнения (например jshint test.js --show-non-errors).Вся эта структура совместно именуемые как “rule”и Makefile обычно состоит из нескольких правил .

Предпосылки Link

Предпосылки являются зависимости для цели;этоЦель не может быть успешно построена без зависимостей первый из которых доступны.В предыдущем примере Сасс компиляции, мы определили физический файл foo.scssв зависимости;потому что если файл не существует, то мы не могли скомпилировать его в файл CSS (хотя зависимость может быть другой “ target” изнутри Makefile, как мы вскоре увидим) .

Как Сделать решает, что делать Link

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

Сделайте использует модификации метки, чтобы избежать дублирования обработки.Если метка зависимых файлов старше результате производства, затем запустить Марка не делать ничего.Следовательно, вы можете заставить Марка перекомпилировать файл, просто с помощью touchКоманда на соответствующих файлов .

Note: Если вы хотите, чтобы посмотреть, что сделать будет выполнять без него на самом деле делать что-либо, затем запустить makeКоманда, как обычно, но убедитесь, что вы включать -nФлаг.Это приведет к Make, чтобы напечатать все команды, который будет выполнен, в том числе команд взяты из каких-либо предварительных условий, указанных .

Автоматические переменные Link

Let’с другой пример в котором мы хотим, чтобы составить Sass12стилей CSS в:

compile: foo.scss
    sass foo.scss foo.css

У нас есть небольшое дублирования здесь, ссылка на foo.scss,Мы можем очистить это немного с помощью некоторых специальных переменных, которые обеспечивает (также называемый автоматическим переменным).Специально для этой проблемы мы хотим решить, we’будете с помощью $<автоматическая переменная .

Когда compileЗапускается цель, то $<Переменная будет ссылаться на первый условием в списке, который позволит упростить пример и спасти вас от того, чтобы повторить себя.Следующий пример демонстрирует, как это выглядит:

compile: foo.scss
    sass $< foo.css

Это хорошо, потому что мы удалили жестко запрограммированный значение и сделал наш код немного более гибким.Но что произойдет, если у нас есть несколько зависимостей?

Предположим, у нас есть три файла foo.txt, bar.txtи baz.txt,Мы можем использовать комбинацию из $^переменная (которая дает нам все зависимости / предпосылки в виде списка) и маленький кусочек стандартного Баш shell13код (Сделайте команды, в конечном счете структурированы скрипты с дополнительной синтаксической сахара) в цикле за предоставленной зависимости список .

Следующий пример демонстрирует, как это может быть написано:

list: foo.txt bar.txt baz.txt
    for i in $^; do echo "Dependency: $$i"; done

Выполнение make listприведет к следующим ответ:

for i in foo.txt bar.txt baz.txt; do echo "Dependency: $i"; done
Dependency: foo.txt
Dependency: bar.txt
Dependency: baz.txt

Note: Из-за make-файлы имеют свои собственные специальный синтаксис, использование $будут конфликтовать при написании наш скрипт (который также имеет свой собственный специальный синтаксис около $).Это означает, что если мы хотим использовать доллар характер и не иметь его быть Makefile конкретные, то мы должны избежать его, используя еще один доллар.Таким образом, вместо того, чтобы писать $i- Который работает отлично в контексте нормального скрипт — мы должны были написать $$iвместо .

Мы увидим несколько различных автоматических переменных в течение этого поста, но в то же время проверить быстрый список ссылок ниже для некоторых из наиболее полезные из них:

  • $<: Сначала prerequisite
  • $^: Список prerequisites
  • $?: Список условий, которые changed
  • $@: Цель name
  • $*: Значение целевой placeholder

полная ссылка автоматического variables14доступна на GNU Make сайт .

Позже в этот пост we’буду вернуться к этому forПример цикла и продемонстрировать более идиоматических способ достижения результата мы хотим .

Команды Link

Стоит зная, что каждая команда при условии, внутри общей правило считается отдельным контекст оболочки.Это означает, что если вы экспортируете переменную окружения оболочки в одной команде, это won’т быть доступны в следующей команде.После того, как первая команда завершена, свежий оболочка породил для следующей команды, и так далее .

Вы также заметите, что при выполнении Сделать выведет __43 инструкции команда |beforeих выполнения.Это может быть отключена в одном из трех способов.Вы можете либо запустить сделать с -sФлаг, который заставит замолчать любого вывода;или вы можете использовать @Синтаксис перед самой команды, так:

list: foo.txt bar.txt baz.txt
    @for i in $^; do echo "Dependency: $$i"; done

Третий способ, чтобы заставить замолчать выход заключается в использовании .SILENCEФлаг.Следующий фрагмент показывает, как заставить замолчать три цели: foobarи baz:

.SILENT: foo bar baz

Note: Заставить замолчать выход, к сожалению, также означает, глушителей ошибки

!

Многое, как сценариев оболочки, если у вас есть команда, которая сложнее, чем то, что может посильно помещается на одной строке, а затем — ради удобства чтения, если иное — вы не должны будете написать это по нескольким линиям и избежать разрывов строкс помощью \характер, как показано в следующемпример демонстрирует:

list: foo.txt bar.txt baz.txt
    for i in $^; do \
        echo "Dependency: $$i"; \
    done

Цели в качестве предпосылок Link

Пока наши предпосылки были физические файлы, которые уже существуют.Но что, если вам нужно, чтобы динамически создавать файлы в первую очередь с помощью других целей?Сделать позволяет указать целевые показатели в зависимости, так что это не проблема.Давайте посмотрим, как это работает в следующем примере:

foo:
    @echo foo > foo-file.txt

bar:
    @echo bar > bar-file.txt

baz: foo bar
    @echo baz | cat - foo-file.txt bar-file.txt > baz-file.txt

Note: Сделайте, как правило, использует конвенцию именования целей после файлов, которые они создают.Это isn’т необходимость, но it’ы обычно считается хорошим practice

То, что мы три цели: foobarи baz,Первые два не имеют зависимостей собственных и все они делают это создать новый текстовый файл.Последние цель, baz, Определяет две другие цели, как его зависимостей.Поэтому, когда мы бежим make bazмы не должны видеть никакого вывода (как мы использовали специальный @ Синтаксис, чтобы заставить замолчать любого вывода), но мы должны найти мы следующие файлы, созданные:

  • Foo-file.txt
  • бар-file.txt
  • БАЗ-file.txt

Последний файл в списке должно содержать не только строки, который отображает 92 ~ |но также два других линий, содержащие содержимое других файлов.Так работает cat baz-file.txtдолжны напечатать:

baz
foo
bar

Note: Если вы не видели раньше и раньше, -в catКоманда говорю это, чтобы ожидать ввод со стандартного ввода (The echo команда записывает на стандартный вывод и, что поступает | более к cat команде в качестве стандартного ввода)

Доступ Targets Link

В приведенном выше примере, я был генерации файла на основе содержимого двух других целей (которые сами по себе динамически генерируемых некоторые файлы).Был небольшой немного повторения, которые могли бы были очищены, если мы использовали другой автоматическую переменную, предоставленную Марка, специально $@.

Оператор $@переменная ссылка на целевой имени, так что давайте посмотрим, как мы можем использовать это с нашего предыдущего примера:

foo:
    @echo $@ > "$@-file.txt"

bar:
    @echo $@ > "$@-file.txt"

baz: foo bar
    @echo $@ | cat - foo-file.txt bar-file.txt > "$@-file.txt"

В приведенном выше примере мы спасли себя от ввода foobarи bazнесколько раз, но мы не искоренить их полностью, как мы все еще должны ссылаться на fooи barв качестве предпосылок, а также ссылки на них изнутри bazСама команда .

По отношению к bazКоманда, мы могли бы использовать $^наряду с некоторыми сценариев оболочки для очистки, что так мы снова не полагаясь на абсолютным значениям.В следующем примере показано, как добиться того, чтобы:

foo:
    @echo $@ > "$@-file.txt"

bar:
    @echo $@ > "$@-file.txt"

baz: foo bar
    @files=$$(echo $^ | sed -E 's/([a-z]+)/\1-file.txt/g'); echo $@ | cat - $$files > "$@-file.txt"

О мальчик, хорошо.Так что, да, мы удалили несколько более жестко закодированные значения, но если вы не уверены в высшей сценариев оболочки, то я предполагаю, что выше рефакторинг won’т смысла для вас.Ноlet’с разбить его немного, поэтому мы можем видеть то, что мы имеем:

  • Мы используем $^чтобы получить список зависимостей;В этом случае, foo bar.
  • Мы труб, что на протяжении до sedКоманда.Мы также использовать расширенные регулярные выражения двигателя -Eчтобы сделать наш шаблон регулярного выражения легче понять .
  • Оператор sedкоманда заменяет foo barс foo-file.txt bar-file.txt.
  • Мы делаем, что замена в подпроцесс $(), Который является специальный синтаксис оболочки.Это означает, что мы должны бежать знак доллара в Makefile ($$()) .
  • Значения, возвращаемые из подпроцесса (foo-file.txt bar-file.txt), которые затем сохраняются в переменной под названием filesи мы ссылаться на эту переменную вместо оригинальных абсолютным значениям .

На вершине все, что мы stillесть дублирование: The fooи barссылка в области предпосылок.Это имеет не быть жестко, если we’Re собирается использовать косметику или другие формы сценариев оболочки динамически генерировать собственно сам Makefile;которые даже для меня это шаг слишком далеко в этом случае .

Итак, что же это в конечном итоге говорят нам?Это простота является ключом .

Поэтому я пошел на все эти неприятности это позволило мне продемонстрировать первых, как на самом деле то, что делает растянуть может сделать для вас, если у вас достаточно знаний оболочки сценариев;во-вторых, позвольте мне продемонстрировать теперь, как вы можете использовать более идиоматических Марка упростить код и избежать overengineering как и в предыдущем примере:

baz: foo-file.txt bar-file.txt
  echo $@ | cat - $^ > $@-file.txt

%-file.txt:
  echo $* > $@

В этом реструктурировать версии мы определяем цель под названием bazи мы его зависимости, чтобы быть два файла, которые don’т существует.Мы также don’т есть какие-либо определенные цели в нашей Makefile либо .

Чтобы решить эту проблему, мы используем виртуальный правило, тот, который использует Make’S %заполнитель синтаксис шаблона матче против.We’будете видеть %Синтаксис более подробно в ближайшее время, но сейчас это будет достаточно, чтобы знать, что он действует как шаблона .

Когда мы запускаем make baz, Сделайте постараемся решить две зависимости.Следующее правило %-file.txtЗатем будет соответствовать и foo-file.txtи bar-file.txtи поэтому команда echo $* > $@будет выполняться два раза .

Команда принимает динамический часть правила (foo 91 ~ и | части) и делает …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.