Ситуация
Използвам скъпоценен камък, който носи собствен 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
не замества оригиналния файл от gem. Компилираният 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 стил). Но аз търся по-чисто решение тук.