Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby
Code

Рейк 101

by
Length:LongLanguages:
This post is part of a series called All About Rake.
Rake 201

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

В этой статье объясняются основы Rake. Это супер популярный инструмент сборки, написанный на Ruby. Он предлагает большую гибкость и используется для управления всеми видами задач. Если вы используете Rails, я рекомендую взглянуть под капотом, чтобы узнать, какие задачи имеются в вашем распоряжении, и как писать свои собственные.

Темы

  • Что такое Rake?
  • Список заданий
  • Начинаем работу
  • Пространства имен
  • Предпосылки
  • Передача аргументов
  • Задачи, представляющие интерес

Что такое Rake?

Благодаря Rails, Rake стал стандартом де-факто как инструмент для сборки Ruby приложений. Он очень популярен в сообществе Ruby. Очень рано команда Rails решила использовать Rake в качестве сборщика для Rails, что означало, что в прошлом, когда вы загружали Rails, вам также нужна была копия Rake. Таким образом Rake был представлен сразу куче людей. Чуть позже он был включен в Ruby (1.9).

Rake де-факто заменил Unix-утилиту Make как инструмент сборки на территории Ruby. Инструмент построения, такой как Rake, удобен для автоматизации различных задач - программного обеспечения. Он часто используется для задач администрирования в Rails - вот где вы, скорее всего, уже успели столкнуться с ним, но однако вариантов его использования достаточно много. Некоторые люди пишут свои книги в Markdown и настраивают задачи Rake, которые преобразуют соответствующие файлы в промежуточные HTML-файлы, которые затем, в свою очередь, преобразуются в форматы электронных книг. Но остается еще много проблем, чтобы использовать Rake для этого.

Что делает Rake очень сильным, так это то, что эти задачи могут быть связаны друг с другом и могут быть построены друг на друге. Кроме того, поскольку он написан в Ruby, вы можете написать любой код Ruby для своих задач. Хотите использовать библиотеки Ruby в своих задачах Rake? Нет проблем! Интересный факт: это самый загруженный RubyGem с более чем 100 миллионами загрузок. Так что это определенно то, что должно быть в вашем наборе для инструментов, и на что вы должны обратить больше внимания.

Он был придуман покойным Джимом Вейрихом, известным и любимым разработчиком, докладчиком и вкладчиком в экосистему Ruby. Это прекрасный инструмент, действительно, спасибо, Джим! ПОКОЙСЯ С МИРОМ!

Список заданий

Давайте рассмотрим некоторые задачи, которые Rails предлагает прямо из коробки. Бьюсь об заклад, вы немного удивлены тем, что вам доступно. В соответствующем каталоге вашего приложения или вашего Rakefile вы можете перечислить их, введя в оболочку следующее:

Вывод:

Вывод в приложении Rails на удивление многочисленный, не так ли? Вы можете найти гораздо более удобные задачи, чем обычные rake db:migrate или rake routes, с которыми мы так хорошо знакомы и выполняем по несколько раз на ежедневной основе.

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

Shell:

Вывод:

Удивительно, почти в три раза больше! Взгляните на них и поиграйте с ними, если хотите, но зафиксируйте основные моменты в памяти для последующего использования в будущем. Проверка задач, чтобы увидеть, какие вам доступны, может в будушем помешать вам повторно изобретать колесо.

Начинаем работу

Rakefile может иметь один из следующих пяти вариантов:

  • rakefile.rb
  • rakefile
  • Rakefile
  • Rakefile.rb
  • .rake файлы

В основном вы увидите простую версию Rakefile, но для такой структуры, как Rails, требуется более сложная организация. Используйте то, что вам больше по душе. Вы начинаете с создания Rakefile или файлов с расширением .rake, если вы хотите логически разбивать задачи на несколько файлов. Затем определите свои задачи внутри любого из них.

Организация пользовательских Rakefile

Rails делает это невероятно простым. Он содержит Rakefile в корне вашего приложения. В котором находится следующее:

