微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么我在使用资产主机时必须在本地预编译资产?

我正在为我的 Rails 应用程序使用资产主机 (AWS Cloudfront):

# config/environments/production.rb
config.asset_host = "xxxxxxxxxxx.cloudfront.net"

在我的 CI 服务部署期间,我预编译资产:

bundle exec rake assets:precompile

然后将这些生成的资产推送到作为 Cloudfront 分发源的 S3 存储桶。

注意:我没有在最终部署的最终 docker 映像中包含预编译资产。

现在,当我启动服务器并尝试访问它时 - 我收到错误

application.css 不存在于资产管道中

我知道 Stackoverflow 上有多个问题与此特定错误消息有关。但是我尝试了一切例如就像设置 config.assets.compile = true/false,但唯一使它起作用的是在构建中包含预编译资产(最终的 docker 映像)。

所以现在我问自己:尽管我使用的是资产主机,但我是否必须始终在本地包含资产?!

解决方法

asset pipeline 解析资产路径的方式是首先查找资产文件的 fingerprinting(由 rake 任务 precompile 生成)然后映射到 {{1 }}(如果有),如果没有 asset_host 映射到资产,那么它会抛出异常,它不会检查您的 fingerprinting

如果您的 docker 映像中未包含预编译资产,则 docker 容器中的 Rails 应用将无法找到资产文件,因为该容器中没有生成 asset_host

是的,你必须这样做。

但是,您可以通过在资产路径前添加正斜杠或添加 fingerprinting 来绕过 asset pipeline,在您的情况下,您已经生成指纹并将这些文件推送到您的资产主机,以便您可以绕过,例如skip_pipeline: true,像这样的application.css,但显然这不是一个好的选择,因为你需要对所有文件都这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。