Rails 5.1.4+Capistrano部署时深层图片资产未同步至Ubuntu服务器
解决Rails + Capistrano部署时深层图片文件夹未同步的问题
看起来你遇到的核心问题是app/assets/images下的深层子文件夹(比如content)里的图片既没被Rails预编译,也没被Capistrano同步到服务器。咱们一步步拆解排查:
第一步:先定位问题环节——是Rails预编译还是Capistrano的锅?
先把问题拆成两个部分确认:
- 先在本地执行生产环境预编译命令,看看本地能不能生成目标文件:
执行完去本地RAILS_ENV=production bundle exec rake assets:precompilepublic/assets目录检查:如果连本地都没有content子文件夹,那肯定是Rails预编译的配置问题,和Capistrano无关;如果本地有,但服务器release目录里没有,再去排查Capistrano的同步逻辑。 - 若本地预编译正常,登录服务器到对应的release目录(比如你提到的
/home/deploy/appname/releases/20180106013806/public/assets)查看:如果这里也没有,说明服务器上的预编译没执行成功;如果这里有但current目录下没有,那可能是Capistrano的symlink环节出了问题。
第二步:修复Rails预编译的配置
如果本地预编译也没生成深层图片,调整config/initializers/assets.rb的配置:
- 你当前添加的代码是把图片子目录加入assets路径,但Rails默认已经会扫描
app/assets/images下的所有文件,问题大概率是这些深层图片没被显式标记为需要预编译。可以补充:
这样Sprockets会主动处理这个目录下的所有文件,不管有没有被其他资源引用。# 强制预编译content目录下的所有资源 Rails.application.config.assets.precompile += %w( content/**/* ) - 检查
config/environments/production.rb里的config.assets.compile,确保它是false(生产环境默认值),如果设为true会打乱预编译的逻辑。 - 预编译后查看
public/assets/.sprockets-manifest-*.json文件,确认里面有没有content下图片的条目——有就说明预编译成功了。
第三步:排查Capistrano的部署配置
如果本地预编译正常,但服务器release目录没生成目标文件:
- 确认Capistrano的预编译执行位置:默认capistrano-rails会在服务器上执行预编译,你可以在
deploy.rb里核对:
若为服务器执行,登录服务器进入对应release目录,手动执行# 默认在web角色的服务器上执行预编译 set :assets_roles, [:web] # 如果想本地预编译后再上传,可开启下面这行 # set :compile_assets_locally, trueRAILS_ENV=production bundle exec rake assets:precompile,看能不能生成content文件夹,有没有报错信息。 - 检查
deploy.rb的linked_dirs配置:绝对不要把public/assets加入linked_dirs!assets是每次部署预编译的产物,应该随release目录替换,要是设为linked,就会一直沿用旧的assets文件夹,新图片自然不会更新。 - 重新部署时加
--trace看详细日志:cap production deploy --trace,重点看assets:precompile步骤有没有报错或者跳过文件的提示。
其他可能的小细节
- 检查深层文件夹里的图片文件名:尽量用小写字母+下划线,避免空格、特殊字符或大写字母,Sprockets对这类命名可能有兼容问题。
- 确认sprockets版本和Rails5.1.4兼容:Rails5.1.x对应的sprockets版本是3.x,不要贸然升级到4.x,避免出现不兼容问题。
内容的提问来源于stack exchange,提问作者Dave Collins
相关产品推荐
相关产品推荐

