【问题标题】:Creating a new stylesheet during a request and then immediately requiring it gives an error在请求期间创建新样式表然后立即要求它会产生错误
【发布时间】:2019-06-14 03:34:18
【问题描述】:

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

【问题讨论】:

  • 调用@environment.append_path(dst)怎么样?
  • @OluwafemiSule 不幸的是,缓存环境似乎是不可变的 - 至少,这给了我一个 RuntimeError “无法修改不可变缓存环境”。

标签: sprockets rails-sprockets


【解决方案1】:

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

【讨论】:

  • 很遗憾,情况并非如此——文件写入成功,但 Sprockets 维护了一个文件列表,而新文件不在列表中。
猜你喜欢
  • 2021-03-13
  • 2022-01-13
  • 2019-09-25
  • 2017-05-09
  • 1970-01-01
  • 2021-12-27
  • 2017-11-24
  • 1970-01-01
  • 2019-07-17
相关资源
最近更新 更多