You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:42:43