什么是构造ruby的现代方式?
Bundler的发布有很大的改变吗? 有没有可以作为基地的模板? 什么是最佳实践?
一些我发现有用的post:
- http://chneukirchen.github.com/rps/
- http://tomayko.com/writings/require-rubygems-antipattern
- http://yehudakatz.com/2009/07/24/rubygems-good-practice/
- http://weblog.rubyonrails.org/2009/9/1/gem-packaging-best-practices
编辑 (2012-01-10):gem最佳实践的优秀全面指南是RubyGems指南 。 我强烈build议现在从这里开始。
总结要点:
- 使用基本的
lib/gem.rb
和lib/gem/
structure来获取代码。 - 将任何可执行文件放在
bin
,将任何数据文件放入data
并在test
或spec
中进行test
。 - 不
require
或取决于加载path之外的文件。 (VERSION
文件往往似乎生活在gem奇怪的地方。) - 不
require 'rubygems'
。 - 不要篡改
$LOAD_PATH
。 - 如果你发现自己写文件
require File.join(__FILE__, 'foo', 'bar')
,那么你做错了。
最简单的方法就是使用bundler :
bundle gem <gem_name>
您甚至可以在父目录的现有项目中使用它。
在编写胖(二进制)gem时,结构通常是这样的:
lib/1.8/binary.so
lib/1.9/binary.so
lib/my_gem.rb
(这个文件只是根据ruby版本select加载哪个binary.so
)
对于本机扩展:
lib/ext/my_gem/my_sources.*
lib/my_gem.rb
我通常也在这里放一个version.rb
文件:
lib/my_gem/version.rb
它只是包含像这样的东西:
module MyGem VERSION = "0.1.0" end
此外,国际海事组织,不要把任何.rb文件, 除了你希望人们用来加载gem, lib/
目录中的文件。 而是把所有的辅助文件放在lib/my_gem/
Telemachus的build议是好的。 如果你遵循它,你的gem将被设置为与打包机很好地玩。
你也可以尝试使用珠宝商。 这是一个生成gem骷髅的gem。 它吐出的默认框架符合Telemachus提到的所有约定,它也会做一些很好的事情,比如添加你最喜欢的testing框架或者创build一个GitHub仓库。
这个rubygems指南提供了关于gem结构的信息,然后详细说明了gemspec应该包含哪些内容
您可能会发现使用捆绑器为您创buildgem的文件夹结构更容易:
bundle gem <gem_name>
my_gem$ bundle gem my_gem create my_gem/Gemfile create my_gem/Rakefile create my_gem/LICENSE.txt create my_gem/README.md create my_gem/.gitignore create my_gem/my_gem.gemspec create my_gem/lib/my_gem.rb create my_gem/lib/my_gem/version.rb Initializing git repo in /Users/keith/projects/my_gem/my_gem