Драгоценный камень или нет, вот в чем вопрос - PullRequest
5 голосов
/ 21 сентября 2010

Я создаю простую CMS на Rails, и я думаю о том, как мне упаковать ее, чтобы я мог легко использовать ее в других проектах и ​​в конечном итоге поделиться ею с открытым исходным кодом.

Это оставляет меняИнтересно, можно ли упаковать его как драгоценный камень с представлениями, контроллерами, моделями, изображениями, таблицами стилей и т. д., а затем просто включить его в новый сайт, просто добавив драгоценный камень в Gemfile?

У меня естьпонятия не имею, возможно ли это или нет, но, может быть, кто-то здесь может помочь мне узнать?

Ответы [ 2 ]

4 голосов
/ 21 сентября 2010

Двигатели потрясающие !!Определенно посмотрите на ссылку, предоставленную Джейми в своем ответе. Это хорошая отправная точка.Двигатели - это путь к Rails 3. Я чувствую, что это одна из самых мощных функций фреймворка, и я преобразовал почти все части общих функций в своих приложениях в движки.Это экономит вам массу времени, если вы создаете много приложений.Вот мой текущий рабочий процесс при создании движков:

Шаг 1: gem install jeweler, если у вас его нет.Затем создайте пустой драгоценный камень с помощью jeweler.

Шаг 2: обновите Rakefile, предоставленный jeweler, вашей информацией о драгоценном камне и любыми зависимостями.Вам может понадобиться добавить список файлов, чтобы gemspec мог указывать на правильные файлы и исключать любые файлы, которые вам не нужны при его создании.

gem.files = FileList['lib/**/*.rb','[A-Z]*', 'lib/**/**/*'].to_a

Шаг 3: Добавьте свой Railsструктура приложения - app / controllers, app / views и т. д. в каталоге верхнего уровня в геме.Вы также можете включить / config каталог для вашего rout.rb, который будет добавлен к вашим основным приложениям маршрутов.

Шаг 4: Настройте свой каталог lib следующим образом:

/ lib / your_engine_name.rb (требуется engine.rb в этом файле и любых других файлах в lib, которые вам нужны) / lib / your_engine_name /
/lib/your_engine_name/engine.rb

Шаг 5: Добавьте код в engine.rb:

 require 'your_engine_name'
 require 'rails'

 module YourEngineName    
  class Engine < Rails::Engine  
    #load rake tasks go here  
    #initializers go here     
  end
 end

Шаг 6: Добавьте весь свой собственный код движка в app / * и lib /your_engine_name /

Шаг 7: Создайте драгоценный камень, используя "rake build".Вы должны сделать это, чтобы Bundler мог видеть ваши файлы в gemspec (который создается при сборке) на шаге № 8

Шаг 8: Для локального тестирования обратитесь к локальному пути в Gemfileвашего основного приложения, в которое вы хотите включить движок:

#Gemfile  
gem "your_engine_name", :require => "your_engine_name", :path => "/your_engines/your_engine_name"

Шаг 9: Устанавливайте пакет и запускайте локальный сервер приложений.

Шаг10: Поскольку вы ссылаетесь на локальный путь, вы можете вносить изменения в гем и просматривать их в своем основном приложении без перестройки (если только вам не нужно добавлять новые файлы в gemspec)

Шаг 11: поместите ваш источник драгоценных камней на github, чтобы вы могли использовать его в prod.Используйте грабли для ювелиров, которые управляют версионностью.Я объединяю некоторые из таких задач с граблями, чтобы выполнить git push и tag на одном шаге и включить их в Rakefile движка:

namespace :version do  
  desc "create a new version, create tag and push to github"  
  task :github_and_tag do  
    Rake::Task['github:release'].invoke  
    Rake::Task['git:release'].invoke  
  end  

  desc "bump patch push to github"  
  task :patch_release do  
    Rake::Task['version:bump:patch'].invoke  
    Rake::Task['version:github_and_tag'].invoke  
  end  

  desc "bump minor push to github"  
  task :minor_release do  
    Rake::Task['version:bump:minor'].invoke  
    Rake::Task['version:github_and_tag'].invoke  
  end  

  desc "bump major push to github"  
  task :major_release do  
    Rake::Task['version:bump:major'].invoke  
    Rake::Task['version:github_and_tag'].invoke  
  end  
end  

Шаг 12: При развертываниидля производства, измените источник в Gemfile на github и укажите тег версии:

gem 'your_engine_name', :git => 'git@github.com:yourusername/your_engine_name.git', :tag=>"v1.1.1"

Я использую этот хак для ссылки на 2 источника Gem в Gemfile, пока они не добавят эту функцию в Bundler: http://www.cowboycoded.com/2010/08/10/using-2-sources-for-a-gem-in-different-environments-with-bundler/

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

3 голосов
/ 21 сентября 2010

Упакуйте его как драгоценный камень двигателя.

См .: http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...