我尝试本地 precompile ,并加入到版本控制中,上传到云端。
但是遇见的问题是,云端无法自动读取到对应的文件。我加入版本控制的文件如下
是不是还有其他的文件需要加入版本控制当中?
补充说明:
本地 rails s
时,可以正常的读取到 asset。
本地的 rails s
起的是 development
还是 production
,如果是 development
的话试一下 rails s -e production
,如果也读不到的话我猜是因为 production.rb
里面的设置……默认情况下 rails server 不会处理静态资源
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
云端的部署架构是什么?
如果是典型的 nginx 跟 app 在同一服务器,要把 nginx 的 root 指向 public 目录;如果是 heroku,则需要设置 RAILS_SERVE_STATIC_FILES 环境变量让 rails 进程处理静态文件,但这通常会在前面加一层 CDN。
由于购买的 Server 都是国内 + 这个域名部署的是 Side Project,因此暂时没有自行构建部署环境,使用的是 @moliliang 提供的 BitBear 的服务。直接使用 Plesk 来部署人 Rails。我看了下,是将 nginx 的 root 指向了静态的目录。
此外,实际上问题并不是无法读取文件,而是会读取到错误的 hash ,所以我很迷到底是哪个文件没上传导致的,是我提供的上下文有点问题。抱歉。
惊!哪能把编译之后的加到版本控制里。。。。
我在想你要到是不是在生产环境里执行这句?
RAILS_ENV=production bundle exec rails assets:precompile
或者挂在启动脚本里。。。或者在 CI 构建时编译。。。加在版本控制里就看不懂是什么操作了。。。。
asset 文件的 hash 值从 manifest file 读取的
可能是你服务器没有上传这个文件
一般是这样 public/assets/manifest-xxxxxxxx.json
具体可以参考这里
https://guides.rubyonrails.org/asset_pipeline.html#manifest-files-and-directives
不清楚你云端什么样子,前面几楼也说过了,这种文件应该不用加入到版本控制,一般放到 CDN
编译的时候加了 Rails ENV 的,肯定不是直接使用 precompile 的。加了这个环境变量应该就没问题吧?加版本控制应该也 OK。