Ситуация
Я использую гем, который имеет свой собственный JavaScript и ресурсы таблицы стилей. Этот драгоценный камень использует стандартный манифест application.js и application.css, чтобы потребовать все свои активы:
[gem]/app/assets/javascripts/gem_name/application.js
require_tree .
[gem]/app/assets/javascripts/gem_name/backoffice/menu.js
… some JavaScript code …
[gem]/app/assets/javascripts/gem_name/backoffice/forms.js
… some JavaScript code …
В режиме разработки я могу переопределить отдельные файлы активов, поместив их в папку [my_app]/app/assets
, например:
[my_app]/app/assets/javascripts/gem_name/backoffice/menu.js
Пути загрузки, настроенные в Rails, гарантируют, что файлы в [my_app]/app/assets
переопределяют файлы в [gem]/app/assets
.
Но когда я прекомпилирую ресурсы с помощью rake assets:precompile
, переопределяющий файл menu.js
не заменяет исходный файл из драгоценного камня. Скомпилированный application.js
содержит код исходного menu.js
.
Демо
Посмотрите, как работает это тестовое приложение: https://github.com/widescape/AssetCompileTest.
Соображения
На данный момент я обнаружил, что require_tree
ищет файлы только в каталоге текущего файла и не просматривает несколько путей загрузки (например, приложение/активы или поставщик/активы). ). Таким образом, если текущий файл [gem]/app/assets/javascripts/gem_name/application.js
, Sprockets#require_tree
будет искать дополнительные файлы только в [gem]/app/assets/javascripts/gem_name/
и не использовать другие пути загрузки, такие как [my_app]/app/assets/…
.
Я не хочу копировать все файлы активов из драгоценного камня в свое приложение/активы только для переопределения одного файла. И разветвление драгоценного камня для настройки одного файла тоже не очень привлекательно.
Есть ли другой способ?
Примечание. Я знаю, что могу создать собственный файл JavaScript menu_patched.js
, который переопределяет объекты и методы, определенные в исходном файле, и поместить его таким образом, чтобы его определения применялись до вызова исходных объектов и методов. (обезьяна исправляет стиль JavaScript). Но я ищу более чистое решение здесь.