为什么在使用资产主机时必须在本地预编译资产



我正在为我的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'一样,但显然这不是一个好选择,因为您需要对所有文件都这样做。

相关内容

  • 没有找到相关文章

最新更新