Rake — это как швейцарский нож в мире Ruby, который годами пылится в ящике, пока однажды не спасает ваш проект от хаоса. В статье разберём, как превратить Rake из “нужного для миграций” в мощный инструмент для автоматизации, тестирования и даже мониторинга, с примерами из реальных боевых условий.
� Почему Rake — это не только db:migrate
Когда новичок видит rake -T, он обычно обнаруживает там:
rake db:migrate # Накатить миграции
rake db:seed # Заполнить базу тестовыми данными
И думает: “Ну ок, скучно”. Но под капотом — целый язык автоматизации с зависимостями, описанием задач и интеграцией в Ruby-экосистему.
🔧 Базовый пример: задача для очистки кэша
Допустим, вам надоело вручную чистить tmp/cache. Пишем в lib/tasks/cache.rake:
desc "Очищает кэш приложения"
task :clear_cache do
puts "💥 Удаляем файлы кэша..."
FileUtils.rm_rf(Dir.glob('tmp/cache/*'))
puts "✅ Готово!"
end
Вызываем:
rake clear_cache
Уже полезнее, чем ручная возня с rm!
🧩 Продвинутые фишки
1. Зависимости между задачами
task :build => [:compile, :test] do
puts "Сборка завершена!"
end
2. Аргументы
task :greet, [:name] do |t, args|
puts "Привет, #{args.name}!"
end
Вызов: rake greet[Иван]
3. Использование Rails-окружения
task :heavy_report => :environment do # Загружает Rails
User.find_each { |u| puts u.email }
end
💼 Реальные кейсы из практики
1. Ежедневный отчёт в Slack
task :daily_stats => :environment do
stats = {
new_users: User.where("created_at > ?", 1.day.ago).count,
revenue: Payment.where(created_at: Time.zone.now.all_day).sum(:amount)
}
SlackNotifier.new.post("📊 Отчёт за #{Date.today}: #{stats.to_json}")
end
2. Массовый фикс данных (когда миграция не подходит)
task :fix_legacy_emails => :environment do
User.where("email LIKE '%пример%'").find_each do |user|
user.update!(email: user.email.gsub('пример', 'example'))
end
end
3. Проверка целостности данных
task :check_orphaned_records => :environment do
Post.left_joins(:user).where(users: { id: nil }).each do |post|
puts "Пост #{post.id} без пользователя!"
end
end
💣 Антипаттерны
- Гигантские rake-файлы
Не превращайтеlib/tasksв свалку. Дробите логику:lib/tasks/ ├── db.rake ├── reports.rake └── maintenance.rake - Тихие падения
Всегда обрабатывайте ошибки:task :dangerous do begin # Код rescue => e puts "💥 Ошибка: #{e.message}" exit 1 # Важно для CI/CD! end end - Задачи без описания
desc— ваша документация:# Плохо: task :mystery_task # Хорошо: desc "Генерирует CSV-отчёт по платежам" task :generate_payments_report
🛠 Интеграция с современным стеком
1. Docker + Rake
COPY lib/tasks /app/lib/tasks
CMD ["rake", "daily_stats"]
2. CI/CD (GitLab example)
run_reports:
script:
- bundle exec rake generate_reports
only:
- schedules
3. Мониторинг через Healthchecks.io
task :cron_job do
require 'net/http'
Net::HTTP.get(URI('https://hc-ping.com/your-uuid'))
# Основная логика
Net::HTTP.get(URI('https://hc-ping.com/your-uuid/ok'))
end
🎯 Вывод
Rake — это ваш личный ассистент, который умеет:
- Автоматизировать рутину ✅
- Чинить данные в проде 🔧
- Генерировать отчёты 📊
- Работать по расписанию ⏰
Совет: Заведите rake -T в своём проекте прямо сейчас — возможно, вы обнаружите забытые задачи, которые уже решают ваши проблемы.
“Хороший разработчик пишет код. Отличный — заставляет код работать за себя.”
— Rake-манифест