Невозможно сконфигурировать активы по конвейеру на локальных рельсах производства 3.1.3 сервер

В этом месяце я обновился с Rails 3.0 до Rails 3.1 - на этой неделе я попытался запустить сервер в режиме производства - сегодня я ударил стену!

Я не могу заставить сервер своей производственной среды обслуживать мои публичные активы (JavaScript и CSS) через конвейер активов, если я не установил config.assets.compile = true в файле environment.rb, что по причинам скорости я, очевидно, не хочу сделать.

У меня есть большое количество файлов JS и CSS, каждый из которых имеет тенденцию использоваться на одной или двух разных страницах. Это означает, что создание одного файла "манифеста" не подходит для моего использования, так как каждая страница хочет чего-то немного другого. Я также ожидаю, что некоторые из CSS не будут сидеть вместе красиво. Поэтому я подошел к подходу "просто заработал", пытаясь уберечь большое количество CSS/JS позже.

Вот файл production.rb:

Implicit::Application.configure do
  ...

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # I set this to true, as I am testing this locally, just running a local Thin server
  config.serve_static_assets = true

  config.assets.compress = true

  # Setting this to false removes the issue - but is SLOW
  config.assets.compile = true

  config.assets.digest = true

  # This is overkill - but does get EVERYTHING precompiled for now
  config.assets.precompile += %w( *.css *.js )

  config.action_dispatch.x_sendfile_header = nil
  ...
end

Это для меня совершенно новая область, поэтому я потратил много времени на то, чтобы переключить эти логические точки и остановить/запустить локальный сервер Thin/Rails, чтобы попробовать их. Но единственное значение, которое сделало существенную разницу, - это флаг компиляции.

Мой файл application.rb в значительной степени стандартный, и в нем есть config.assets.enabled = true и config.assets.initialize_on_precompile = false, последний из сообщения heroku (и предположения, снова).

У меня есть полностью заполненный каталог public/assets, созданный с помощью команды bundle exec rake assets:precompile, которая занимает около 20 минут для работы на моем старом ноутбуке (5 лет), вероятно, что-то общее с этим "уловить все" предкомпиляционное регулярное выражение, хотя с этой строкой прокомментировал это все еще занимает более 10 минут (!)

С флагом компиляции, установленным в true, я могу видеть, что копии этих активов, созданных в моем каталоге /tmp/cache, - это явно приложение, создающее его собственную "скомпилированную копию" активов.

С флагом компиляции, установленным в false, я столкнулся с сообщением об ошибке (в журналах, если я не задал запросы локальным, а затем я вижу это на странице с отображенной ошибкой) jquery.reveal isn't precompiled. Однако, когда я перехожу к http://localhost:3000/assets/jquery.reveal.js, файл javascript подается вверх.

Строка моего макета приложения, вызывающая это:

<%= javascript_include_tag "application", "jquery.reveal" %>

Я попытался изменить этот jquery.reveal на jquery.reveal.js без изменений. Удаление его исправляет страницу индекса, за исключением того, что функциональность jquery.reveal ушла, конечно! Таким образом, приложение application.js корректно подано. Я просто не могу понять, почему jquery.reveal нет, так как я вижу предварительно скомпилированные файлы в каталоге public/assets.

Ответ 1

Это интересная проблема, и я думаю, что могут быть две ошибки - та, которую вы связали, а другая: файл компилируется с неправильным именем. Возможно, стоит попробовать создать минимальный тестовый пример, который вы можете отправить с сообщением об ошибке.

Обходной путь для этого - и я подозреваю, что именно поэтому у немногих людей, похоже, есть проблема - это использовать вторичный манифест (связывание библиотек только через манифест, кажется, является развивающейся лучшей практикой).

Создайте один под названием home.js и потребуйте только одного его файла.

Это не плохой подход в целом. Эти дополнительные манифестации должны быть добавлены в массив прекомпиляции (см. Руководство) и позволяют нескольким библиотекам делиться несколькими страницами или разделами без необходимости связывать их каждый раз.

Ответ 2

Отвечая на мой собственный вопрос здесь, но похоже, что это может быть ошибка при анализе активов с "периодами", такими как jquery.reveal

Отчет о проблеме (https://github.com/rails/rails/issues/3398) сообщает об этом и выделяет фиксацию (https://github.com/sstephenson/sprockets/commit/4ba5b32764a9073671df5e77355df6ed2bb3d3c9), которая возникает сразу после Sprockets 2.0.3 - версия по умолчанию, на которую полагаются рельсы 3.1.3. Таким образом, Upgrading Sprocket будет включать перемещение на 3.2-стабильные рельсы - бит для кровопускания для этого новичка!

Но отчет об ошибке говорит, что это происходит только тогда, когда config.assets.compile = true - и я видел, хотя это было в моем коде, что jquery.reveal динамически компилировался в jquery-8fu... 8g.reveal.js( вместо jquery.reveal-8fu... 8g.js).

Так что, возможно, это НЕ ответ. По крайней мере, я надеюсь, что это не так. Но, безусловно, мы продолжим рассматривать этот период, так как "непериодические" файлы, содержащие файлы CSS/JS, до сих пор отлично отлажены, насколько я могу судить.