推送至Heroku时Rake中止:Errno::ENOENT文件或目录不存在报错
解决Heroku推送时的Rake中止错误
先梳理你遇到的两个核心报错:
remote: sh: 2: Syntax error: 未终止的引号字符串
remote: ! 无法检测rake任务
remote: ! Errno::ENOENT: No such file or directory @ rb_sysopen - /tmp/build/config/application.yml
下面分场景给出排查和解决步骤:
一、处理"未终止的引号字符串"错误
这个问题是Heroku在检测Rake任务时,发现某个shell命令里存在未闭合的引号,导致脚本执行中断。你可以按以下顺序排查:
- 先在本地运行
bundle exec rake -P,尝试复现错误。如果本地也出现同样的语法问题,错误日志会直接帮你定位到具体的Rake任务或脚本位置。 - 检查lib/tasks目录下的所有Rake任务文件,重点看包含
sh、system等shell执行命令的代码,比如有没有类似sh "echo 'user input这种遗漏结尾单引号的写法,或者双引号嵌套时未转义的情况。 - 检查你的Gemfile,确认所有gem声明、自定义脚本(比如post_install钩子)里的引号都已正确闭合,比如有没有
gem 'my-gem', :git => 'https://github.com/user/repo这种少了结尾引号的错误。
二、处理"找不到application.yml"错误
这个问题的本质是config/application.yml通常作为本地敏感配置文件(存储API密钥、数据库密码等),会被加入.gitignore,所以推送到Heroku时服务器上没有这个文件,导致代码读取失败。解决办法分两种情况:
如果用Figaro管理配置
- 确保Gemfile中包含Figaro,且纳入production组:
gem 'figaro', group: :production - 运行本地命令将配置同步到Heroku环境变量:
figaro heroku:set -e production
如果用Dotenv或手动管理配置
- 打开本地的
.env或application.yml,把里面的所有配置项(比如API_KEY=xxx)通过Heroku命令添加到服务器环境变量:heroku config:set API_KEY=xxx DATABASE_URL=yyy - 修改项目中读取
application.yml的代码,改为直接读取环境变量,比如把YAML.load_file(Rails.root.join('config', 'application.yml'))['api_key']替换成ENV['API_KEY']。 - 确认
.gitignore里已添加config/application.yml,避免敏感配置文件被推送到Git仓库。
修复完以上问题后,先在本地运行bundle exec rake -P确认没有错误,再重新推送代码到Heroku,应该就能解决这些Rake中止问题了。
内容的提问来源于stack exchange,提问作者scientiffic
相关产品推荐
相关产品推荐

