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 부분)를 참고해주세요!

https://guides.rubyonrails.org/v4.0/command_line.html#rake

References