Некоторые ресурсы не загружаются в старом Rails 3-2-стабильном приложении - PullRequest
0 голосов
/ 30 октября 2018

БОЛЬШИЕ ОБНОВЛЕНИЯ НА ДНЕ ЭТОГО ПОЧТЫ

У меня есть Rails 3-2-стабильное приложение, которое я перевожу на новый сервер, так что я могу работать над его обновлением до Rails 5. В настоящее время оно размещено на Heroku, и большинство ресурсов отображаются просто отлично ( приложение Just Works (TM)). У меня есть несколько случайных активов, которые не появятся после прекомпиляции на капле Digital Ocean. Я разворачиваюсь с Капистрано.

Ошибка для активов, которые не отображаются, выглядит примерно так:

Loading failed for the <script> with source “http://stage.fancy-new-droplet.com/assets/application/application.js”.

В некоторых случаях с активом будет связан хеш, подобный этому:

Loading failed for the <script> with source “http://stage.fancy-new-droplet.com/assets/application/certifications-56046476595984b00d1267a4f02822e5.js

В первом случае актив фактически равен public/assets/, а не public/assets/application/ на капле. Перемещение или символическая ссылка отсутствующего ресурса в это место, похоже, ни на что не влияет. В последнем случае, насколько я могу судить, активов на капле просто не существует.

Для случая без хэшей в именах файлов, измените мои теги включения из этого:

<%= javascript_include_tag "application/application" %>

Примерно так:

<%= javascript_include_tag "application" %>

Решит проблему, но я чувствую, что это красная сельдь, учитывая другие активы, которые, кажется, не существуют после предварительной компиляции.

Я столкнулся с эзотерической проблемой, когда у капли не хватало памяти и она молча провалилась на полпути при компиляции ресурсов, но я увеличил доступную память, и теперь она даже не использует половину памяти. Тем не менее, максимальная загрузка процессора составляет 100%. Я могу попытаться увеличить процессор и память на капле.

Вот соответствующие строки компиляции активов из config/environments/production.rb:

  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.compile = true
  config.assets.digest = true

И соответствующие строки компиляции активов из application.rb:

config.assets.enabled = true
config.assets.version = '1.0'

Локально, все работает на 100% просто замечательно, без ошибок. Активы загружаются нормально и у нас все хорошо. Вот биты конвейера активов из моего development.rb файла:

  config.assets.compile = true
  config.assets.compress = false
  config.assets.debug = true

Я запускал различные комбинации rake assets:clean, rake assets:precompile и rake assets:precompile:all на рабочем сервере (в производственной среде), и я даже уничтожил папку public / assets /, чтобы запустить ее заново. , Все безрезультатно.

Что может привести к тому, что эти активы не будут созданы на нашей капельке, когда они действительно могут быть созданы на Heroku?

EDIT

Как я и просил, мой стек DO - это просто капелька (2vcpu, 2 Гб оперативной памяти), я использую Puma и Nginx. Вот мой Capfile:

# Load DSL and Setup Up Stages
require 'capistrano/setup'
require 'capistrano/deploy'

require 'capistrano/scm/git'
install_plugin Capistrano::SCM::Git

require 'capistrano/rails'
require 'capistrano/bundler'
require 'capistrano/rvm'
require 'capistrano/puma'

install_plugin Capistrano::Puma

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Я пару раз набрал config.assets.initialize_on_precompile пару раз в application.rb и пробовал различные перестановки rake assets:clean, assets:precompile и assets:precompile:all с RAILS_ENV=production локально безрезультатно.

ЕЩЕ ДРУГОЕ РЕДАКТИРОВАНИЕ

В этот момент я заметил, что предварительная компиляция производственных ресурсов, по-видимому, не компилирует четыре файла javascript и около семи файлов css. Кажется, он также не помещает application.js в public/assets/application/application.js (где приложение ищет), скорее он попадает в public/assets/application.js.

БОЛЬШЕ РЕДАКТИРОВ

Я решил проблему с загрузкой ресурсов JavaScript, исправив оператор require_tree в application.js, и теперь единственная проблема - несколько отсутствующих файлов CSS.

В этом приложении есть две директории с css-файлами:

  • app/assets/stylesheets/
  • app/assets/stylesheets/application

Всего имеется 21 таблица стилей, которые не загружаются из почти 100. Таблицы стилей, которые не загружаются, вызываются с хэшированным именем файла (somefile-hash.css), но эти хэшированные файлы не существуют в public/assets/ на капле.

Вот требования от application.css.scss:

/*
 *= require_self
 *= require chosen
 *= require jquery-ui/autocomplete
 *= require jquery-ui/datepicker
 *= require feature-carousel
 *= require_tree .
 */

Из-за разочарования я добавил = require_directory ./assets в этот список, и теперь у меня только около 15 таблиц стилей, которые не могут быть скомпилированы / загружены. Такое поведение не имеет для меня никакого смысла, так как я предположил, что = require_tree . охватил бы подкаталог Wonky.

Индивидуально определяемые файлы = require foo или = require foo.css.scss, похоже, тоже ни на что не влияют.

Я также поднял config.assets.version от разочарования, но безрезультатно.

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

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Просто изменить это на вашем production.rb должно работать:

config.serve_static_assets = true
0 голосов
/ 01 ноября 2018

Конвейер ресурсов объединяет ваши активы, чтобы по умолчанию генерировать и обслуживать только указанные файлы, application.js, application.css и images / fonts.

Если вы явно включаете другие файлы css / js в свое приложение с помощью помощников javascript_include_tag или stylesheet_link_tag, вам нужно будет добавить эти файлы вручную в конвейер с помощью параметра config.assets.precompile += в application.rb. или инициализатор.

В настоящее время эти файлы уже должны быть включены в манифест application с помощью директивы require_tree .. Таким образом, стили могут быть применены и сейчас. Если это так, вы можете просто удалить свой код, который добавляет отдельные таблицы стилей отдельно, чтобы избавиться от 404-х.

До сих пор не уверен, как приложение работает на heroku, возможно, у вас есть какой-то конфигурационный файл heroku, который позволяет обслуживать статические ресурсы.

0 голосов
/ 30 октября 2018

Возможно, попробуйте изменить их в production.rb, но никаких гарантий, возможно, стоит попробовать.

config.serve_static_files = true
config.assets.compile = false

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

gem 'rails_12factor', group: :production

Это требуется Героку, но вам может не понадобиться это на ДО. Смотри https://github.com/heroku/rails_12factor

Также, пожалуйста, если вы можете опубликовать более актуальную информацию о вашем стеке DO и, возможно, вашем Capfile

...