1

想象一下,我require用来加载一个名为 ftp_reader.rb 的 ruby​​ 文件,例如

require './readers/ftp_reader'

10个文件包含上述require声明并利用该文件。假设我对 ftp_reader 进行了错误分类,路径应如下所示:

require './remote_readers/ftp_reader'

我必须记住哪 10 个文件需要 ftp_reader,并更新路径。这是一种痛苦。我总是重命名和重定位文件和文件夹,以使我的项目尽可能地代表问题域 (BDD)。

我的问题是,是否有一些 gem 使用某种清单文件,其中包含所有项目文件的路径,并且具有require使用此清单来定位我的依赖项的方法版本?该文件将具有文件的别名,我将在我的require语句中使用别名而不是文件路径。如果有人用过 require.js,这听起来很熟悉。Ruby 世界中是否已经存在这样的东西?或者这个问题在 Ruby 世界中是如何解决的?

4

2 回答 2

2

提前评论:你的愿望(和我的回答)有一种丑陋的代码的味道。我建议您考虑一个或多个宝石与您的文件。更多在我的答案的末尾。

我过去所做的:我在不同的文件夹和一个公共文件中也有小脚本myscripts.rb。这myscripts.rb是在我的大多数文件的开头加载并设置加载路径:

require_relative '../myscripts.rb' #
require 'ftp_reader'

myscripts.rb被定义为:

$:.unshift('c:/<..full_path..>/readers/')
$:.unshift('c:/<..full_path..>/writters/')
#... more pathes ...

当我改变我的文件夹结构时,我只需要改变我的myscripts.rb

$:.unshift('c:/<..full_path..>/remote_readers/')

现在所有脚本都使用新的文件夹结构,因为我myscripts.rb从未更改过它的位置。

我使用了完整路径,因为相对路径是相对于主文件的,而不是相对于myscripts.rb.

有可能组合__FILE__expand_path使用我的相对路径myscripts.rb- 但我从未使用过它。

问题:如果我重命名我的脚本,这不起作用(我经常保留旧的脚本名称并加载新的)。而且旧版本不灵活。

后来我创建了一个 gemmytools并将所有脚本添加到这个 gem。如果我需要旧版本,可以加载旧版本。

今天,我为每个关注/主题创建了一个 gem。没关系,gem 中有多少文件。宝石为我解决了一个问题。重要的不是文件数量,而是关注点的分离。gem 包含解决问题的脚本、测试,它是文档的基础。

于 2012-12-09T19:37:54.850 回答
0

大多数人使用 Ruby 中的包管理器来解决依赖管理问题。Bundler 是最大的一个,因为它包含在 Rails 中。您创建一个 Gemfile 来指定您要使用的所有包,bundler 创建自己的包存储库,您可以根据需要随意使用它们。如果你做服务器端 JavaScript,它与 npm 非常相似。

于 2012-12-09T17:46:13.240 回答