Не удается настроить ресурсы через конвейер на локальном сервере rails 3.1.3 - PullRequest
0 голосов
/ 18 января 2012

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

У меня есть полностью заполненный каталог public/assets, созданный с помощью команды bundle exec rake assets:precompile, выполнение которого на моем старом ноутбуке (5 лет) занимает около 20 минут, вероятно, что-то связанное с этим регулярным выражением «catch all» перед компиляцией, хотя с этой строкой комментариев она все же занимает более 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.

Ответы [ 2 ]

1 голос
/ 19 января 2012

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

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

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

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

1 голос
/ 19 января 2012

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

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

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

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

...