为什么Heroku不使用好的manifest.yml

时间:2012-03-28 12:29:25

标签: ruby-on-rails heroku asset-pipeline cdn assets

我在Heroku上使用Rails 3.2.2和CDN(CloudFront)来托管资产。

我使用asset_sync gem尝试Heroku教程(https://devcenter.heroku.com/articles/cdn-asset-host-rails31)。

资产没有问题:预编译,我的所有资产都托管在我的S3存储桶上。

-->heroku run bundle exec rake assets:precompile                                                                                                                                                            
    Running bundle exec rake assets:precompile attached to terminal... up, run.1
    AssetSync: using default configuration from built-in initializer
    AssetSync: Syncing.
    Using: Manifest /app/public/assets/manifest.yml
    Uploading: assets/facebook_64-8cdc90984860efef829203e1e01aab10.png
    Uploading: assets/google_64-11634a6b4a219799449e7a7157f73387.png
    Uploading: assets/twitter_64-657ee379209d0bb998440421b499a6a2.png
    Uploading: assets/application-699d029330a2d095a9b59006a63a7b01.js
    Uploading: assets/application-2060c0efc074ae11265455479abfb6ff.css
    Uploading: assets/back_office-ccfdd79c9b296176087815c95607f540.css
    AssetSync: Done.

问题是Heroku试图访问一个糟糕的CSS文件:

<link href="http://s3.amazonaws.com/annoncestest/assets/application-85cc4376a5de3b224db7c0548a44e7cb.css" media="all" rel="stylesheet" type="text/css" />

正如您所看到的,应用程序CSS的MD5不一样。

然而,JS文件或其他非CSS文件的资产没有问题。

在我的桶上,manifest.yml引用了好文件<link href="http://s3.amazonaws.com/annoncestest/assets/application-85cc4376a5de3b224db7c0548a44e7cb.css" media="all" rel="stylesheet" type="text/css" /> 但Heroku总是试图访问application-2060c0efc074ae11265455479abfb6ff.css

我尝试使用:

在production.rb中设置清单路径

application-85cc4376a5de3b224db7c0548a44e7cb.css 要么 config.assets.manifest = "http://myapp.cloudfront.net/assets"

每次css文件都不好。

我不知道问题是什么。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

由于heroku的支持,我解决了这个问题。

首先,我的部署运行不顺利,因为我在rake资产中遇到了一个着名的问题:预编译

could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port xxxx?

要防止这种情况,您需要在config / application.rb中设置initialize_on_precompile为false(不在config / environments / production.rb中):

config.assets.initialize_on_precompile = false

之后部署预编译似乎工作但是asset_sync存在问题,找不到您的ENV变量(FOG_DIRECTORY和FOG_PROVIDER)

要解决此问题,您需要使用以下两个命令安装heroku实验室:

heroku plugins:install https://github.com/heroku/heroku-labs.git
heroku labs:enable user_env_compile

你再次部署在heroku和(理论上)它应该工作正常! (它对我有用!)

我希望这对未来的某人有所帮助!

答案 1 :(得分:0)

我不确定这是否有帮助,但我没有在任何资产管道项目中检查manifest.yml。这可以归结为Heroku buildpack将运行资产预编译,生成一个你知道正确的新清单。

我会从Git中删除它,看看它们是如何工作的(在部署之前在本地编译资产是推送到Heroku时不需要做的事情)