关于代码格式:纯Ruby项目的目录布局

关于代码格式:纯Ruby项目的目录布局

Directory layout for pure Ruby project

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

1
2
3
4
5
6
7
8
9
/
 -/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,non-Merb)来保持其干净,简单和可维护?


自2011年起,通常会使用珠宝商代替newgem,因为后者实际上已被废弃。


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

1
2
3
4
5
6
7
8
9
10
11
12
  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/。它用于通用非红宝石文件。大多数项目不需要它,但是即使多次执行,所有内容也都保存在lib/中,尽管这可能不是最佳实践。

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

这些天foo.gemspec只能是.gemspec-尤其是如果没有手动维护。

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

1
2
3
4
5
  bin/
    foo
  man/
    foo.1
    foo.1.md or foo.1.ronn

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

1
2
  Gemfile
  Rakefile

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

其他一些不太常见的文件:

1
2
  VERSION
  MANIFEST

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

您可能还会看到什么,但用法是零星的:

1
2
3
4
5
6
7
8
  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.watchrvendor/包含其他项目的副本,例如git子模块;最后,web/包含项目的网站文件。

然后是一些相对常见的工具专用文件:

1
2
3
4
  .document
  .gitignore
  .yardopts
  .travis.yml

他们是不言自明的。

最后,我要补充一点,我个人添加了一个.index文件和一个var/目录来构建该文件(搜索" Rubyworks Indexer"以获取更多信息),并且通常具有一个work目录,例如:

1
2
3
4
5
  work/
    NOTES.md
    consider/
    reference/
    sandbox/

只是出于发展目的的一个废品场。


Bundler包括生成gem的必要基础结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ 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 /中,根据需要创建模块:

1
2
3
4
5
6
7
8
lib/
  spider/
    base.rb
  crawler/
    base.rb
  spider.rb
    require"spider/base"
    require"crawler/base"

阅读捆绑包gem的手册页,以获取有关--coc--exe--mit选项的详细信息。


@Dentharg:您的"包括一个包括所有子部分"是一种常见的模式。像其他任何东西一样,它具有优点(容易获得所需的东西)和缺点(许多包含项可能会污染名称空间,并且您无法控制它们)。您的模式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 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'
        ...

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 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

为什么不使用相同的布局?通常,您不需要构建,因为没有编译步骤,但是其余的对我来说似乎还可以。

我不确定模块的含义,但是如果只是一个类,则不需要单独的文件夹,并且如果有多个文件,通常可以编写一个module-1.rb文件(名称级别为只能执行module-1 /中的所有操作。

哦,我建议使用Rake进行管理任务(而不是make)。


所以我选择了newgem。
我删除了所有不必要的RubyForge / gem内容(hoe,安装程序等),创建了git repo,将项目导入了NetBeans。整个过程耗时20分钟,一切都变成绿色。
这甚至给了我一个基本的规格文件耙任务。

谢谢你们。


我会坚持一些与您熟悉的类似的东西:在您自??己的项目目录中成为陌生人毫无意义。 :-)

我经常拥有的典型东西是lib | src,bin,test。

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


推荐阅读