2010-09-21 22 views
5

Estoy construyendo un CMS simple en Rails y estoy pensando en cómo puedo empaquetarlo para poder reutilizarlo fácilmente en otros proyectos y, finalmente, compartirlo como de código abierto.Joya o no, esa es la pregunta

Esto me deja preguntándome si es posible empaquetarlo como una gema, con vistas, controladores, modelos, imágenes, hojas de estilo, etc., y luego simplemente incluirlo en un nuevo sitio simplemente agregando la gema al Gemfile.

No tengo idea si esto es posible o no, pero ¿alguien aquí podría ayudarme a descubrirlo?

Respuesta

4

motores son impresionantes !! Definitivamente mira el enlace que Jamie proporcionó en su respuesta ... es un buen punto de partida. Los motores son el camino a seguir con Rails 3. Siento que es una de las características más potentes del framework, y convertí casi todas las funciones comunes de mis aplicaciones en motores. Te ahorrará muchísimo tiempo si estás creando muchas aplicaciones. Aquí está mi flujo de trabajo actual al crear motores:

Paso 1:gem install jeweler si no lo tiene. Luego crea una gema en blanco usando joyero.

Paso 2: actualice el Rakefile proporcionado por el joyero con su información de gema y sus dependencias. Es posible que necesite agregar una lista de archivos para que gemspec pueda señalar los archivos correctos y excluir cualquier archivo que no desee al crearlo.

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

Paso 3: Añadir la estructura de su aplicación Rails - app/controllers, app/views, etc .. en el directorio de nivel superior en la gema. También puede incluir el directorio/config para su routes.rb que se agregará a sus rutas principales de aplicaciones.

Paso 4: Configurar el directorio lib de esta manera:

/lib/your_engine_name.rb (requiere engine.rb en este archivo y cualquier otro archivos en lib que usted necesita) /lib/your_engine_name/
/lib/your_engine_name/engine.rb

Paso 5: Añadir un código a engine.rb:

require 'your_engine_name' 
require 'rails' 

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

Paso 6: Añadir todo el código del motor a medida para aplicación/* y lib/your_engine_name/

Paso 7: Construir la gema el uso de "acumulación rastrillo".Debe hacerlo de manera Bündler puede ver sus archivos en el gemspec (que se genera cuando se construye) en el paso # 8

Paso 8: Para la prueba de referencia local la ruta local en el Gemfile de su aplicación principal, donde querer incluir el motor:

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

Paso 9: paquete de instalar y poner en marcha el servidor de aplicación local.

Paso 10: Dado que se hace referencia a la ruta de acceso local, puede realizar cambios en la gema y verlos en su aplicación principal sin reconstrucción (a menos que necesite añadir nuevos archivos a la gemspec)

Paso 11: pon tu fuente de gemas en github para que puedas usarla en prod. Haga uso de joyeros versionando tareas de rake. Combino algunas de las tareas del rastrillo de este tipo con el fin de hacer el git push y la etiqueta en el mismo paso e incluirlos en Rakefile del motor:

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 

Paso 12: Al desplegar a la producción, cambiar la fuente en el Gemfile a github y hacer referencia a una etiqueta de versión:

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

estoy usando este truco para hacer referencia 2 fuentes de gemas en Gemfile hasta que añaden que función para Bündler: http://www.cowboycoded.com/2010/08/10/using-2-sources-for-a-gem-in-different-environments-with-bundler/

Avíseme si tiene algún problema con esto. Estoy trabajando en una publicación de blog para mostrar esto con más detalle y es posible que haya omitido algunas cosas ... simplemente escribir esto en la cabeza ahora mismo ...

+0

¡Muchas gracias por esta respuesta y el tiempo que le dedicas! ¡Increíble! – Erik

Cuestiones relacionadas