Ruby中的“require”管理

时间:2012-12-09 17:22:48

标签: ruby require

想象一下,我使用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世界中如何解决这个问题?

2 个答案:

答案 0 :(得分: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使用相对路径 - 但我从未使用它。

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

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

今天我为每个关注/主题创建一个gem。无关紧要,宝石中有多少个文件。宝石为我解决了一个问题。文件数量不重要,但separation of concerns。 gem包含解决问题的脚本,测试,它是文档的基础。

答案 1 :(得分:0)

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