我正在Rails上构建一个简单的CMS,我正在思考如何打包它,以便我可以轻松地在其他项目中重用它,并最终将其作为开源共享。
这让我想知道是否可以将它打包为gem,包含视图,控制器,模型,图像,样式表等,然后只需将gem添加到Gemfile中就可以将它包含在新站点中了?
我不知道这是不是可能,但也许有人可以帮我找到答案?
答案 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)