Как включить файлы данных в Ruby Gem? - PullRequest
9 голосов
/ 27 июня 2010

Я работаю над гемом Ruby, который использует настраиваемые «шаблоны» для генерации HTML.Я хочу включить в набор базовый набор шаблонов и позволить пользователям переопределять их с помощью более качественных / более индивидуальных шаблонов.Эти шаблоны не являются кодом Ruby, они представляют собой «просто файлы», которые необходимо прочитать с диска в какой-то момент кода.

Я просмотрел документацию по RubyGems, но они делают (не совсем необоснованным)Предположение, что драгоценный камень содержит только код (хорошо, с некоторой документацией и определенными файлами метаданных, добавленными для хорошей меры).Нет ссылки на то, как создать эквивалент файлов "/ usr / share / ...".

Как лучше всего включать такие файлы в гем?Должен ли я просто включить их как часть «источников»?Если да, то как мне найти их путь, чтобы я мог прочитать их с диска в процессор шаблонов?

1 Ответ

10 голосов
/ 27 апреля 2011

Предположим, у вас есть такая структура проекта:

bin/
|__ foobar*
lib/
|__ foobar/
|   |__ templates/
|   |   |__ a/
|   |   |__ b/
|___|__ meta.rb
|___|__ utils.rb

В каталоге lib/foobar/teplates у вас есть каталоги шаблонов или файлы.

lib/foobar/meta.rb файл содержит название вашего проекта и его версия. Важно сохранить их (особенно номер версии) синхронизируется с именем и версией проекта в вашей жемчужине Спецификация. (Лучший способ сделать это - прочитать meta.rb из Rakefile передать значения в спецификацию.)

Например, meta.rb может выглядеть так:

module Foobar
  module Meta
    NAME = 'foobar'
    VERSION = '0.1.2'
  end
end

Затем напишите функцию, которая возвращает полный путь к каталогу lib. независимо от того, тестируете ли вы свой проект из источников каталог или проект устанавливается из рубинов.

utils.rb

require_relative 'meta'

module Foobar
  module Utils

    # Return a directory with the project libraries.
    def self.gem_libdir
      t = ["#{File.dirname(File.expand_path($0))}/../lib/#{Meta::NAME}",
           "#{Gem.dir}/gems/#{Meta::NAME}-#{Meta::VERSION}/lib/#{Meta::NAME}"]
      t.each {|i| return i if File.readable?(i) }
      raise "both paths are invalid: #{t}"
    end

    # [...]
  end
end

Имея функцию Foobar::Utils.gem_libdir, вы всегда можете прочитать ваши шаблоны в bin/foobar файле:

require_relative '../lib/foobar/utils'

puts Dir[Foobar::Utils.gem_libdir + '/*']
puts Foobar::Utils.gem_libdir + '/templates/a/blah-blah'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...