2010-09-21 58 views
5

我正在构建一个简单的CMS on Rails,我在考虑如何打包它,以便我可以在其他项目中轻松地重用它,并最终以开源方式共享它。对于宝石还是不是,这就是问题

这让我想知道是否有可能将它作为gem打包,包含视图,控制器,模型,图像,样式表等等,并且以后只需将gem添加到Gemfile中就可以将它包含在新的站点中?

我不知道这是否可能,但也许有人在这里可以帮我找出?

回答

4

引擎是真棒!肯定看看杰米在他的回答中提供的链接,这是一个很好的起点。引擎是Rails 3的方式。我觉得它是框架最强大的功能之一,我将应用程序中的几乎所有常见功能转换为引擎。如果您正在创建大量应用程序,IT可为您节省大量时间。这是我创建引擎时的当前工作流程:

第1步:gem install jeweler如果您没有它。然后用珠宝商创建一个空白的宝石。

第2步:更新珠宝商提供的Rakefile与您的宝石信息和任何依赖关系。您可能需要添加一个文件列表,以便gemspec指向正确的文件,并排除您构建时不需要的任何文件。

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

第3步:添加您的Rails应用程序结构 - 应用程序/控制器,应用程序/视图等。在宝石的顶级目录。您也可以在您的routes.rb中包含/ config目录,并将其添加到您的主要应用程序路线中。

第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:添加所有的自定义引擎代码的应用程序/ *和lib/your_engine_name/

第7步:使用 “Rake构建” 建设创业板。你必须这样做,所以捆扎机可以看到你的文件在gemspec(当你建立其生成)的步骤#8

第8步:本地测试引用主应用程序的Gemfile中的本地路径,你要包括发动机:

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

步骤9:捆绑安装和启动本地应用服务器。

步骤10:既然你引用的本地路径,你可以更改创业板和看到他们在你的主要应用,而无需重建(除非您需要添加新的文件到gemspec)

第11步:把你的宝石来源放在github上,这样你就可以在产品中使用它。利用珠宝商版本化耙子任务。我结合一些这样的耙任务,以做到在同一步骤git的推动和标签,并将其包含在发动机的Rake文件:

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 => '[email protected]:yourusername/your_engine_name.git', :tag=>"v1.1.1" 

我使用这个技巧来引用的Gemfile 2名宝石的来源,直到他们添加功能捆扎机: http://www.cowboycoded.com/2010/08/10/using-2-sources-for-a-gem-in-different-environments-with-bundler/

如果您有任何问题,请告诉我。我正在写一篇博客文章来更详细地展示这一点,我可能已经遗漏了一些东西......现在就写下我的头顶上。

+0

非常感谢这个答案和你投入它的时间!真棒! – Erik 2010-09-21 16:49:16