2012-12-09 34 views
1

想象一下,我使用require加載了一個名爲ftp_reader.rb的ruby文件,例如,「需要」管理在Ruby中

require './readers/ftp_reader' 

10個文件包含上述require聲明並利用此文件。比方說,我錯分ftp_reader和路徑應該是這樣的:

require './remote_readers/ftp_reader' 

我會記住這需要10個文件的ftp_reader,並更新路徑。這是一個痛苦。我一直在重命名和重新定位文件和文件夾,以儘可能使我的項目儘可能地代表問題域(BDD)。

我的問題是,有沒有使用某種清單文件,其中包含所有項目文件的路徑,並有一個版本的require方法,利用這個清單找到我的依賴關係?該文件將具有文件別名,我將在我的require語句中使用別名而不是文件路徑。如果有人使用require.js,這聽起來很熟悉。 Ruby世界中是否已經存在這樣的事情?或者這個問題在Ruby世界中是如何解決的?

+0

你有沒有想過創造一個寶石? (也許這已經是答案) – knut

+0

我是否爲每個文件創建一個gem? – enamrik

+0

如果你使用的是同一文件的10倍,我認爲你所有的代碼都是關於一個主題的。所以創建一個小寶石可能是一個不錯的選擇。 – Mattherick

回答

0

大多數人在Ruby中使用bundle manager來解決依賴管理的問題。 Bundler是最大的一個,因爲它包含在Rails中。你創建一個Gemfile來指定你想要使用的所有bundle,bundler創建它自己的bundles庫,並且你可以根據需要只需要它們。如果你使用服務器端JavaScript,它與npm非常相似。

+0

的新手謝謝你的回答,但我正在談論動態解析腳本的文件位置,而不是在require語句中對它們的靜態引用。我沒有考慮寶石,只有在您建議我爲每個腳本文件創建寶石時才適用。 – enamrik

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。沒關係,寶石中有多少個文件。寶石爲我解決了一個問題。不是文件的數量很重要,但是separation of concerns。寶石包含解決問題的腳本,測試和它是文檔的基礎。

+0

您的最後一段有我想知道是否需要重新考慮我對寶石的理解。到現在爲止,我認爲它們是包裝管理系統中的包裝。我從來沒有見過將寶石作爲構建項目的方式。事實上,如果我的應用程序由許多隻包含少量文件的寶石組成,那麼需求路徑問題永遠不會變成難以管理的混亂或一堆醜陋的黑客。但是我總是害怕重新使用任何工具,因爲我超越了創作者原創設計要求的範圍。你有沒有遇到任何與你的方法問題? – enamrik

+0

重寫require方法並實現用於查找腳本的搜索算法或對已註冊的腳本別名的全局散列進行查找(require.js),這也不是一個好主意嗎? – enamrik

+0

你寫過'我從來沒有見過寶石作爲一種方式來構建一個項目的擔憂。' - 我也沒有。在你寫的'10文件包含上述要求'的問題中 - 如果這10個文件屬於一個項目,那麼在移動你的ftp_reader.rb之後,我會改變這10個腳本的代碼對於在文件系統中搜索的舊用法)。但是如果這10個腳本屬於不同的項目,那麼他們需要一個共同的庫 - 這將是一個新的寶石。 – knut