如何设置基本的ruby项目?

时间:2012-03-03 20:08:58

标签: ruby project-structure

我想创建一个包含10~20个类/文件的小型ruby项目。我需要一些宝石,我想使用rspec作为测试框架。

我可能想稍后建立一个宝石,但这不确定。

是否有一些Howto或Guide向我展示了如何设置项目的基本结构?

我的问题是:

  • 我在哪里放置所有自定义错误/例外
  • 是否有一些约定用于命名目录,如lib,bin,src等?
  • 我在哪里放置测试数据或文档。
  • 我在哪里需要我的所有文件,以便我可以在我的项目中访问它们。

我知道我可以从零开始做一切,但我想要一些指导。我可以复制一些好的宝石,但我不确定我真正需要什么以及我可以删除什么。

我查看了http://gembundler.com/,但在设置了捆绑包后停止了。

4 个答案:

答案 0 :(得分:148)

要获得良好的开端,您可以使用bundle gem命令和rspec --init

~/code $ bundle gem my_lib
      create  my_lib/Gemfile
      create  my_lib/Rakefile
      create  my_lib/LICENSE.txt
      create  my_lib/README.md
      create  my_lib/.gitignore
      create  my_lib/my_lib.gemspec
      create  my_lib/lib/my_lib.rb
      create  my_lib/lib/my_lib/version.rb
Initializating git repo in /Users/john/code/my_lib
~/code $ cd my_lib/
~/code/my_lib $ git commit -m "Empty project"
~/code/my_lib $ rspec --init
The --configure option no longer needs any arguments, so true was ignored.
  create   spec/spec_helper.rb
  create   .rspec
  • 代码进入lib
  • 规范进入spec
  • 测试数据或文档进入spec/fixtures/
  • 要求lib/my_lib.rb中的所有ruby文件。您也可以根据自己的喜好在该文件中或在自己的文件中定义例外。
  • C源文件进入ext/my_lib
  • shell脚本和可执行文件进入bin

如果有疑问,只需看看其他宝石是如何布局的。


更多信息:

您应该在gemspec中添加rspec作为开发依赖项,以便让其他开发人员更轻松

  1. 修改my_lib.gemspec,在底部附近添加gem.add_development_dependency 'rspec'gem.add_development_dependency 'rake'
  2. Bundler.setuprequire 'my_lib'添加到spec / spec_helper.rb的顶部,以确保在运行规范时加载了gem依赖项。
  3. require "rspec/core/rake_task"task :default => :spec添加到您的Rakefile中,以便运行rake将运行您的规范。
  4. 当您正在处理最新的创作时,guard-rspec可以节省您的时间和麻烦,在文件更改时自动运行您的规范,提醒您注意规格失败。

    ~/code/my_lib $ git add spec/spec_helper.rb
    ~/code/my_lib $ git commit -am "Add RSpec"
    ~/code/my_lib $ vim my_lib.gemspec # add guard development dependency
    ~/code/my_lib $ bundle
    ~/code/my_lib $ bundle exec guard init
    ~/code/my_lib $ vim Guardfile # Remove the sections below the top one
    ~/code/my_lib $ git add Guardfile
    ~/code/my_lib $ git commit -am "Add Guard"
    

    在对您的创作感到满意之后,将其推送到github

    # create a github repository for your gem, then push it up
    ~/code/my_lib $ curl -u myusername https://api.github.com/user/repos -d '{"name":"my_lib"}' 
    ~/code/my_lib $ git remote add origin git@github.com:myusername/my_lib.git
    ~/code/my_lib $ git push
    

    然后,当您准备在Rubygems.org上发布您的gem时,运行rake release,它将引导您完成这些步骤。

    ~/code/my_lib $ rake release
    

    进一步参考

答案 1 :(得分:11)

some nice guides at rubygems.org将向您介绍其中一些惯例及其背后的原因。通常,大多数Ruby开发人员都遵循Rubygems naming and directory conventions

如果我无法在标准库中找到任何符合错误描述的类,我只会创建自定义异常类。将您的错误类嵌套在引发它的类或模块下:

class Parser::Error < RuntimeError; end

begin
  Parser.new(:invalid).parse!
rescue Parser::Error => e
  puts e.message
end

如果您使用Test::Unit,则单元测试会转到/test,如果您使用RSpec,则会转到/spec。我推荐后者。

Bundler是管理加载路径的好方法。它将自动设置您的环境,仅使用Gemfilegemspec上指定的依赖项。它还允许您轻松require您的代码而不会成为宝石。

但是,由于您将来可能会将代码捆绑在gem中,我建议您调查how to create gem specifications。您应该手动编写规范。不要使用某种工具自动生成它 - 在我看来,它们是蛮力方法,在与源代码控制一起使用时会不必要地复制信息并造成严重破坏。

你可能觉得有用的

I created a gem。给定gemspec文件,它定义了许多有用的Rake任务,用于处理您的gem,其中包括用于构建,安装和将gem发布到rubygemsgit存储库的任务。自动版本标记。它还提供了一种在irbpry会话中加载代码的简便方法。

# Rakefile
require 'rookie'

# Run `rake -T` for the complete task list
Rookie::Tasks.new('your_gem.gemspec').define_tasks!

答案 2 :(得分:6)

以下是我最常见的约定(假设您的项目名称为“foo”):

  • /lib/foo.rb - 定义项目及其版本的顶级命名空间;需要所需的文件。
  • / lib / foo / - 包含项目的所有类,包括与错误相关的类。
  • / test / - 包含项目测试。
  • / spec / - 包含项目的规格。
  • / bin / - 如果您的项目依赖于二进制文件(JAR文件等),它们通常会进入。

在lib /中,约定通常是为顶级命名空间内的每个子命名空间创建一个文件夹。例如,类Foo :: Bar :: Baz通常位于/lib/foo/bar/baz.rb下。

有些人喜欢创建/lib/foo/version.rb文件只是为了设置Foo :: VERSION常量,但我经常在/lib/foo.rb文件中看到这个。

此外,如果您要创建gem,则需要以下文件:

  • / Rakefile - 定义rake任务(例如测试,构建和推送gem的任务)。
  • / Gemfile - 定义gem的来源(以及其他可能的东西)。
  • /foo.gemspec - 描述您的gem并提供依赖项列表。

答案 3 :(得分:4)

互联网上有一些关于如何构建Ruby项目的指南。此外,我认为解决这个问题的最佳方法是前往github并寻找一些着名的Ruby项目,并检查“他们的”结构。

除了一般的红宝石宝石要求,我建议使用以下工具以获得更好的工作流程:

  • editorconfig,帮助开发人员在不同的编辑器和IDE之间定义和维护一致的编码风格。
  • rubocop,用于ruby的静态代码分析器,用于ruby社区中的linter defac。
  • guard,连同一堆插件,您可以在代码更改时自动运行任何命令。
  • rake,各种项目任务的通用驱动程序,例如:
    • clean:构建gem包
    • test:清理生成的文件
    • List<ImageView> views = new ArrayList<ImageView>(); for ( int i = 0; i < length; i++){ views.add((ImageView)this.findViewById("R.id.letter" + (i+1)); } :运行测试
  • yard,流行的ruby文档工具。

除了上述所有工具之外,他们还为ruby项目提供了一些在线服务:

您甚至可以通过http://shields.io/为您的开源项目生成徽章。

这是我的经历,希望对某些人有所帮助。