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