【问题标题】:Directory layout for pure Ruby project纯 Ruby 项目的目录布局
【发布时间】:2010-09-08 13:17:34
【问题描述】:

我开始学习红宝石。我也是一名日常的 C++ 开发人员。 对于 C++ 项目,我通常使用以下目录结构

/
 -/bin <- built binaries
 -/build <- build time temporary object (eg. .obj, cmake intermediates)
 -/doc <- manuals and/or Doxygen docs
 -/src
 --/module-1
 --/module-2
 -- non module specific sources, like main.cpp
 - IDE project files (.sln), etc.

您会建议 Ruby(非 Rails、非 Merb)什么目录布局以保持干净、简单和可维护?

【问题讨论】:

  • 最新的 newgem 产生的杂物少了很多,这很好。

标签: ruby code-formatting


【解决方案1】:

截至 2011 年,使用 jeweler 代替 newgem 很常见,因为后者实际上已被废弃。

【讨论】:

  • 或捆绑器。为您提供“捆绑 gem gemname”来创建新的 gem。
【解决方案2】:

Bundler 包含生成 gem 所需的基础架构:

$ bundle gem --coc --mit --test=minitest --exe spider
Creating gem 'spider'...
MIT License enabled in config
Code of conduct enabled in config
      create  spider/Gemfile
      create  spider/lib/spider.rb
      create  spider/lib/spider/version.rb
      create  spider/spider.gemspec
      create  spider/Rakefile
      create  spider/README.md
      create  spider/bin/console
      create  spider/bin/setup
      create  spider/.gitignore
      create  spider/.travis.yml
      create  spider/test/test_helper.rb
      create  spider/test/spider_test.rb
      create  spider/LICENSE.txt
      create  spider/CODE_OF_CONDUCT.md
      create  spider/exe/spider
Initializing git repo in /Users/francois/Projects/spider
Gem 'spider' was successfully created. For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html

然后,在 lib/ 中,根据需要创建模块:

lib/
  spider/
    base.rb
  crawler/
    base.rb
  spider.rb
    require "spider/base"
    require "crawler/base"

阅读bundle gem 的手册页,了解--coc--exe--mit 选项的详细信息。

【讨论】:

  • 这不再起作用了,因为 newgem 和 rubigen 似乎没有维护
  • @BenjaminBurkhart,我将信息替换为致电bundler。感谢您的提醒!
【解决方案3】:

一个标准的Ruby项目的核心结构基本上是:

  lib/
    foo.rb
    foo/
  share/
    foo/
  test/
    helper.rb
    test_foo.rb
  HISTORY.md (or CHANGELOG.md)
  LICENSE.txt
  README.md
  foo.gemspec

share/ 很少见,有时称为data/。它用于通用的非 ruby​​ 文件。大多数项目不需要它,但即使他们多次使用它,所有内容也只是保存在 lib/ 中,尽管这可能不是最佳做法。

如果使用 BDD 而不是 TDD,则 test/ 目录可能称为 spec/,但如果使用 Cucumber,您可能还会看到 features/,如果使用 QED,您可能还会看到 demo/

如今foo.gemspec 只能是.gemspec——尤其是在不手动维护的情况下。

如果您的项目有命令行可执行文件,则添加:

  bin/
    foo
  man/
    foo.1
    foo.1.md or foo.1.ronn

此外,大多数 Ruby 项目都有:

  Gemfile
  Rakefile

Gemfile 用于使用 Bundler,Rakefile 用于 Rake 构建工具。但如果您想使用不同的工具,还有其他选择。

其他一些不常见的文件:

  VERSION
  MANIFEST

VERSION 文件只包含当前版本号。 MANIFEST(或Manifest.txt)包含要包含在项目包文件(例如gem包)中的文件列表。

你可能会看到什么,但使用是零星的:

  config/
  doc/ (or docs/)
  script/
  log/
  pkg/
  task/ (or tasks/)
  vendor/
  web/ (or site/)

其中config/包含各种配置文件; doc/ 包含生成的文档,例如RDoc,或者有时是手动维护的文档; script/ 包含项目使用的 shell 脚本; log/ 包含生成的项目日志,例如测试覆盖率报告; pkg/ 保存生成的包文件,例如foo-1.0.0.gem; task/ 可以保存foo.rakefoo.watchr 等各种任务文件; vendor/ 包含其他项目的副本,例如git子模块;最后web/ 包含项目的网站文件。

然后是一些也比较常见的工具专用文件:

  .document
  .gitignore
  .yardopts
  .travis.yml

它们是不言自明的。

最后,我要补充的是,我个人添加了一个 .index 文件和一个 var/ 目录来构建该文件(搜索“Rubyworks Indexer”以获取更多信息)并且通常有一个 work 目录,类似于:

  work/
    NOTES.md
    consider/
    reference/
    sandbox/

只是一个用于开发目的的废品场。

【讨论】:

    【解决方案4】:

    @Dentharg:您的“包含一个以包含所有子部分”是一种常见模式。像任何东西一样,它有它的优点(很容易得到你想要的东西)和它的缺点(许多包含会污染命名空间并且你无法控制它们)。您的模式如下所示:

    - src/
        some_ruby_file.rb:
          require 'spider'
          Spider.do_something
    
    + doc/
    
    - lib/
      - spider/
          spider.rb:
            $: << File.expand_path(File.dirname(__FILE__))
            module Spider
              # anything that needs to be done before including submodules
            end
    
            require 'spider/some_helper'
            require 'spider/some/other_helper'
            ...
    

    我可能会建议这样做以允许更多控制:

    - src/
        some_ruby_file.rb:
          require 'spider'
          Spider.include_all
          Spider.do_something
    
    + doc/
    
    - lib
      - spider/
          spider.rb:
            $: << File.expand_path(File.dirname(__FILE__))
            module Spider
              def self.include_all
                require 'spider/some_helper'
                require 'spider/some/other_helper'
                ...
              end
            end
    

    【讨论】:

      【解决方案5】:

      为什么不使用相同的布局?通常你不需要构建,因为没有编译步骤,但我觉得其余的都可以。

      我不确定您所说的模块是什么意思,但如果它只是一个类,则不需要单独的文件夹,如果有多个文件,您通常会编写一个 module-1.rb 文件(名称为级别为 module-1 文件夹),它只需要 module-1/ 中的所有内容。

      哦,我建议将Rake 用于管理任务(而不是 make)。

      【讨论】:

        【解决方案6】:

        我会坚持类似于您所熟悉的内容:在您自己的项目目录中成为陌生人是没有意义的。 :-)

        我一直拥有的典型东西是 lib|src、bin、test。

        (我不喜欢这些怪物生成器:我对新项目要做的第一件事就是写下一些代码,而不是编写自述文件、文档等!)

        【讨论】:

          【解决方案7】:

          所以我选择了 newgem。 我删除了所有不必要的 RubyForge/gem 东西(锄头、设置等),创建了 git 存储库,将项目导入 NetBeans。一切都花了 20 分钟,一切都是绿色的。 这甚至给了我一个基本的规范文件 rake 任务。

          谢谢大家。

          【讨论】:

            猜你喜欢
            • 2010-11-13
            • 2011-04-18
            • 1970-01-01
            • 1970-01-01
            • 2012-01-21
            • 1970-01-01
            • 2012-05-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多