新手问题 如何本地编译 asset ,然后推送到云端使用?

bestony · September 08, 2018 · Last by bestony replied at September 11, 2018 · 1445 hits

我尝试本地 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?

cap 的话可以看看这个 capistrano-local-precompile

云端的部署架构是什么?

如果是典型的 nginx 跟 app 在同一服务器,要把 nginx 的 root 指向 public 目录;如果是 heroku,则需要设置 RAILS_SERVE_STATIC_FILES 环境变量让 rails 进程处理静态文件,但这通常会在前面加一层 CDN。

Reply to Rei

由于购买的 Server 都是国内 + 这个域名部署的是 Side Project,因此暂时没有自行构建部署环境,使用的是 @moliliang 提供的 BitBear 的服务。直接使用 Plesk 来部署人 Rails。我看了下,是将 nginx 的 root 指向了静态的目录。

此外,实际上问题并不是无法读取文件,而是会读取到错误的 hash ,所以我很迷到底是哪个文件没上传导致的,是我提供的上下文有点问题。抱歉。

感谢你的回复!不过问题并不是这个,如果您还有兴趣帮我解决问题,可以看一下 4 楼。

惊!哪能把编译之后的加到版本控制里。。。。

我在想你要到是不是在生产环境里执行这句?

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

Reply to a-wing

编译的时候加了 Rails ENV 的,肯定不是直接使用 precompile 的。加了这个环境变量应该就没问题吧?加版本控制应该也 OK。

Reply to heroyct

感谢,这个就是我需要的。

为什么要在本地做还要加入版本控制中

Reply to huobazi

因为用的是虚拟主机,而不是 Cap 部署

You need to Sign in before reply, if you don't have an account, please Sign up first.