0

我正在使用 Thin、Sinatra 和 Bundler 的组合。我试图了解如何让 Thin 将源代码的路径包含在加载路径中?我一直在寻找此设置的介绍性教程,但似乎没有一个能回答我的问题。

乱用 rackup 文件或 Thin 配置文件感觉不对。假设我有一个目录结构,例如:

bin/my-application-entry.rb # The entry point to my sinatra application
lib/myapp/mylibs.rb
thin/config.ru # rackup config
thin/dev.yaml  # thin config
Gemfile        # for my dependencies

rackup 文件的内容本质上是

require 'sinatra'
# I'd like to require 'my-application-entry' around here somewhere (I think?)
run Sinatra.application

我调用应用程序

thin -C thin/dev.yaml -R thin/config.ru start

我注意到 thin 需要一个命令行参数来要求一个特定的库,但肯定有一个更好的地方可以定义所有的加载路径?

所以我的问题是,我如何告诉 Thin/rack/bundle 包含哪些目录?(如 bin/ 和 lib/)

编辑:为了清楚起见,我真的很想知道这通常是如何专门用 Thin 完成的。我不愿意在我的主应用程序中修改 $:,但如果我被迫使用 $:,那么最好的地方是哪里(在 Thin/Rack/Sinatra 环境中)这样做?

4

2 回答 2

0

$: 是描述加载路径的全局变量,表示为一个数组。您可以添加“。”,然后如果您愿意,请消除重复项,如下所示:

$:.unshift(".").uniq!

或者你可以将它推到列表的末尾:

$:.push(".").uniq!

它通常默认被忽略,因为它是一个潜在的安全隐患。

于 2012-06-21T22:47:24.860 回答
0

我想知道同样的事情。我会告诉你我在做什么,并试图证明它的合理性。也许在写这篇文章的过程中,我会想出一些东西。

我现在决定添加到$LOAD_PATHin config.ru,因为我正在使用config.ru它作为我的应用程序的入口点。我可以侥幸逃脱,因为我打算将此文件保留在项目的根目录中。我不喜欢做这个假设,但现在看起来很安全。当然,我会留下评论说“Ew。假设此文件是应用程序的唯一入口点,并且它将始终位于项目的根目录中。”

我之所以选择这个是因为我想$LOAD_PATH在调用堆栈中添加到尽可能高的位置(依赖倒置原则),但是在运行应用程序的命令中这样做(在生产中Procfile运行thin;在开发中运行的命令行shotgun)会复制我的目录想要添加到加载路径。我是否将此重复归类为必要(值得删除)或巧合(值得重复)?现在,它看起来像是应用程序的一个重要方面,至少在我决定组织它的时候,因为应用程序将各种服务集成到一个请求/响应/路由引擎中。此外,config.ru描述应用程序,因此将其视为应用程序是有意义的。

如果情况发生变化并且我注意到我希望$LOAD_PATH在开发中与在生产中有所不同,那么我会将目录从调用堆栈向上移动到运行的命令中config.ru

我对这个选择感到满意,不是因为我认为这是“正确的选择”,而是因为我认为我知道如何以及为什么会改变主意。对我来说已经足够好了。

我希望这有帮助。

于 2014-04-21T15:52:19.460 回答