Проблемы с Asset Pipeline при развертывании (производственный режим) - PullRequest
3 голосов
/ 25 сентября 2011

Я только что перешел с Ruby on Rails 3.0.10 на 3.1.0, и я использую jQuery UI 1.8.14. У меня проблема с загрузкой css файлов в режиме production на удаленной машине.

В моем app/views/layouts/application.html.erb файле у меня есть:

<%= stylesheet_link_tag 'application', 'jquery-ui-1.8.14.custom', 'jquery-ui-1.8.14.custom_redefinition' %>
<%= javascript_include_tag 'application' %>

Примечание: файл jquery-ui-1.8.14.custom - это файл CSS, созданный с помощью Theme Roller , а jquery-ui-1.8.14.custom_redefinition - это мой файл "пользовательского переопределения", который переопределяет некоторые классы CSS. Эти файлы (оба с расширением .css) расположены по адресу vendor/assets/stylesheets.

В режиме development на моем локальном компьютере все работает, но когда я развертываю Capistrano на удаленном компьютере, он больше не работает. То есть файлы, связанные с пользовательским интерфейсом jQuery, не загружаются должным образом: если я пытаюсь получить к ним доступ, их содержимое пустое \ пустое (я вижу это в исходном HTML-коде, созданном для веб-страниц моего приложения).

Как я могу это решить?


На данный момент в моем файле config/environments/production.rb есть:

# Compress JavaScripts and CSS
config.assets.compress = true

# Don't fallback to assets pipeline if a precompiled asset is missed
#
# Note: Since, at this time, the asset Pipeline doesn't work for me I am 
# following the "Live Compilation" approach (more info at
# http://guides.rubyonrails.org/asset_pipeline.html#in-production)
config.assets.compile = true

# Generate digests for assets URLs
config.assets.digest = true

В моем app/assets/stylesheets/application.css.scss файле у меня есть:

/*
 *= require_self
 *= require_tree .
*/

В моем app/assets/stylesheets/application.js файле у меня есть:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree .

Перед развертыванием на локальном компьютере я запускаю следующую команду:

bundle exec rake assets:precompile

Примечание : если я запускаю указанную выше команду, jquery-ui-1.8.14.custom и jquery-ui-1.8.14.custom_redefinition файлы создаются в каталоге public/assets, как и ожидалось.


Возможно, проблема связана с оператором require_tree . в файле app/assets/stylesheets/application.css.scss, который не загружает файлы, присутствующие в каталоге vendor/assets/stylesheets.

1 Ответ

7 голосов
/ 26 сентября 2011

Здесь есть несколько вопросов, и я буду разбираться с каждым по отдельности.

Почему это не работает

Существуют различия в способе, которым активыдоступ в режимах производства и разработки с включенным дайджестом.В разработке все работает как обычно.Sprockets обслуживает вещи в app / assets с их непереваренными именами файлов.Это работает почти так же, как если бы Sprockets там не было, но помните, что / assets - это точка монтирования (Sprockets - это движок Rails), поэтому все файлы под этим обслуживаются - Sprockets.

В производстве используются имена файлов с дайджестами, поэтому Sprockets ожидает, что эти имена будут запрашиваться вместо оригиналов.Они фактически скрыты за точкой монтирования / assets

Как это исправить

Первое, что нужно обновить - это application.css:

/*
 *= require_self
 *= require jquery-ui-1.8.14.custom'
 *= jquery-ui-1.8.14.custom_redefinition:
*/

и тег ссылки на таблицу стилей:

<%= stylesheet_link_tag 'application' -%>

Это гарантирует, что ваш CSS подается (и компилируется) в один файл.Когда вы запускаете прекомпиляцию, файлы пользовательского интерфейса попадают в каталог / assets из-за ошибки в Rails, поэтому не стоит полагаться на это (это будет исправлено в Rails 3.1.2)

Второе, что вам нужнодля этого нужно переместить ваши изображения (если вы этого еще не сделали) в assets / images.

Третье - добавить расширение .erb к файлам пользовательского интерфейса в папке стилей:

jquery-ui-1.8.14.custom.css.erb

Последнее, что нужно, - изменить все ссылки на изображения в файлах CSS для использования помощника asset_path.Отсюда:

url(images/ui-bg_gloss-wave_35_f6a828_500x100.png)

до этого:

url (<% = asset_path ('ui-bg_gloss-wave_35_f6a828_500x100.png')%>)

Запустите это в режиме разработки в качестве теста - он должен нормально работать.

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

Для производства вещи становятся немного сложнее.Вы должны придерживаться настроек по умолчанию, то есть прекомпилировать все ресурсы в публичный каталог / assets.

Я бы проверил последний раздел направляющих конвейера и убедился, что все вашифайлы конфигурации соответствуют настройкам в примерах.

Самое последнее - убедиться, что у вас есть настройки Capistrano для запуска задания прекомпиляции.Обратитесь к разделу precompile assets в руководстве, чтобы узнать, как его настроить.

Это должно снова помочь.

Вы можете (в качестве альтернативыиспользуйте конвейер для этих изображений) переместите файлы пользовательского интерфейса в каталог / public и получите к ним доступ из CSS.Вам нужно будет изменить все ссылки на изображения.Так как вы все равно должны их изменить, я бы придерживался конвейерного пути.

...