Как переопределить отдельные файлы из активов драгоценных камней для активов: прекомпилировать?
Ситуация
Я использую драгоценный камень, который приносит свои собственные 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 стиль). Но я ищу здесь более чистое решение.
Ответы
Ответ 1
В демо-коде, опубликованном в на GitHub, ваш application.js имеет:
//= require any_gem
Это не приводит к каталогу, он вносит any_gem.js
, который является файлом манифеста Gem, который содержит все JS файлы Gem. Если вам не нужны все файлы, вам необходимо изменить это, чтобы вывести только нужные файлы, указав их явно:
//= require ../../../vendor/assets/javascripts/any_gem/do_not_override.js
Затем вы можете добавить обратно во все свои JS файлы, включая ваши переопределения, с помощью
//= require_tree .
BTW, отличная работа по созданию демонстрационного приложения! Вы - образец для подражания для детей.
Ответ 2
В application.rb
или production.rb
вы можете добавить или добавить путь к ресурсам.
config.assets.prepend_path 'vendor/assets/jquery'
config.assets.append_path 'vendor/assets/something'
Литература: