Создание Edge Rails приложения

May 22, 2012

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

Простой способ, это сгенерировать пустое приложение на последней стабильной версии рейлс и в гемфайле исправить запись с rails:

# gem 'rails', '3.2.3'
gem 'rails', path: '../rails'

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

Лучше создавать приложение прямо из edge. Для этого достаточно клонировать исходники рейлс к себе, запустить bundle, чтобы установить необходимые гемы и вызвать rails new из исходников:

git clone https://github.com/rails/rails
pushd rails
  bundle
popd
./rails/railties/bin/rails new demo-app --edge

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

Я уже рассказывал, как я создаю новое приложение. По аналогии я создал шаблон, для нового edge-приложения:

def file_force(name, content)
  f = File.open(name, 'w')
  f.puts content
  f.close
end

gem 'haml'
gem 'jquery-rails'
gem 'therubyracer', platform: :ruby, group: :assets
gem 'rails-footnotes', github: 'avakhov/rails-footnotes', branch: 'custom', group: :development
gem 'factory_girl_rails', group: :test
gem 'timecop', group: :test
gem 'database_cleaner', group: :test
gem 'rspec-rails', group: [:development, :test]

file '.rspec', <<-CODE
--colour
CODE

file 'spec/spec_helper.rb', <<-CODE
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.include FactoryGirl::Syntax::Methods
end
CODE

file 'spec/factories.rb', <<-CODE
FactoryGirl.define do
  # factory :demo do
  #   name 'name'
  # end
end
CODE

file 'app/controllers/home_controller.rb', <<-CODE
class HomeController < ApplicationController
  def index
  end
end
CODE

file 'app/views/home/index.html.haml', <<-CODE
%h1 Home#index
%p Find me in app/views/home/index.html.haml
CODE

file 'spec/controllers/home_controller_spec.rb', <<-CODE
require 'spec_helper'

describe HomeController do
  it "index" do
    get 'index'
    response.should be_success
  end
end
CODE

head = File.readlines('config/routes.rb').first
file_force 'config/routes.rb', <<-CODE
#{head.strip}
  root to: 'home#index'
end
CODE

FileUtils.rm('public/index.html')
FileUtils.rm_rf('test')

system "bundle install"
system "rake db:create db:migrate db:test:prepare"
system "git init"
system "git add ."
system "git ci -amInitial"

Использую шаблон с помощью команды:

./rails/railties/bin/rails new demo-app --edge -m rails-templates/edge-app.rb

По умолчанию будет использоваться рейлс из гитхаба gem 'rails', github: 'rails/rails', можно поменять вручную на gem 'rails', path: '../rails', чтобы экспрериментировать со своими изменениями.

comments powered by Disqus