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