从指南针重新使用钩子' config.rb

时间:2014-12-05 12:30:10

标签: ruby compass

我有多个商店,每个商店都是一个独立的项目。我需要的是一种方法来包含来自共享位置的钩子库中的公共钩子(在以下代码中,只有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挂钩?

PS:项目不是红宝石,我不是红宝石程序员。代码库中等大小,超过300k LOC,所以没有大的重构问题。我们只是使用罗盘作为工具。

3 个答案:

答案 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的对比。

我建议两种选择之一:

  1. 以字符串形式阅读该文件,并evaleval str

  2. 以字符串形式阅读该文件,并instance_evalinstance_eval str, __FILE__, __LINE__

  3. 在您的特定情况下,两者之间的差异并不重要,因为上下文是您已经定位的对象。除非您有兴趣获得可能发生ruby错误的精确文件和行。

    但是,有关信息,instance_evalmodule_evalclass_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