对于宝石与否,这就是问题所在

时间:2010-09-21 14:32:46

标签: ruby-on-rails ruby-on-rails-3

我正在Rails上构建一个简单的CMS,我正在思考如何打包它,以便我可以轻松地在其他项目中重用它,并最终将其作为开源共享。

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

我不知道这是不是可能,但也许有人可以帮我找到答案?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

第3步:将您的Rails应用程序结构 - app / controllers,app / views等...添加到gem中的顶级目录。您还可以在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步:将所有自定义引擎代码添加到app / *和lib / your_engine_name /

第7步:使用“rake build”构建gem。你必须这样做,以便Bundler可以在步骤#8中看到gemspec中的文件(在你构建时生成)

步骤8:对于本地测试,请参考主应用程序的Gemfile中要包含引擎的本地路径:

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

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

第10步:由于您正在引用本地路径,因此您可以更改gem并在主应用中查看它们而无需重建(除非您需要向gemspec添加新文件)< / p>

步骤11:将您的宝石源放在github上,以便在prod中使用它。利用珠宝商版本化rake任务。我结合了一些像这样的rake任务,以便在同一步骤中执行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"

我正在使用这个hack在Gemfile中引用2个gem源,直到他们将该功能添加到Bundler: http://www.cowboycoded.com/2010/08/10/using-2-sources-for-a-gem-in-different-environments-with-bundler/

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

答案 1 :(得分:3)