1

我正在尝试使用OCRA将我的 REST 应用程序打包到可执行文件中。我的脚本中需要一些宝石:

require 'rack'
require 'rack/server'
require 'grape'
require 'grape-entity'
require 'rubygems'

我跳过用这个启动服务器:

if not defined?(Ocra)
    Rack::Server.start options
end

当我尝试运行 server.exe 时:

Temp/../server.rb:221:in `default_middleware_by_environment': 
cannot load such file -- rack/content_length (LoadError)

这意味着它不会检测存在的机架子模块,但未使用因此不包括在内。如果我添加一个require 'rack/content_length' it continues with 无法加载这样的文件—— rack/chunkedEven` 等等。

当我手动中断我的服务器之前,我还不得不调用一些 api 端点来包含所有内容。

我认为我的选择是:

  • 告诉 OCRA 包括 rack 和 grape 的所有子模块,但是编译该列表有点耗时并且会增加文件大小

    我已经尝试过ocra server.rb --gem-full=rack --gem-full=grape,这让我的服务器启动,但是当调用 API 'rack/mount/strexp' 时再次丢失..

  • 在我的脚本中调用 API,但我不知道该怎么做。我无法添加块Rack::Server.start options,它只会在我中断服务器时继续。

有什么想法可以实现任一选项,还是有其他解决方案?

4

1 回答 1

1

如果我们使用机架处理程序(webrick/thin/else)运行机架应用程序,我们可以在另一个线程中关闭服务器,以便 ocra 可以完成打包(不知道如何用 做同样的事情Rack::Server)。

app     = Rack::Directory.new ENV['HOME'] # a sample app
handler = Rack::Handler.pick %w/ thin webrick /
handler.run app do |server|
  # handler.run yields a server object,
  # which we shutdown when ocra is packing
  if ocra_is_packing # replace with proper condition
    Thread.new { sleep 10; server.shutdown }
  end
end

您可能需要做其他事情(访问服务器等)才能让 ocra 打包适当的依赖项。

于 2015-12-11T14:16:22.320 回答