Помощники активов Rails 5.2, не включая дайджесты отпечатков пальцев

Я занимаюсь обновлением нашего продукта с rails 4.1 до 5.2. Я зациклен на том, что кажется проблемой, связанной с конвейером активов. Когда я загружаю приложение в наш браузер, я вижу следующую ошибку в журнале сервера, и в приложении отсутствуют все стили и код javascript, которые у него обычно есть.

DEPRECATION WARNING: The asset application.js" is not present in the asset pipeline.Falling back to an asset that may be in the public folder.
This behavior is deprecated and will be removed.
To bypass the asset pipeline and preserve this behavior,
use the `skip_pipeline: true` option.

Когда я получаю файл index.html приложения, я вижу, что всем изображениям и URL-адресам javascript не хватает дайджеста отпечатков пальцев, который они должны иметь. Интересно, что у них есть тот же S3 assets_host, что и у нас, так что на самом деле они обрабатываются хелперами.

Для демонстрации у меня есть два сервера с одинаковой конфигурацией, но на одном работает 4.1, а на другом 5.2. В обоих случаях я использую S3 в качестве assets_host, и дайджест включен. Я выполнил следующие команды в своих консолях:

=== Rails 4 ===

Loading qatest environment (Rails 4.1.0)
irb(main):001:0> Rails.application.config.action_controller.asset_host
=> "https://redacted.s3.amazonaws.com"
irb(main):002:0> Rails.application.config.assets.digest
=> true
irb(main):003:0> ActionController::Base.helpers.asset_path('application.js')
=> "https://redacted.s3.amazonaws.com/assets/application-042f2014ca329c79c304ab1332557040d3f7b922247202f40c28acc950f30ef8.js"

=== Rails 5 ===
Loading sean environment (Rails 5.2.1)
irb(main):001:0> Rails.application.config.action_controller.asset_host
=> "https://redacted.s3.amazonaws.com"
irb(main):002:0> Rails.application.config.assets.digest
=> true
irb(main):003:0> ActionController::Base.helpers.asset_path('application.js')
=> "https://redacted.s3.amazonaws.com/application.js

По запросу, production.rb

require "#{File.dirname(__FILE__)}/includes/s3_assets"

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb

  config.eager_load = true

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = false

  # Log error messages when you accidentally call methods on nil.
  config.whiny_nils = false

  config.log_level = ENV['SHOW_SQL'] != 'false' ? :debug : :info

  # Show full error reports and disable caching
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    user_name: Rubber.config.email_username,
    password:  Rubber.config.email_password,
    address:   Rubber.config.email_server,
    port:      Rubber.config.email_port,
    enable_starttls_auto: true, # detects and uses STARTTLS
    authentication: 'login' # Mandrill supports 'plain' or 'login'
  }

  # Print deprecation notices to the Rails logger
  config.active_support.deprecation = :log

  # Only use best-standards-support built into browsers
  config.action_dispatch.best_standards_support = :builtin

  # Raise exception on mass assignment protection for Active Record models
  # config.active_record.mass_assignment_sanitizer = :strict

  # Log the query plan for queries taking more than this (works
  # with SQLite, MySQL, and PostgreSQL)
  # config.active_record.auto_explain_threshold_in_seconds = 0.5

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

  # Don't fall back to assets pipelin if a precompiled asset is
  # missed.
  config.assets.compile = false

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

  # Nginx will serve as an asset proxy to s3, where assets are
  # stored.
  config.serve_static_assets = false

  # instead of bundling the assets, include multiple css style includes
  config.assets.debug = true
  config.assets.logger = false

    # Enable serving of images, stylesheets, and JavaScripts from an asset server
  # NB: The exclusion of any protocol in the asset host declaration above will allow browsers to choose the transport mechanism on the fly.
  # So if your application is available under both HTTP and HTTPS the assets will be served to match.

  configure_s3_assets config

  config.action_controller.asset_host = "https://#{Rubber.config.s3_assets_bucket}.s3.amazonaws.com"


  config.action_mailer.default_url_options = { :host => Rubber.config.external_host }

  config.sequel.search_path = %w(public audit)
end

config/initializers/assets.rb

# Be sure to restart your server when you modify this file.

# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'

# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path

# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
# Rails.application.config.assets.precompile += %w( search.js )
Rails.application.config.assets.precompile += %w( *.js *.png *.eot *.woff *.ttf *.svg *.gif)

конфигурация/среды/включает/s3_assets.rb

def configure_s3_assets(config)
  # Do not compress assets
  config.assets.compress = false

  # Disable Rails's static asset server (Apache or nginx will already do this)
  config.serve_static_assets = false

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

  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
  config.assets.precompile += %w(
  )
  # find javascripts/ stylesheets/ -type f | sed 's/\.scss//' | sed 's/\.coffee//' |
  #    sed 's/^.*\/\///'| sort
  # defaults to application.js, application.css
  # application.css has home.css ?

  config.assets.precompile += %w(
    handlebars.js
    jquery-1.7.js
    json2.js
  )
end

person Sean Roy    schedule 23.08.2018    source источник
comment
Можете ли вы скопировать конфигурацию environments/production.rb? Кроме того, вы используете одно и то же место для размещения ресурсов с обоих серверов? может это как-то конфликтует. Я бы попробовал несколько вещей: запустить rake assets: precompile вручную на сервере, использовать локальное хранилище вместо amazon только для целей отладки и проверить журналы развертывания (возможно, там есть какая-то ошибка).   -  person arieljuod    schedule 24.08.2018
comment
Скопированы файлы production.rb, assets.rb и s3_assets.rb, которые включены в production.rb. Для размещения активов используются два разных сегмента, кроме того, активы с отпечатками пальцев загружаются в соответствующие места должным образом,   -  person Sean Roy    schedule 24.08.2018
comment
Вам следует немного почистить вашу конфигурацию. Например: в assets.rb вы добавили все файлы .js в assets.precompile, затем вы добавили больше ресурсов, оканчивающихся на .js, внутри configure_s3_assets, что также устанавливает множество конфигураций, которые уже установлены в production.rb, во всяком случае, я не не вижу здесь ничего плохого, кроме этих повторяющихся операторов конфигурации, я бы попробовал использовать другую конфигурацию s3 или перейти в локальное хранилище только для отладки (поэтому, если он работает без s3, проблема заключается в конфигурации s3, чтобы сузить варианты)   -  person arieljuod    schedule 24.08.2018


Ответы (1)


Покопавшись в коде sprockets, я обнаружил, что мой список распознавателей пуст. Я не уверен, чего не хватало в моей конфигурации, но я решил проблему, добавив следующее в config/application.rb

config.assets.resolve_with = [:manifest] // в производстве

config.assets.resolve_with = [:manifest, :environment] // в разработке

person Sean Roy    schedule 12.09.2018