Макет каталога для проекта на чистом Ruby
-
09-06-2019 - |
Вопрос
Я начинаю изучать рубин.Я также являюсь ежедневным разработчиком 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) вы бы предложили, чтобы он был чистым, простым и удобным в обслуживании?
Решение
Бандлер включает в себя необходимую инфраструктуру для создания драгоценного камня:
$ 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"
Прочитайте страницу руководства для связка драгоценных камней для получения подробной информации о --coc
, --exe
и --mit
параметры.
Другие советы
По состоянию на 2011 год принято использовать ювелир вместо newgem, поскольку от последнего фактически отказались.
Основная структура стандартного проекта 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/
, хотя это, вероятно, не лучшая практика.
А test/
каталог может называться spec/
если вместо TDD используется BDD, хотя вы также можете увидеть features/
если используется огурец, или demo/
если используется QED.
В эти дни 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
) содержит список файлов, которые будут включены в файл(ы) пакета проекта (например,пакет драгоценных камней).
Что еще вы можете увидеть, но использование носит спорадический характер:
config/
doc/ (or docs/)
script/
log/
pkg/
task/ (or tasks/)
vendor/
web/ (or site/)
Где config/
содержит различные файлы конфигурации; doc/
содержит либо сгенерированную документацию, например.RDoc или иногда документация, поддерживаемая вручную; script/
содержит сценарии оболочки для использования проектом; log/
содержит сгенерированные журналы проекта, например.отчеты о тестовом покрытии; pkg/
содержит сгенерированные файлы пакетов, например. foo-1.0.0.gem
; task/
может содержать различные файлы задач, такие как foo.rake
или foo.watchr
; vendor/
содержит копии других проектов, например.подмодули git;и наконец web/
содержит файлы веб-сайта проекта.
Затем некоторые файлы, специфичные для инструментов, которые также относительно распространены:
.document
.gitignore
.yardopts
.travis.yml
Они достаточно очевидны.
Напоследок добавлю, что лично я добавляю .index
файл и var/
каталог для создания этого файла (для получения дополнительной информации найдите «Индексатор Rubyworks») и часто имеет work
каталог, что-то вроде:
work/
NOTES.md
consider/
reference/
sandbox/
Просто свалка для целей развития.
@Дентарг:ваше «включить одну, чтобы включить все подчасти» - это распространенный шаблон.Как и у всего, у него есть свои преимущества (легко получить то, что вы хотите) и свои недостатки (множество включений может загрязнять пространства имен, и вы не можете их контролировать).Ваш шаблон выглядит следующим образом:
- 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
Почему бы не использовать тот же макет?Обычно вам не нужна сборка, потому что нет этапа компиляции, но все остальное мне кажется приемлемым.
Я не уверен, что вы подразумеваете под модулем, но если это всего лишь один класс, отдельная папка не понадобится, а если файлов более одного, вы обычно пишете файл Module-1.rb (на уровне имени, как папку модуля-1), который не делает ничего, кроме требования всего, что есть в модуле-1/.
О, и я бы предложил использовать Грабли для задач управления (вместо make).
Я бы придерживался чего-то похожего на то, что вам знакомо:нет смысла быть чужим в каталоге собственного проекта.:-)
Типичные вещи, которые у меня всегда есть, — это lib|src, bin, test.
(Мне не нравятся эти генераторы монстров:Первое, что я хочу сделать с новым проектом, это написать некоторый код, а не писать README, документацию и т. д.!)
Поэтому я выбрал NewGem.Я удалил все ненужные вещи RubyForge/gem (мотыга, настройка и т. д.), создал репозиторий git, импортировал проект в NetBeans.Все заняло 20 минут и все горит зеленым.Это даже дало мне базовую задачу по сбору спецификационных файлов.
Спасибо вам всем.