Bake – запускаем таски на bash
Думаю многим известна ситуация, когда собственный изобретенный велосипед нигде потом не используется. Поэтому я долго не решался опубликовать эту разработку, пока не обратил внимание, что таскаю его из проекта в проект. И так, одним из неотъемлемых элементов современной разработки являются так называемые таск раннеры — это Grunt/Gulp для nodejs, Rake для Ruby, Make для C/C++ и т.п. А для главного инструмента разработчика — консоли — ничего подобного нет. Точнее есть, но, как это обычно бывает, не совсем то. В результате изысканий, на свет появился инструмент Bake — таскраннер написанный на bash с поддержкой модульной структуры.
Основные особенности:
- Таски в виде функции.
- Поддержка аргументов
- Модули.
Назначение
Bake хорошо подходит для автоматизации рутинных действий, например запуск/перезапуск необходимых сервисов, очистка кеша, создание структуры директорий, выполнение команд по ssh/sftp (например для загрузки конфигурационных данных с установкой корректных прав доступа).
Инструмент крайне прост в использовании все что нужно — добавить функции-таски в bake.sh
и можно вызывать их из командной строки:
bake [OPTIONS] [TASK_ARGS]
Bake-файл
Таски хранятся в файле bake.sh
. Bake будет искать этот файл в текущей директории, если его нет, то в вышестоящей, вплоть до корня системы. Директория, в которой находится bake.sh
является корнем проекта и присваивается переменной $PWD
. Соответственно все таски выполняются относительно корня, а не текущей директории, которая хранится в переменной $CWD
.
Таски
Задания являются функциями, название которых начинающаяся с task:
. Пример:
task:greet() {
echo "Hello World"
}
Вызываем из консоли:
bake greet # -> Hello World
Внимание! Дефисы в имени таска заменяются на подчеркивания таск task:hello_world
может быть вызван командами bake hello-world
и bake hello_world
.
Аргументы
Аргументы следующие за названием таска передаются в функцию:
task:greet() {
echo "Hello $1"
}
bake greet World # -> Hello World
Модули
Bake позволяет разделять код на модули и подключать их по мере необходимости. Модули хранятся в директории bake_modules в виде скриптов, например ssh.sh
. Подключаются модули с помощью команды bake:module
. Пример:
bake:module ssh # include "bake_modules/ssh.sh"
bake:module mysql # include "bake_modules/mysql.sh"
Так же как и Node.js, Bake ищет модули по восходящему пути в директориях bake_modules
вплоть до корня системы. Например, если текущий путь проекта /home/user/projects/my-app
, то модуль будет последовательно искаться в директориях:
/home/user/projects/my-app/bake_modules
/home/user/projects/bake_modules
/home/user/bake_modules
/home/bake_modules
/bake_modules
Установка
- Deb-пакет для ubuntu:
wget https://github.com/rumkin/bake/releases/download/v0.12.5/bake_0.12-5.deb sudo dpkg -i bake_012-5.deb
- Установить из исходного кода на github:
git clone https://github.com/rumkin/bake sudo cp bake/bake.sh /usr/bin/bake
Ссылки
- Github
Комментарии (11)
14 марта 2017 в 23:24
0↑
↓
Хорошо бы поддержать еще ~/.bake/bake.sh и ~/bake/bake_modules.15 марта 2017 в 01:06
0↑
↓
Обязательно добавлю в ближайших версиях.
14 марта 2017 в 23:42
0↑
↓
Привели бы хоть пример, посложнее, чем хелловорлд. Я знаю, для чего мне make нужен, но не могу представить, зачем может понадобится bake.
15 марта 2017 в 01:43
0↑
↓
Спасибо за отклик. Bake нужен для автоматизации рутинных действий. В частности я использую в корневой папке проектов для быстрого скачивания проектов с гитхаба:
bake hub drakkar
Скачает с гитхаба мой репозиторий rumkin/drakkar.
А команда
bake init npt
скачает шаблон репозитория rumkin/npt и переинициализирует git.Так же при разработке я использую эталонную базу данных, к которой откатываюсь каждый раз, когда рабочая копия засоряется и делаю это одной командой. Так же конфигурация для продакшена сервера, как известно не должна храниться в репозитории, и в случае изменений, мне нужно быть уверенным, что все файлы конфигурации будут залиты без ошибок и для них будут установлены корректные права доступа.
15 марта 2017 в 03:48
0↑
↓
Эти задачи (как ниже уже написали) можно решить, через скрипты из $HOME/bin.
Свои алиасы под каждый проект, возможно, бывают полезны.
Своего рода $PWD я тоже использую, но для ее вычисления пока обходился более простыми средствами.
Есть такой вот пример, чтоб были очевидны преимущества bake?
14 марта 2017 в 23:46
0↑
↓
Ничего не понимаю ©
Таски имеют зависимости? Проверяется, построены ли они и не надо ли их перестроить? Если нет — то зачем это всё и при чём тут make/rake/… (которые вовсе не являются «таск раннерами», это системы сборки, первоочередная задача которых — проверка зависимостей)?
Если да — то почему нельзя просто пользоваться make? (Потенциально — меньше порождений процессов, но вряд ли вы упёрлись в производительность, раз можете себе позволить bash)15 марта 2017 в 00:44
+2↑
↓
Поддержу, я не понимаю практического смысла того, что вы указали.bash вполне поддерживает alias, и свой include (. / source), чтобы можно было сделать любые ваши таски в виде функций или алиасов.
Есть давно сложившийся, ну не стандарт, но обычай создавать $HOME/bin и кидать туда свои скрипты, остается только добавить их в PATH.
Чем принципиально bake важен/отличается?
15 марта 2017 в 01:37
+1↑
↓
alias и source добавляют код в глобальную область видимости, т.е. для каждого проекта не получится получить свою изолированную среду.
Обычно $HOME/bin по-умолчанию в $PATH добавляется, а все скрипты будут выполняться из текущей директории, а не из директории проекта. При этом Bake позволяет писать уникальный набор скриптов для конкретного проекта, а так же переиспользовать код в случае необходимости: например Bake поможет проверить все ли необходимые компоненты установлены в системе. При этом вы можете поместить bake.sh в репозиторий, а скрипты из $PATH/bin — нет.
15 марта 2017 в 03:09
+1↑
↓
Почему я не могу писать уникальный набор скриптов для конкретного проекта и деплоить его в $HOME/bin?Каким образом Bake проверяет все ли компоненты установлены? Это же просто набор bash скриптов, которые неважно откуда я запущу?
Другими словами, в статье написано как сделать helloworld на bake, но совершенно не описан что такое bake, и как он это делает. Хотя бы принцип. Все что вы написали мне — это элементарно реализуется на bash и не понятно, чем именно bake удобнее своего велосипеда.
15 марта 2017 в 05:34
0↑
↓
не понятно, чем именно bake удобнее своего велосипеда.
«bake» — это почти, как «bike». Но только «bake».
15 марта 2017 в 01:28
0↑
↓
Нет, bake — это именно таск раннер. Собственно rake так же используется как таск раннер, о чем написано в Википедии. По-моему, каждый из инструментов выполняет набор задач свойственных для языка, для которого он был разработан, т.е. для c/c++ — это сборка, для nodejs компиляция less/jsx/babel и деплой. Bake нужен для того чтобы автоматизировать рутину с помощью скриптов написанных на bash, например загрузку файлов по sftp или при создании бекапов данных во время разработки и т.п.