在请求期间创建新样式表,然后立即要求它会产生错误

时间:2019-06-14 03:34:18

标签: sprockets rails-sprockets

似乎Sprockets内置了一个缓存环境,该环境在请求开始时加载所有可能资产的列表,然后要求该列表之外的任何资产都会引发错误。

我已经编写了一个自定义指令来创建新的CSS文件-我需要将现有文件的内容包装在新的选择器中-像这样:

class DirectiveProcessor < Sprockets::DirectiveProcessor
  def process_wrap_directive(path)
    src = Rails.root.join("app", "assets", "stylesheets", path)
    dst = Rails.root.join("app", "assets", "stylesheets", "wrapped", path)
    File.write(dst, ".new-selector {" + File.read(src) + "}")
    process_require_directive("wrapped/" + path)
  end
end 

但是,要求新包装的资产失败,因为它不在Sprockets知道的文件列表中。刷新页面时,第一个资产将成功,因为它现在已存在于请求的开头,因此位于缓存列表中,但是第二个资产将失败,依此类推。

有什么办法可以解决这个问题?禁用缓存无法解决问题。

我猜想它与这段代码https://github.com/rails/sprockets-rails/pull/197/files有关-但是除了重新打开一堆类之外,还有什么方法可以避免缓存的环境?

1 个答案:

答案 0 :(得分:0)

问题可能是需要刷新文件,以便实际写入新选择器。关于https://ruby-doc.org/core-2.6.3/IO.html(IO对象是File的父对象),看来File.closeFile.flush都可以解决问题。