我正在研究一个Ruby gem,它使用可配置的"模板"来生成HTML.我想在gem中包含一组基本模板,并允许用户使用更好/更自定义的模板覆盖它们.这些模板不是Ruby代码,它们只是需要在代码中的某个时刻从磁盘读取的"文件".
我查看了RubyGems文档,但是他们做出了(并非完全不合理)的假设,即gem只包含代码(好的,有一些文档和特定的元数据文件可以用来衡量).没有提到如何创建"/ usr/share/..."文件的等价物.
在gem中包含此类文件的最佳做法是什么?我应该简单地将它们作为"来源"的一部分吗?如果是这样,我如何发现它们的路径,以便我可以将它们从磁盘读入模板处理器?
Ale*_*sky 10
假设您有一个这样的项目结构:
bin/
|__ foobar*
lib/
|__ foobar/
| |__ templates/
| | |__ a/
| | |__ b/
|___|__ meta.rb
|___|__ utils.rb
Run Code Online (Sandbox Code Playgroud)
在lib/foobar/teplates目录中,您有模板目录或文件.
lib/foobar/meta.rbfile包含项目名称及其版本.保持它们(特别是版本号)与gem规范中的项目名称和版本同步很重要.(执行此操作的最佳方法是meta.rb从Rakefile 读取以将值传递给规范.)
例如,meta.rb可能看起来像:
module Foobar
module Meta
NAME = 'foobar'
VERSION = '0.1.2'
end
end
Run Code Online (Sandbox Code Playgroud)
然后编写一个返回lib目录完整路径的函数,无论您是从sources目录测试项目还是从rubygems安装项目.
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
Run Code Online (Sandbox Code Playgroud)
有了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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2837 次 |
| 最近记录: |