Ubuntu20.04下Rails项目执行Capistrano命令报LoadError加载config/deploy失败
问题根因定位
从你提供的堆栈输出可以直接定位核心问题,两个关键证据:
- 堆栈首行标注
(in /),代表Rake进程识别到的工作目录是系统根目录/,不是你实际存放Rails项目的路径 - 堆栈中加载的Capfile路径为
/Capfile,而非你项目根目录下的./Capfile
这两个点直接说明:Capistrano运行时根本没有找到你的项目目录,直接跳转到系统根目录加载了根路径下的Capfile,自然会报cannot load such file -- config/deploy——因为它在根目录下找config/deploy,当然找不到。
这也能解释为什么你降级Ruby、Rails版本,甚至新建空Rails项目都复现问题——因为错误发生在系统路径解析层,和项目本身的代码、依赖版本完全无关,你的怀疑方向(权限相关问题)是正确的。
常见触发原因
- 目录遍历权限异常:从系统根目录到你项目所在路径的每一级父目录,只要存在某一级对当前执行用户没有开放遍历权限,Ruby的路径获取逻辑就会直接失败,自动将工作目录回落到系统根目录。这种问题和项目内部的文件权限无关,是上层目录的权限链路断了。
- 根目录残留冗余配置:系统根目录下如果存在无主的
Capfile、Rakefile文件,Rake在路径解析失败时会自动加载这些根目录下的配置,触发非预期的加载逻辑。
分步修复操作
- 第一步:确认路径解析异常
执行命令获取当前Ruby识别的工作目录:
如果输出值不是你的项目根路径(而是ruby -e "puts Dir.pwd"/),就完全对应上了堆栈的异常表现。 - 第二步:排查目录权限链路
逐层检查从根目录到项目路径的每一级目录权限,比如项目存放在/home/mike/demo_app,就逐次执行:
只要任意一级目录的权限没有对当前用户开放可遍历权限,就把对应目录的遍历权限补上,确保当前用户可以正常进入每一级目录。ls -ld /home /home/mike /home/mike/demo_app - 第三步:清除全局干扰文件
检查系统根目录下是否存在无关的/Capfile、/Rakefile文件,如果存在就直接删除;同时检查家目录下的~/.rake全局配置文件,如果存在自定义的rake全局规则,临时重命名文件验证是否恢复。 - 第四步:临时验证修复效果
强制指定项目路径作为工作目录执行cap命令,绕过路径自动解析逻辑:
如果命令执行不再报之前的错误,就可以确认是路径解析的问题。bundle exec ruby -I. $(which cap) install --trace
补充说明
你当前项目内的Capfile是Capistrano 3.x的标准格式,没有语法问题,不需要修改。只要路径解析恢复正常,执行bundle exec cap install就会自动在config目录下生成部署所需的配置文件。
内容的提问来源于stack exchange,提问作者Mike Newsletters
相关产品推荐
相关产品推荐

