【问题标题】:Rails 4.0.3 generating incorrect asset paths with asset_syncRails 4.0.3 使用asset_sync 生成不正确的资产路径
【发布时间】:2014-04-09 14:54:59
【问题描述】:

我之前曾多次使用asset_sync gem并取得了巨大的成功,但在Rails 4.0.3项目中使用它似乎引起了问题。

资产已上传、散列并压缩到目标目录(我只是使用默认的“资产”),但在暂存/生产环境中运行应用程序时,路径不正确。

他们采取以下形式:

S3_DOMAIN.com/stylesheets/application.css

代替:

S3_DOMAIN.com/assets/application-HASH.css

有没有其他人遇到过这个问题?我发现扭转这种行为的唯一方法是将 config.assets.compile 设置为 true,但这在生产环境中是行不通的。

以下是相关配置文件:

  ## environments/staging.rb
  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.js_compressor = :uglifier
  config.assets.css_compressor = :sass
  # Have to set this to true to make asset_sync generate the correct links
  config.assets.compile = false
  config.assets.digest = true
  config.assets.enabled = true
  config.assets.initialize_on_precompile = true
  config.action_controller.asset_host = "//#{Figaro.env.fog_directory}.s3.amazonaws.com"
  config.action_mailer.asset_host = "//#{Figaro.env.fog_directory}.s3.amazonaws.com"
  config.assets.prefix = "/assets"
  config.assets.debug = false
  config.assets.cache_store = :memory_store

##config/asset_sync.yml
defaults: &defaults
  fog_provider: 'AWS'
  aws_access_key_id: "<%= ENV['AWS_ACCESS_KEY_ID'] %>"
  aws_secret_access_key: "<%= ENV['AWS_SECRET_ACCESS_KEY'] %>"
  # To use AWS reduced redundancy storage.
  # aws_reduced_redundancy: true
  # You may need to specify what region your storage bucket is in
  fog_region: <%= ENV['FOG_REGION'] %>
  existing_remote_files: keep
  # To delete existing remote files.
  # existing_remote_files: delete
  # Automatically replace files with their equivalent gzip compressed version
  gzip_compression: true
  # Fail silently.  Useful for environments such as Heroku
  # fail_silently: true

development:
  <<: *defaults
  enabled: false

test:
  <<: *defaults
  enabled: false

staging:
  <<: *defaults
  fog_directory: <%= ENV['FOG_DIRECTORY'] %>

production:
  <<: *defaults
  fog_directory: <%= ENV['FOG_DIRECTORY'] %>

【问题讨论】:

  • 我在生产环境中也遇到了类似的问题...希望尽快解决
  • 我也有同样的问题...你有没有搞清楚?

标签: ruby-on-rails ruby ruby-on-rails-4 asset-pipeline asset-sync


【解决方案1】:

希望这将帮助我的程序员朋友们免去一些麻烦:D。我已经在“digest_path & asset_digest_path not allowing digest URLs”上回答了这个问题,但会在这里重新发布,这样可以为您节省一些点击次数。

我正在将文件上传到 S3,但我没有意识到 Rails 没有加载清单。您可以正确设置所有生产设置(如上面和其他线程中),但如果您没有 Rails 可读的 manifest.json 文件,它仍会生成 /javascript/*(示例)url。

我在使用multi_json gem 的最新版本时仍然遇到问题,所以我将它降级到 1.7.8 并且它工作正常。

gem 'multi_json', '1.7.8'

这样它就可以读取rake assets:precompile 创建的manifest.json 文件。

在这个 sprockets 线程 https://github.com/rails/sprockets-rails/issues/107 上存在争论,关于您的清单文件应该在 git 中还是仅在部署脚本中,做最适合您的事情,只要确保它可以在以下位置找到:

/public/assets/manifest.json 

或自己指定

config.assets.manifest = '...'

这可能会或可能不会被贬低。

干杯!

【讨论】:

    【解决方案2】:

    您需要在 rails 4 中以 production 模式运行所有相关资产。

    例如:

    rake assets:precompile RAILS_ENV=production
    

    如果您在默认模式(开发)下运行它,哈希值会有所不同,因此 rails 会将哈希值放在一起。

    此外,您需要在启动服务器之前执行此操作,以便它找到文件。

    注意:我认为此更改是为了让您可以缓存开发中的资产。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多