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

bestony · 2018年09月08日 · 最后由 bestony 回复于 2018年09月11日 · 1454 次阅读

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

Rei 回复

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

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

classicalliu 回复

感谢你的回复!不过问题并不是这个,如果您还有兴趣帮我解决问题,可以看一下 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

a-wing 回复

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

heroyct 回复

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

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

huobazi 回复

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

需要 登录 后方可回复, 如果你还没有账号请 注册新账号