我有多个商店,每个商店都是一个独立的项目。我需要的是一种方法来包含来自共享位置的钩子库中的公共钩子(在以下代码中,只有on_stylesheet_saved
。
config.rb看起来像这样:
http_path = "/"
css_dir = "public/css/live/"
sass_dir = "public/css/entrypoints"
images_dir = "public/library/images"
javascripts_dir = "public/library/javascript"
additional_import_paths = [ "public/library/css" ]
output_style = (environment == :production) ? :compressed : :expanded
relative_assets = false
if environment == :production
on_stylesheet_saved do |filename|
#do stuff
end
else
load 'temp.rb'
end
执行第load 'temp.rb'
行,但是当我更改scss文件时,内部的钩子不是:
on_stylesheet_saved do |filename|
puts "XXX #{filename}"
end
如何在不重复所有商店的代码的情况下正确加载此temp.rb
挂钩?
答案 0 :(得分:1)
要查看错误,我必须使用
require File.expand_path("temp", File.dirname(File.realpath(__FILE__)))
为了让它运转我已经使用了
eval(File.open(File.expand_path("temp.rb", File.dirname(File.realpath(__FILE__)))).read)
我希望这有助于某人。
我不喜欢eval
,我希望它在红宝石中被认为与我编程的语言一样糟糕,但它有效并且我已在{{{ 3}}
答案 1 :(得分:1)
根据评论,两个文件中的上下文可能不同。
在config.rb中查看p self
的方式:
#<Compass::Configuration::FileData:0x00000000af6a68 ...>
... main
中与temp.rb
的对比。
我建议两种选择之一:
以字符串形式阅读该文件,并eval
:eval str
以字符串形式阅读该文件,并instance_eval
:instance_eval str, __FILE__, __LINE__
在您的特定情况下,两者之间的差异并不重要,因为上下文是您已经定位的对象。除非您有兴趣获得可能发生ruby错误的精确文件和行。
但是,有关信息,instance_eval
,module_eval
和class_eval
提供了在需要时更改上下文的便捷方式:
class Foo; end
p self # main
Foo.new.instance_eval("p self") # a Foo instance
Foo.new.module_eval("p self") # undefined method
Foo.new.class_eval("p self") # undefined method
Foo.instance_eval("p self") # the Foo class
Foo.module_eval("p self") # the Foo class
Foo.class_eval("p self") # the Foo class
答案 2 :(得分:-2)
我不太清楚你的意思。你可以尝试翻转逻辑:
if environment == :production
on_stylesheet_saved do |filename|
#do stuff
end
else
load 'temp.rb'
end
并像这样写:
on_stylesheet_saved do |filename|
if environment == :production
# do production stuff
else
load 'temp.rb'
end
end