Rake(Ruby Make)
Rake는 Ruby에서 사용되는 build utility로 Make유사합니다. rake란 이름 또한 ruby
+ make
에서 만들어진 단어로 일반적인 Ruby application과 Rails 등 여러가지 환경에서 개발 도구로써 사용됩니다.
A make-like build utility for Ruby.
오늘은 단순한 build task 부터 개발을 위한 여러가지 기능들 까지 가능한 Rake에 대해 이야기하려고 합니다.
Installation
gem install rake
Make/Run Task
Rake는 Rakefile
을 통해 관리됩니다. 해당 파일에 task
로 명시할 수 있습니다. task는 루비 코드로 작성할 수 있습니다.
task :env do
puts ENV['PHASE']
end
Rakefile을 만든 이후에는 rake
명령으로 실행하거나 리스트를 볼 수 있습니다. 자주 사용하는 flag는 아래와 같습니다.
# Rakefile
rake -f <rakefile-name> # 지정한 rakefile을 기준으로 실행합니다.
# Show
rake -T # 실행 가능한 tasks를 출력합니다.
rake -AT # 모든 tasks를 출력합니다.
# Run
rake # default rake 작업을 실행합니다.
rake <task-name> # 지정한 task를 실행합니다.
# -j, --jobs 병렬 처리 시 동시에 실행할 task의 최대 갯수를 지정합니다.
# -m, --multitask 모든 task를 병렬로 처리합니다.
Tricks
Run rb file
rakefile 내부에 코드를 직접 정의하지 않더라도 ruby
로 실행할 파일을 명시할 수 있습니다.
task :run do
ruby 'tasks/run.rb'
end
Default task
task default:
로 기본 rake task를 명시할 수 있습니다.
task default: %w[test]
task :test do
ruby "test/unittest.rb"
end
Namespace
Namespcae는 여러 Task를 그룹화하여 관리할 수 있는 기능입니다. namespace로 묶어진 task는 namespace:task
형태로 호출할 수 있습니다.
namespace :db do
desc 'generate sample data'
task :sample do
# ...
end
desc 'clean data'
task :clean do
# ...
end
end
namespace :show do
desc 'show all records'
task :records do
# ...
end
desc 'show all configs'
task :config do
# ...
end
end
Arguments
taks 정의 시 arguments도 받을 수 있도록 구성할 수 있습니다.
task :name, [:first_name, :last_name] do |t, args|
puts "First name is #{args.first_name}"
puts "Last name is #{args.last_name}"
end
Run after task
하나의 task를 위해 여러개의 task 실행이 필요할 수도 있고, 때에 따라 순차적으로 실행이 필요할 수 있습니다. 이때는 Rake::Task
를 통해 정의된 다른 task를 실행하는 형태로 처리할 수 있습니다.
task test: :environment do
Rake::Task["test:setup"].execute
Rake::Task["test"].execute
Rake::Task["test:clean"].execute
end
Rake in Rails
Rails는 기본적으로 여러가지 개발을 위한 rake tasks를 가지고 있습니다. 대표적으로 알려진게 바로 rake db:migrate
, rake routes
등이죠. rails에선 rake 작업을 lib/tasks/<name>.rake
경로에 생성하여 추가할 수 있고 이 때 rails 내부의 객체를 쓸 수 있기 떄문에 편리하게 원하는 작업들을 구성하실 수 있습니다.
namespace :scans do
task :all => :environment do
puts Scans.all
end
task :first => :environment do
puts Scans.first.url
end
task :last => :environment do
puts Scans.last.url
end
end
위와 같이 rails 구성한 앱에 접근해서 값을 가져오거나 수정하고, 처리할 수도 있습니다. 자세한 내용은 Rails 공식 문서(rake 부분)를 참고해주세요!