Rakefile

Когда у вас много пользовательских задач, имеет смысл разделить их на дискретные файлы .rake и поместить их в каталог lib/tasks. Rakefile выше просто загружает их, но каталог lib является лучшим логическим местом для задач. Существует даже генератор Rails для автоматизации части процесса. Если вы наберете:

Shell

Вы получите Rakefile, который будет автоматически помещен в нужный каталог. Даже задание уже будет настроено для вас. Прелестно! В других проектах, не использующих Rails, вам просто нужно создать каталог rakelib и поместить туда Rakefiles - желательно с расширениями .rake. Затем создайте файл под названием Rakefile, и все эти файлы уже в вашем распоряжении.

Анатомия заданий Rake

lib/tasks/some_task.rake

Для всех новичков Ruby среди вас, а также для людей, живущих на тяжелых языках, так оно и будет выглядеть в круглых скобках.

Выглядит кстати очень странно. Просто уберите лишние круглые скобки - никто не пишет задачи таким образом.

Мы представили именованную задачу :about с описанием, которое не только напоминает нам в будущем то, что мы хотели достичь с определенными задачами, но также появляется, когда мы запускаем rake -T. Не ленитесь на эту часть, оно того стоит.

Ниже приведена задача ключевого слова, определяющая новую задачу с именем about. Это может быть вызвано в командной строке с помощью rake about, затем происходит магия. rake :about, с другой стороны, заставит Rake отменить задачу, не зная «как построить задачу: about».

В блоке do end у нас есть lambda, и ее тело определяет, что делает задача. Это базовая настройка, в которой потребуется задача. Конечно, это предлагает гораздо больше возможностей, но общая структура такая же.

require/import

Некий Rakefile

Если вам нужно включить другие файлы Ruby или Rakefiles, это может быть легко достигнуто стандартным require.

Некий Rakefile

Сам Rake предоставляет нам другой способ сделать это - метод import. Его можно использовать в любой строке Rakefile. Это поможет, когда вы столкнетесь с проблемой, когда необходимый файл был загружен до того, как Rakefile закончил загрузку. С другой стороны импортируемый файл всегда будет загружаться после Rakefile.

invoke & execute

Иногда вам может потребоваться выполнить определенную задачу из класса Task вручную. Для этого у вас есть два метода класса Rake::Task: execute и invoke.

С кодом Rake::Task['some_task'] мы выполнили задачу some_task Rake. Он возвращает экземпляр класса Rake::Task и затем запускает любой доступный ему метод.

Пространства имен

Очень крутой особенностью является способность разбивать ваши задачи по пространствам имен . Вероятно, вы уже давно это использовали. Когда вы запускаете rake db: migrate, вы использовали, например, пространство имен db. Вы вызываете задачу, разделив ее на двоеточие : из пространства имен. Пространства имен - это удобный способ организовать ваши задачи внутри файла Rake - он логически разделяет их. Множественные пространства имен, такие как rake time:zones:all тоже между прочим имеют место быть.

Другие примеры включают:

Некий Rakefile

Это базовая настройка. На самом деле это намного сложнее и может быть многократно вложенным. Быстро загляните в кодовую базу Rails и убедитесь сами, как реализован rake db:migrate. Не переживайте если там совсем ничего не понятно. Просто осмотритесь, попытайтесь понять, как он структурирован, и двигайтесь дальше.

Предпосылки

Другая стратегия для организации ваших задач и сохранения их согласно принципу DRY использует предварительные условия для выполнения задачи. Это похоже на зависимость, которая должна запускаться сначала до того, как фактическая задача начнет свою работу. Таким образом, вы можете создавать более сложные задачи - настолько сложные, насколько вам нужно. Но я бы порекомендовал не слишком умничать и держать свои задачи как можно проще - и так же легко понятными, насколько это вообще возможно.

Некий Rakefile

