Доступ к файлам, упакованным в Ruby Gem
У меня есть расширение Buildr, которое я упаковываю как драгоценный камень. У меня есть коллекция скриптов, которые я хочу добавить в пакет. В настоящее время эти скрипты хранятся в виде большого текстового блока, который я записываю в файл. Я бы предпочел иметь отдельные файлы, которые я могу копировать напрямую или читать / записывать обратно. Я хотел бы, чтобы эти файлы были упакованы в драгоценный камень. У меня нет проблем с их упаковкой (просто вставьте их в файловую систему rake install
) но я не могу понять, как получить к ним доступ. Есть ли вещь типа пакета Gem Resources?
2 ответа
Есть в основном два пути,
1) Вы можете загрузить ресурсы, относящиеся к файлу Ruby в вашем геме, используя __FILE__
:
def path_to_resources
File.join(File.dirname(File.expand_path(__FILE__)), '../path/to/resources')
end
2) Вы можете добавить произвольные пути из вашего Gem в $LOAD_PATH
переменная, а затем ходить $LOAD_PATH
найти ресурсы, например,
Gem::Specification.new do |spec|
spec.name = 'the-name-of-your-gem'
spec.version ='0.0.1'
# this is important - it specifies which files to include in the gem.
spec.files = Dir.glob("lib/**/*") + %w{History.txt Manifest.txt} +
Dir.glob("path/to/resources/**/*")
# If you have resources in other directories than 'lib'
spec.require_paths << 'path/to/resources'
# optional, but useful to your users
spec.summary = "A more longwinded description of your gem"
spec.author = 'Your Name'
spec.email = 'you@yourdomain.com'
spec.homepage = 'http://www.yourpage.com'
# you did document with RDoc, right?
spec.has_rdoc = true
# if you have any dependencies on other gems, list them thusly
spec.add_dependency('hpricot')
spec.add_dependency('log4r', '>= 1.0.5')
end
а потом,
$LOAD_PATH.each { |dir| ... look for resources relative to dir ... }
Вот что я сделал, используя Ruby 3.1.1:
gem_path = Gem::Specification.find_by_name('gem_name').full_gem_path
js_path = File.join(gem_path, 'path/to/file/file.js')
js = File.read(js_path)
Это работает даже для кода внутриgem_name
.