我正在Rails上构建一个简单的CMS,我正在考虑如何将其打包,以便在其他项目中轻松重用,并最终将其作为开源共享。
这让我想知道是否有可能将它打包为gem,包含视图、控制器、模型、图像、样式表等,然后只需将gem添加到Gemfile中即可将其包含在新站点中。
我不知道这是否可能,但也许这里有人能帮我找出答案?
发布于 2010-09-21 23:57:22
引擎太棒了!当然,看看Jamie在他的answer..it中提供的链接就是一个很好的起点。引擎是Rails3的必由之路。我觉得它是框架中最强大的功能之一,我几乎把我应用程序中的所有常用功能都转换成了引擎。如果你正在创建大量的应用程序,它会为你节省大量的时间。以下是我在创建引擎时的当前工作流程:
第一步: gem install jeweler,如果你没有它的话。然后使用珠宝商创建一个空白宝石。
第2步:使用您的gem信息和任何依赖项更新珠宝商提供的Rakefile。您可能需要添加一个文件列表,以便gemspec可以指向正确的文件,并在构建它时删除任何不需要的文件。
gem.files = FileList['lib/**/*.rb','[A-Z]*', 'lib/**/**/*'].to_a第3步:添加您的Rails应用程序结构-应用程序/控制器、应用程序/视图等。添加到gem中的顶级目录。您还可以包含routes.rb的/config目录,该目录将附加到您的主应用程序路由中。
步骤4:设置lib目录,如下所示:
/ lib /your_engine_name.rb (需要在此文件和lib中需要的任何其他文件中包含engine.rb ) /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添加新文件)。
github第11步:将你的gem源代码放到github上,这样你就可以在中使用它。利用珠宝商对rake任务进行版本控制。我组合了一些这样的rake任务,以便在同一步骤中执行git推送和标记,并将它们包含在引擎的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"我正在使用这个技巧来引用Gemfile中的两个gem源代码,直到他们将该功能添加到Bundler:http://www.cowboycoded.com/2010/08/10/using-2-sources-for-a-gem-in-different-environments-with-bundler/
如果您对此有任何问题,请告诉我。我正在写一篇博客文章,以更详细地展示这一点,我可能遗漏了一些东西。现在就把这个写在我的脑海里..
发布于 2010-09-21 22:38:36
把它包装成一个引擎宝石。
请参阅:http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/
https://stackoverflow.com/questions/3761371
复制相似问题