Ситуация
Я использую драгоценный камень, который приносит свои собственные 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
.
Demo
См. поведение в действии с помощью этого тестового приложения: https://github.com/widescape/AssetCompileTest
Вопросы
До сих пор я узнал, что require_tree
ищет файлы только в каталоге текущего файла и не просматривает несколько путей загрузки (например, app/assets или vendor/assets). Поэтому, если текущий файл [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 стиль). Но я ищу здесь более чистое решение.