Использование RoR для сборки HTML приложения

В стародавние времена когда еще было много много богов, а на нашем рынке не пахло node.js и такими вещами как grunt, мы столкнулись со следующей задачей - нужно было сделать красивое интерактивное js приложение. Как не кстати на сервер нельзя было поставить нормальный ruby и тем более открывать доступ извне с сервера (то есть гемы ставить только руками).

На фоне таких ограничений родился маленький скрипт, позволяющий собирать из рельсового приложения статическое чисто из js и html кусков:

# coding: utf-8

require 'zlib'
require 'yaml'
require 'colorize'

desc "Project tasks"
namespace :html_builder do

  desc "Static pages tasks"
  namespace :pages do
    # Объявляем html страчнички которые будем дергать. 
    # Если передается массив ["/", "index"], 
    #   то первое значение путь с которого берем страницу, второе в какой файл сохраняем
    PAGES = [
      ["/", "index"],
      "map"
    ]

    desc "Build static HTML pages and place it to /public"
    task :build => :environment do
      # Код, который проходит по массиву страниц и сохраняет их в /public
      app = ActionDispatch::Integration::Session.new(Rails.application)

      content = {}
      error   = false

      PAGES.each do |page|
        if page.kind_of? Array
          addr = page[0]
          file = page[1]
        else
          addr = file = page
        end

        status        = app.get addr
        content[file] = app.response.body

        text = "#{status}: #{addr} (#{app.response.body.length})"
        if status == 200
          puts text.green
        else
          puts text.red
          error = true
        end
      end

      abort("Some pages errored, aboring...") if error

      content.each_pair do |file, content|
        filepath = "#{Rails.root.to_s}/public/#{File.dirname(file)}"
        filename = "#{Rails.root.to_s}/public/#{file}.html"

        FileUtils.mkdir_p filepath
        f = File.new(filename, "w")
        f.write content.force_encoding('UTF-8')
        f.close
      end
    end

    desc "Clean builded static pages"
    task :clean => :environment do
      # Очистка записанных в /public страниц
      PAGES.each do |page|
        file = page.kind_of?(Array) ? page[1] : page
        FileUtils.remove "#{Rails.root.to_s}/public/#{file}.html"
      end
    end
  end

  desc "Build full site, compress it and place to _releases, increase build version"
  task :build => ["assets:precompile", "pages:build", :environment] do
    # а это непосредство основной скрипт для сборки

    config_file = "#{Rails.root}/config/build.yml"

    config = YAML.load_file(config_file)
    release = config["build"]["release"]
    config["build"]["release"] = release +1

    version = config["build"].map {|key, val| val }.join(".")

    puts "BUILD PACKEGE #{version}"

    public_path  = "public"
    release_path = "#{Rails.root}/_releases"

    command = <<-end_command
      cd #{public_path} && tar -czf #{release_path}/build-#{version}.tar.gz *
    end_command

    puts command

    if system(command)
      puts '=> OK'
      File.open(config_file, 'w+') {|f| f.write(config.to_yaml) }
    else
      puts '=> Fail'
    end

    puts "clean data"

    Rake::Task['assets:clean'].invoke
    Rake::Task['html_builder:pages:clean'].invoke
  end

  desc "a"
  task :scp_to_server => :environment do
    # Заливка на сервер последнего релиза
    config_file = "#{Rails.root}/config/build.yml"

    config = YAML.load_file(config_file)
    version = config["build"].map {|key, val| val }.join(".")

    puts "SCP VERSION  #{version}"

    puts "============================================================================="
    puts "scp for server_name" 
    puts "scp ./_releases/build-#{version}.tar.gz  webdev@91.210.184.45:/opt/tomskoss/webdev/build-#{version}.tar.gz"
    puts "============================================================================="

    command = <<-end_command
      sshpass -p "<ВАШ ПАРОЛЬ>" scp ./_releases/build-#{version}.tar.gz  <ВАШ ЛОГИН>@<ВАШ IP>:<ПУТЬ ДО ПАПКИ ПРИЛОЖЕНИЯ ОТ КОРНЯ>/build-#{version}.tar.gz
    end_command

    success = system(command)
  end

  desc "a"
  task :build_and_scp_to_tomsk => :environment do
    Rake::Task['html_builder:build'].execute
    Rake::Task['html_builder:scp_to_server'].execute
  end

end

Вид моего файла build.yml упомиминемого выше:

---
build:
  major: 2
  minor: 1
  release: 1

Так же нужно не забыть создать папку _releases в корне проекта.

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