执行rake neo4j:install触发rb_sysopen无文件或目录错误
问题描述
- 参考Neo4jrb v10.0.1官方配置指南搭建新项目时,曾尝试执行以下命令设置环境变量,但该操作未解决安装异常:
export NEO4J_DIST=http://dist.neo4j.org/neo4j-community-4.4.8-unix.tar.gz
- 执行带
--trace参数的安装命令rake neo4j:install[community-4.4.8,development]时,rake任务中止,抛出错误:
Errno::ENOENT: No such file or directory @ rb_sysopen - https://dist.neo4j.org/neo4j-community-4.4.8-unix.tar.gz
- 完整执行追踪日志如下:
$ rake neo4j:install[community-4.4.8,development] --trace DEPRECATION WARNING: ActiveSupport::PerThreadRegistry is deprecated and will be removed in Rails 7.1. Use `Module#thread_mattr_accessor` instead. (called from <top (required)> at /home/aray/code/ruby/myapp/config/application.rb:17) DEPRECATION WARNING: ActiveSupport::PerThreadRegistry is deprecated and will be removed in Rails 7.1. Use `Module#thread_mattr_accessor` instead. (called from <top (required)> at /home/aray/code/ruby/myapp/config/application.rb:22) ** Invoke neo4j:install (first_time) ** Execute neo4j:install Install Neo4j (development environment)... rake aborted! Errno::ENOENT: No such file or directory @ rb_sysopen - https://dist.neo4j.org/neo4j-community-4.4.8-unix.tar.gz /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/neo4j-rake_tasks-0.7.19/lib/neo4j/rake_tasks/download.rb:18:in `initialize' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/neo4j-rake_tasks-0.7.19/lib/neo4j/rake_tasks/download.rb:18:in `open' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/neo4j-rake_tasks-0.7.19/lib/neo4j/rake_tasks/download.rb:18:in `fetch' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/neo4j-rake_tasks-0.7.19/lib/neo4j/rake_tasks/server_manager.rb:303:in `download_neo4j' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/neo4j-rake_tasks-0.7.19/lib/neo4j/rake_tasks/server_manager.rb:19:in `install' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/neo4j-rake_tasks-0.7.19/lib/neo4j/rake_tasks/neo4j_server.rake:39:in `block (2 levels) in <main>' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:279:in `block in execute' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:279:in `each' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:279:in `execute' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run' /home/aray/.rbenv/versions/3.0.3/lib/ruby/gems/3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>' /home/aray/.rbenv/versions/3.0.3/bin/rake:25:in `load' /home/aray/.rbenv/versions/3.0.3/bin/rake:25:in `<main>' Tasks: TOP => neo4j:install
报错原因
- 核心问题是当前使用的
neo4j-rake_tasks 0.7.19版本存在代码缺陷:下载逻辑直接调用Kernel.open方法读取传入的地址,但没有引入open-uri标准库。原生Kernel.open只支持读取本地文件路径,遇到HTTP/HTTPS格式的URL时会直接把字符串当本地文件路径查找,找不到对应文件就抛出Errno::ENOENT错误。 - 手动设置
NEO4J_DIST环境变量不生效,是因为该版本的rake任务逻辑里,命令参数传入的版本号会自动拼接官方下载域名生成地址,优先级高于手动设置的环境变量,导致自定义的下载地址没有被读取。 - 日志里的两条ActiveSupport弃用警告和本次安装失败无关,是Rails 7.1版本对旧API的移除提示,不影响安装流程执行。
解决方法
按优先级从高到低选择以下方案即可:
- 升级neo4j-rake_tasks版本
直接把Gemfile里的neo4j相关依赖升级到最新稳定版,0.7.20及以上版本已经修复了远程下载的依赖缺失问题,同时修正了环境变量读取优先级的bug,升级后直接重新执行安装命令即可:
bundle update neo4j-rake_tasks rake neo4j:install[community-4.4.8,development]
- 补全依赖+本地安装包安装
如果暂时不能升级gem版本,先在Gemfile中添加open-uri依赖解决远程读取问题,执行bundle install后再运行安装命令。如果网络访问Neo4j官方下载源不稳定,可以提前把对应版本的安装包下载到本地目录,将NEO4J_DIST指向本地文件路径再执行安装:
# 假设安装包存放在项目tmp目录下 export NEO4J_DIST=./tmp/neo4j-community-4.4.8-unix.tar.gz rake neo4j:install[community-4.4.8,development]
内容的提问来源于stack exchange,提问作者cloud_master
相关产品推荐
相关产品推荐

