理想的 Ruby 项目结构

我正在对 Ruby (non-ails/merb/etc)项目的理想项目结构进行概述/说明

app/
bin/                  #Files for command-line execution
lib/
appname.rb
appname/            #Classes and so on
Rakefile              #Running tests
README
test,spec,features/   #Whichever means of testing you go for
appname.gemspec       #If it's a gem

我做错了什么吗? 我错过了哪些部分?

47262 次浏览

我觉得差不多就是这样。默认情况下,Rubygems 会将 lib 目录添加到 loadpath,但是您可以使用 $: 变量将任何您想要的目录推送到该目录。也就是说。

$:.push File.expand_path(File.dirname(__FILE__) + '/../surfcompstuff')

这意味着当你说,在目录中的 surfer.rb,你可以 require "surfer"任何地方和文件将被发现。

而且,作为惯例,类和单例模块获得一个文件,而模块获得一个目录。例如,如果使用 LolCatz模块和 LolCatz::Moar类,那么应该是:

lib/
appname.rb
lolcatz/
moar.rb

这就是为什么有一个 lib/appname 文件夹,因为大多数库都在 appname名称空间中。

此外,如果您尝试运行命令 newgem --simple [projectname],它将为您快速生成一个脚手架,其中只包含 Ruby 项目的基本要素(扩展为 Ruby Gem)。我知道还有其他工具可以做到这一点,但 newgem 是相当普遍的。我通常会删除 TODO 文件和所有的脚本内容。

我尝试模仿 Rails 项目结构,因为我的团队(通常处理 Rails)比其他配置更好地理解这个结构。约定优于配置-从 Rails 流血过多。

请参阅 http://guides.rubygems.org/what-is-a-gem/中的以下示例

 % tree freewill
freewill/
├── bin/
│   └── freewill
├── lib/
│   └── freewill.rb
├── test/
│   └── test_freewill.rb
├── README
├── Rakefile
└── freewill.gemspec

如果使用 bundler,运行此命令 bundle gem app_name将得到相同的目录结构。

如果希望使用 rspec 而不是单元测试,那么可以运行这个命令 rspec --init (先确定你是 cd app_name)