Создание новой таблицы стилей во время запроса, а затем немедленное требование дает ошибку - PullRequest
2 голосов
/ 14 июня 2019

Кажется, что 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 голосов
/ 22 июня 2019

Проблема может заключаться в необходимости очистки файла, чтобы новый селектор был действительно записан.Со ссылкой на https://ruby -doc.org / core-2.6.3 / IO.html (объект IO является родителем файла), кажется, что либо File.close, либо File.flush может решить проблему.

...