2010-09-21 3 views
5

Ich baue ein einfaches CMS auf Rails und ich denke darüber nach, wie ich es verpacken kann, so dass ich es problemlos in anderen Projekten wiederverwenden und schließlich als Open Source freigeben kann.Um gem oder nicht, das ist die Frage

Das lässt mich fragen, ob es möglich ist, es als ein Juwel zu verpacken, mit Ansichten, Controllern, Modellen, Bildern, Stylesheets, usw., und es einfach in eine neue Website einfach durch Hinzufügen des Edelsteins zum Gemfile aufnehmen?

Ich habe keine Ahnung, ob das möglich ist oder nicht, aber vielleicht könnte mir hier jemand helfen, es herauszufinden?

Antwort

4

Motoren sind genial !! Schauen Sie sich unbedingt den Link an, den Jamie in seiner Antwort gegeben hat ... es ist ein guter Ausgangspunkt. Engines sind der Weg zu Rails 3. Ich habe das Gefühl, dass es eines der leistungsstärksten Features des Frameworks ist, und ich habe fast jede gemeinsame Funktionalität in meinen Apps in Engines umgewandelt. IT spart Ihnen eine Menge Zeit, wenn Sie viele Apps erstellen. Hier ist mein aktueller Workflow beim Erstellen von Engines:

Schritt 1:gem install jeweler wenn Sie es nicht haben. Dann erstellen Sie ein leeres Juwel mit Juwelier.

Schritt 2: aktualisieren Sie die Rakefile von Juwelier mit Ihrer Edelstein-Info und Abhängigkeiten zur Verfügung gestellt. Möglicherweise müssen Sie eine Dateiliste hinzufügen, damit die Gemspec auf die richtigen Dateien verweist und alle Dateien ausschließt, die Sie beim Erstellen nicht benötigen.

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

Schritt 3: Ihre Rails-Anwendung Struktur hinzufügen - app/controllers, app/views, etc .. Zum Verzeichnis auf oberster Ebene in der gem. Sie können auch das Verzeichnis/config für Ihre routes.rb einschließen, das an Ihre Haupt-Apps-Routen angehängt wird.

Schritt 4: Ihre lib wie folgt ein:

/lib/your_engine_name.rb (erfordern engine.rb in dieser Datei und alle anderen Dateien in lib, die Sie benötigen) /lib/your_engine_name/
/lib/your_engine_name/engine.rb

Schritt 5: code In der engine.rb:

require 'your_engine_name' 
require 'rails' 

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

Schritt 6: hinzufügen alle kundenspezifischen Maschinencode in app/* und lib/your_engine_name/

Schritt 7: das Juwel Build "Rake build" verwenden.Sie müssen dies tun, so Bündler Ihre Dateien in den gemspec sehen kann (die erzeugt wird, wenn Sie bauen) in Schritt # 8

Schritt 8: Für die lokale Prüfung des lokalen Pfad in der Gemfile Ihrer Hauptanwendung verweisen, in dem Sie wollen den Motor umfassen:

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

Schritt 9: Bündel installieren und starten Sie Ihren lokalen Applikationsserver auf.

Schritt 10: Da Sie den lokalen Pfad verweisen, können Sie Änderungen an den Edelstein machen und sie in Ihrem Haupt-App sehen, ohne Wiederaufbau (es sei denn, Sie neue Dateien zum gemspec hinzufügen müssen)

Schritt 11: Setzen Sie Ihre Edelstein Quelle auf GitHub, so dass Sie es in prod verwenden können. Nutzen Sie Juwelier Versioning Rake Aufgaben. Ich kombiniere einige der Rake Aufgaben wie diese, um den git push und Tag im gleichen Schritt und sie in dem Motor Rakefile zu tun:

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 

Schritt 12: Wenn der Produktion bereitstellen, um die Quelle ändern in der Gemfile eine Version Tag GitHub und Referenz:

gem 'your_engine_name', :git => '[email protected]:yourusername/your_engine_name.git', :tag=>"v1.1.1" 

ich diesen Hack bin mit 2 gem Quellen in Gemfile verweisen, bis sie diese Funktion zu Bündler hinzufügen: http://www.cowboycoded.com/2010/08/10/using-2-sources-for-a-gem-in-different-environments-with-bundler/

Lassen Sie mich wissen, wenn Sie irgendwelche Probleme damit haben. Ich arbeite an einem Blog-Post, um dies ausführlicher zu zeigen, und ich habe vielleicht ein paar Dinge ausgelassen .. nur schreibe dies von der Spitze meines Kopfes jetzt ..

+0

Vielen Dank für diese Antwort und die Zeit, die Sie hineingesteckt haben! Genial! – Erik