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 - 但是没有重新打开一堆类,有没有办法避免缓存环境?