Как переопределить отдельные файлы из активов драгоценных камней для активов: прекомпилировать?

Ситуация

Я использую драгоценный камень, который приносит свои собственные 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, отличная работа по созданию демонстрационного приложения! Вы - образец для подражания для детей.