Если вы хотите полагаться на несколько задач, вы просто привязываете их к массиву. Конечно, порядок, в котором вы их распологаете, имеет значение.

Если вы выполняете задачу Rake, которая зависит от другой, мы получим следующий результат:

Shell

Порядок, в котором вы определяете свои Rake-задачи, не влияет на вывод - только порядок, в котором вы ставите необходимые задачи в массиве для зависимостей задачи. Кроме того, для этого используйте hashrocket синтаксис =>.

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

В контексте предпосылок следует иметь в виду, что вам нужно только указать пространство имен, если вы находитесь за пределами соответствующего.

Некий Rakefile

Важно отметить, что: если вам нужно указать пространство имен, вам необходимо передать необходимое условие в виде строки => 'marsellus_wallace: call_winston_wolf'.

Конечно, приведенные выше примеры - глупые, а не реальные примеры, но цель заключалась в том, чтобы показать вам, как работают предпосылки, и как вы можете объединить их, пока они зависят друг от друга.

Передача аргументов

У вас есть два варианта передачи аргументов для задач Rake: либо с использованием переменных Bash, либо с использованием самого синтаксиса Rake.

Переменная ENV

Если вы не играли с Bash раньше - или Bash звучит для вас как gobbledegook  - давайте возьмем и начнем с самого начала. Bash в вашей оболочке предлагает два вида переменных: глобальные (aka environment) переменные и локальные. Оба записываются в верхнем регистре. Переменные окружения являются глобальными, что означает, что они доступны во всех оболочках и не исчезают, когда вы закрываете Bash, в отличие от локальных переменных, которые доступны только в текущей оболочке.

Переменные среды могут содержать данные, которые могут использоваться несколькими приложениями и часто используются в качестве удобного способа совместного использования параметров конфигурации. В отличие от этого, локальные переменные Bash - это просто локальные переменные. В нашем контексте использования Rake у вас есть возможность получить доступ как через Ruby, так и через командную строку.

FYI

Так же, если вы наберете env или ENV в своей оболочке, вы получите доступ к целой группе переменных окружения. Я отредактировал список, но для лучшего понимания того, какие переменные среды доступны и что они в себя включают, я призываю вас запустить это и у себя.

Shell

Вывод

Если вы хотите увидеть список локальных переменных Bash, вы можете выполнить set.

Shell

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

Метод класса Ruby ENV

Ruby предлагает способ использования среды и локальных переменных Bash подобно хеш-подобному аксессуру. Для наших нужд, когда мы передаем переменную в задачу Rake, она будет локальной переменной Bash, которую вы можете найти в списке переменных, выполнив set. Ruby может прочитать ее с помощью ENV['VARIABLE'].

Shell

Однако я хочу пояснить, что эта переменная не будет добавлена в список ENV, который использует ваша система, - то, что вы видели при вызове env из оболочки. Чтобы добавить ее в этот список, вам нужно будет сделать export. Это уже совсем другая история, но я подумал, что должен прояснить этот момент.

Некий Rakefile

В этом определении задачи вы можете увидеть, как мы готовы принять или включить переменную, переданную в вызов задачи. Ruby ENV[BASHVARIABLE] сделает за нас всю необходимую работу. Если BOOKTITLE была глобальной переменной окружения, мы могли бы получить доступ к ней внутри этого определения задачи, а также с этим синтаксисом.

Синтаксис параметров Rake

Второй подход - использование чистого синтаксиса Rake. Вы просто передаете переменные в квадратные скобки. Этот подход лучше, и вы можете сохранять вещи более изолированными. Зачем подключать Bash, если Rake отлично справляется с этим? Кроме того, у вас нет переменных Bash, плавающих вокруг этого пути. Если вы хотите передать несколько аргументов в задачу, это будет намного более элегантно.

Shell

Некий Rakefile

Когда вы передаете больше аргументов, чем вы определили в своей задаче, вы можете просто получить к ним доступ через args. args.extras отображает массив всех дополнительных параметров. args.to_a также показывает вам все параметры - в массиве.

