В этом месяце я обновил 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.