Я создал экспериментальный веб-сайт с использованием Rails ver. 4.2.5.1 на Linux-системе CentOS 6.6. Я следовал руководству «Начало работы с Rails» и руководству по сборке Weblog, а затем внес изменения для использования SSL и запуска в рабочем режиме.
Чтобы предварительно скомпилировать активы (javascript и изображения), я запустил «rake assets:clobber», чтобы удалить предыдущие кешированные результаты, а затем «rake assets: precompile». Это создает «отпечатки пальцев» имен файлов (длинная шестнадцатеричная строка (хеш MD5?), связанная с исходными именами файлов) и отбрасывает скомпилированные ресурсы в каталог ../Weblog/public/assets.
Процесс «assets:precompile» задокументирован в документации Rails «Asset Pipeline» и документации Sprockets. Документация, которой я следовал, находится по адресу:
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
https://github.com/rails/sprockets-rails
Файл "production.rb", сгенерированный по умолчанию с использованием методов, описанных в руководстве "Начало работы с Rails", похоже, не работает. Я запускаю сервер WEBrick rails, используя двухстрочный файл сценария, а именно:
export SSL=true
rails server -b 0.0.0.0 -p 3000 -e production
Я хотел использовать функцию assets:precompile, и чтобы это работало, я внес изменения в файл «config/application.rb» в соответствии с документацией sprockets-rails и включил строку:
требуют «звездочки / рельсы»
Мне также пришлось внести изменения в файл «config/environments/production.rb». Версия файла по умолчанию имела:
# Compress JavaScripts and CSS.
config.assets.js_compressor = :uglifier
# config.assets.css_compressor = :sass
Обратите внимание, что строка :uglifier была активной, а строка :sass закомментирована.
В файле production.rb по умолчанию также была эта строка:
# Do not fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
Что мне нужно было сделать, чтобы сервер WEBrick действительно работал с ресурсами предварительной компиляции в рабочем режиме из коробки Linux, так это вызвать css_compessor и закомментировать строку «config.assets.compile = false», а не переключать ее. . (Если активы уже предварительно скомпилированы локально, то мне не нужно или я не хочу их компилировать вживую, как я предполагаю)
Изменения в файле config/production.rb, позволяющие веб-серверу производственного режима работать в системе CentOS, следующие:
# Compress JavaScripts and CSS.
# config.assets.js_compressor = :uglifier
config.assets.css_compressor = :sass
# Do not fallback to assets pipeline if a precompiled asset is missed
# config.assets.compile = false
И это, кажется, делает это. Без этих изменений изображения не отображались бы в браузере (Firefox 44 для Windows/Safari для iOS/Firefox для Android 5.1.1), а ссылка «Удалить» (для вызова метода удаления и удаления статьи из базы данных статей) не будет вызывать диалоговое окно подтверждения или выполнять действие удаления. С указанными выше изменениями в production.rb все работает, поэтому, когда я запускаю сервер, отображаются файлы изображений, и javascript для фактического запуска процесса «Уничтожить/удалить» передается в браузер и на веб-сайт учебного веб-журнала. работает как положено. Но это не сработает, если «config.assets.js_compressor = :uglifier» включено (путем удаления комментария #), и не сработает, если «config.assets.compile = false» не закомментировано.
Насколько я могу судить, предварительная компиляция работает, и предварительно скомпилированные активы с информацией об отпечатках пальцев (длинная шестнадцатеричная строка MD5), добавленной к именам файлов файлов изображений, обслуживаются правильно, как и javascript. Я понимаю, что большинство развертываний приходится на Heroku и AWS, поэтому использование моего собственного оборудования для режима производства немного нестандартно для Rails с WEBrick, но мне любопытно, почему. Я пропустил какой-то необходимый шаг?
Есть ли другой (лучший?) способ предварительной компиляции ресурсов, предполагая, что производственный режим запускается на локальном компьютере с Linux? И есть ли очевидная причина, по которой ":uglifier" не работает? Спасибо.