Задачи, представляющие интерес

Ниже приведен краткий список задач Rake, связанных с Rails:

  • db
  • doc
  • tmp
  • stats
  • notes
  • about
  • secret
  • assets
  • routes

db

Ниже приведены несколько полезных задач в пространстве имен db для запуска миграции Active Record:

rake db:version печатает текущую версию схемы. Результат выглядит примерно так:

rake db:migrate запускает последнюю миграцию (-и), которые еще не запущены. Вы также можете передать ему конкретную миграцию для запуска.

Shell

rake db:create создает вашу базу данных. Если по умолчанию установлены базы данных разработки и тестирования.

rake db:test:prepare проверяет, что миграции, которые уже запущены в вашей базе данных разработки, также запускаются для вашей тестовой базы данных. Если схема тестовой базы данных не синхронизирована с вашей базой данных разработки, это, конечно, не очень полезная задача.

rake db:drop:all по умолчанию дропает как тестовые, так и базы данных разработки.

rake db:migrate:up, rake db:migrate:down запускает методы up и down для рассматриваемой миграции.

rake db:redo гарантирует, что после выполнения миграции миграция будет обратимой. Он запускает сначала rake db:down, а затем rake db:up.

rake db:rollback отменяет последнюю миграцию.

rake db:drop по умолчанию дропает базу разработки и тестовую.

rake db:reset сначала сбрасывает базы данных и снова устанавливает их, загружая схему и наполняя базу данных.

doc

rake doc:app создает документацию в каталоге doc/app. Он создает HTML-страницы о вашем исходном коде для удобного просмотра. Довольно круто!

Скриншот

A screenshot of the mission controller

rake doc:rails создает документацию API в каталоге doc/api - также как HTML-страницы. Удобно, если вы работаете в автономном режиме.

tmp

Каталог tmp в корневом каталоге вашего приложения Rails - это место для временных файлов - наиболее заметных файлов для сеансов и кеша. rake tmp:create устанавливает все, что вам нужно для работы с временными файлами. rake tmp:cache: clear очищает каталог tmp/cache. rake tmp:sessions:clear очищает каталог tmp/sessions.

stats

rake stats дает вам хороший обзор вашего приложения.

notes

Вы можете оставить заметки в своем коде. Вы можете прикрепить их в своих комментариях с помощью TODO, FIXME, OPTIMIZE.

Некий файл Ruby

Когда вы запускаете rake notes, Rake анализирует эти префиксы и получает список всех этих заметок из вашего кода.

Shell

Вы даже получите подробный список, где вы найдете их: каталог, имя файла, номер строки [Номер строки], все включено. Удивительно, правда?

about

rake about дает вам обзор номеров версий для:

  • Rails
  • Ruby
  • RubyGems
  • Адаптер базы данных
  • Версия схемы
  • Middleware
  • Корень приложения

и много другой полезной информации.

secret

Если вы параноик относительно своего ключа сеанса и хотите его заменить, rake secret создаст для вас новый псевдослучайный ключ. Тем не менее, он не заменяет ключ для вас. Результат в оболочке выглядит следующим образом:

ресурсы

rake assets:precompile позволяет предварительно скомпилировать ваши ресурсы в папке public/assets. Если вы хотите избавиться от старых ресурсов, просто используйте rake assets:clean. Наконец, запуск rake assets:clobber удаляет весь каталог public/assets.

routes

rake routes наверно самая важная команда. Она показывает вам все маршруты в вашем приложении.

Заключение

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

Надеюсь, я охватил все основы, не будучи слишком сухими - в конце концов, Rake - это очень мощный инструмент, но в то же время это, возможно, не самая сексуальная игрушка. Однако это базовое знание Rake должно дать вам все, что вам нужно, чтобы стать опасным и расширить свои знания о задачах Rake, которые находятся в вашем распоряжении.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.