0

我使用带有Enginery 生成器(Ruby gems)的framework Espresso。我创建了新项目,但不明白这个应用程序是如何工作的。我将与 Espresso 合作。请解释一下 struct Expresso Application。我可以运行这个应用程序:rackup config.ru 我可以编辑控制器,但我不明白这个项目中的 ruby​​ 脚本之间的依赖关系。

我运行项目,但为什么这样做呢?配置.ru

require File.expand_path('../base/boot', __FILE__)
puts App.urlmap
run App

在项目而不是 /base/boot 目录中。

4

2 回答 2

1

需要 '../base/boot' 实际上会加载依赖项、控制器、模型等并构建应用程序。

该应用程序存储在App常量下,因此您可以从不同的文件访问它: https ://github.com/espresso/enginery/blob/master/app/base/base/boot.rb#L9

puts App.urlmap将显示应用程序要服务的所有路线。

并将run App启动您的应用程序。

您也可以通过启动应用程序ruby app.rb,然后您不需要在启动时传递服务器/端口。相反,您将它们设置在 中config/config.yml,如下所示:

development:
  server: Thin
  port:   5252
于 2013-04-07T12:20:26.663 回答
0

对于启动文件,该config.ru文件看起来很正常。rack您将从项目文件夹启动应用程序,使用如下命令:

rackup -p 8080

以下行:

require File.expand_path('../base/boot', __FILE__)

将加载../base/boot文件(类似于require_relative,但也适用于较旧的Ruby,例如1.8.7),我猜这需要App定义的依赖项。类或模块App将实现一个call方法。要启动服务器,机架主机调用App.new(由于 调用run App),然后在每个请求上它都会调用.call( env )生成的对象(对象不必是App对象,但在更简单的框架中它将是)。

该变量env包含请求和机架环境的所有详细信息,可以检查这些详细信息以获取当前路径、cookie、查询参数等的详细信息。通常通过您将使用的 Sinatra 和 Espresso 辅助方法抽象访问这些数据。

Sinatra 和 Espresso 辅助方法看起来像是在做魔术声明,但它们只是普通方法。通常他们会进行一些计算,然后存储一个代码块/ lambda 供机架稍后调用。辛纳特拉的get就是这样。. . 它不是真正的声明性代码。相反,当解析控制器时,它只需要代码块并告诉应用程序对象(稍后)在路径匹配时调用它。

于 2013-04-07T09:23:11.787 回答