БОЛЬШИЕ ОБНОВЛЕНИЯ НА ДНЕ ЭТОГО ПОЧТЫ
У меня есть 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
от разочарования, но безрезультатно.
И, кроме того, никакие нецензурные выражения не могут убедить эти ресурсы скомпилировать.