我正在为我的Rails应用程序使用资产主机(AWS Cloudfront(:
# config/environments/production.rb
config.asset_host = "xxxxxxxxxxx.cloudfront.net"
在CI服务上部署期间,我预编译资产:
bundle exec rake assets:precompile
然后将这些生成的资产推送到S3存储桶中,S3存储桶是Cloudfront分发的来源。
注意:我不会在最终部署的最终docker映像中包括预编译的资产。
现在,当我启动服务器并尝试访问它时,我收到错误:
application.css不存在于资产管道中
我知道关于这个特定错误消息的Stackoverflow有多个问题。但是我尝试了一切,例如设置config.assets.compile = true/false
,但唯一能让它工作的是在构建中包括预编译的资产(最终的docker映像(。
所以现在我在问自己:尽管我使用的是资产主机,但我是否必须始终在本地包含资产?!
asset pipeline
解析资产路径的方式,它将首先查找资产文件的fingerprinting
(由rake任务precompile
生成(,然后映射到asset_host
(如果有(,如果没有映射到资产的fingerprinting
,它将抛出异常,它不会检查您的asset_host
。
如果您没有在docker映像中包括预编译的资产,那么docker容器中的rails应用程序将找不到资产文件,因为该容器中没有生成fingerprinting
。
所以是的,你必须这样做。
然而,您可以通过在资产路径之前添加正斜杠来绕过asset pipeline
,或者添加skip_pipeline: true
,在您的情况下,您已经生成了指纹并将这些文件推送到您的资产主机,这样您就可以绕过,例如application.css
,就像这个stylesheet_link_tag '/application-{fingerprinting}.css'
一样,但显然这不是一个好选择,因为您需要对所有文件都这样做。