8

我以前多次使用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'] %>
4

2 回答 2

0

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

例如:

rake assets:precompile RAILS_ENV=production

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

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

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

于 2014-03-20T02:28:28.017 回答
0

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

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

我仍然无法使用multi_jsongem 的最新版本,所以我将它降级到 1.7.8 并且它工作正常。

gem 'multi_json', '1.7.8'

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

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

/public/assets/manifest.json 

或自己指定

config.assets.manifest = '...'

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

干杯!

于 2014-04-13T06:28:18.207 回答