Rails中require syntax_tree gem失败问题(Docker可复现)
Rails控制器无法加载已安装的syntax_tree gem问题
本问题与Stack Overflow某旧帖类似但并非重复,原因如下:
- 基于Docker的环境完全可复现
- 所有依赖均通过gem命令显式安装
- 存在独立非Rails脚本可验证syntax_tree gem可用
- 参考帖已发布近8年,环境差异较大
可复现问题的Docker镜像配置
FROM ruby RUN apt-get update RUN apt-get install vim -y RUN gem install rails RUN rails new translator --api --skip-action-mailer --skip-active-record WORKDIR translator RUN gem install syntax_tree COPY routes.rb config COPY translator_controller.rb app/controllers COPY test.rb test.rb COPY primes.rb primes.rb EXPOSE 3000
构建并运行镜像的步骤
$ docker build --tag host.front.rb --file Dockerfile . $ docker run -p 8012:3000 -d -t --name front.rb host.front.rb $ docker exec -it front.rb bash
验证环节
1. 验证syntax_tree gem安装正常
$ cat test.rb # <----- 独立测试文件 require "json" require "syntax_tree" file = File.open('primes.rb') content = file.read file.close program = SyntaxTree.parse(content) puts JSON.dump(program) $ ruby test.rb | head -c 41 {"type":"program","location":[1,0,19,265] # <---- 正常运行!
2. 验证Docker化服务器可正常访问
# 在Docker容器内 $ rails server -b 0.0.0.0 => Booting Puma => Rails 7.1.3.2 application starting in development < ... 省略部分内容 ... > * Listening on http://0.0.0.0:3000 # 本地机器 $ curl -X POST -F "source=@primes.rb" http://127.0.0.1:8012/translator1 >> 247 $ stat --format=%n:%s primes.rb primes.rb:247 # <----- 正常运行!
问题现象
调用依赖syntax_tree的translator2端点时失败:
$ curl -X POST -F "source=@primes.rb" http://127.0.0.1:8012/translator2 {"status":500,...,"exception":"LoadError: cannot load such file -- syntax_tree
相关代码文件
translator_controller.rb
require "json" class TranslatorController < ApplicationController def post_handler_simple # 获取上传的文件 source = params["source"] # 读取Ruby源代码 file = File.open(source.tempfile) content = file.read file.close # 返回内容长度 -> 运行正常! render plain: ">>> #{content.length()}\n" end def post_handler # 获取上传的文件 source = params["source"] # 读取Ruby源代码 file = File.open(source.tempfile) content = file.read file.close # 此处导入失败... require "syntax_tree" # 解析代码 program = SyntaxTree.parse(content) # 返回JSON格式的AST render plain: JSON.dump(program) end end
routes.rb
Rails.application.routes.draw do post "/translator1", to: "translator#post_handler_simple" post "/translator2", to: "translator#post_handler" end
求助
为何在Rails控制器中无法require已成功安装的syntax_tree gem?
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

