2009-02-12 61 views
7

此問題與this one類似,但不是重複的,因爲我在詢問未在該問題中討論過的問題。在Delphi中,我應該將共享單元添加到我的項目,共享包還是兩者都不?

我有以下目錄結構在Delphi 7客戶機 - 服務器項目:

\MyApp 
    \MyClientApp 
    \MyServerApp 
    \lib 

有2個實際德爾福項目(.dpr),每一個在MyClientApp和MyServerApp文件夾。

lib文件夾具有.pas單元,它們具有客戶端和服務器應用程序的通用代碼。我想知道的是,如果我應該在客戶端和服務器項目中包含這些.pas文件?還是應該在包含這些單元的lib文件夾中創建一個包?或者我應該將.pas文件放在lib文件夾中,而不是將它們添加到任何應用程序/包中?

每種方法的優缺點是什麼?哪種方法「最好」?將lib文件夾中的這些單元包含在多個項目中是否存在任何問題?

現在,lib文件夾中的單元不是任何應用程序/包的一部分。這樣做的一個缺點是,例如,當我在Delphi中打開我的客戶端應用程序時,我想在項目中的所有文件中搜索某些內容,但它不會搜索lib文件夾中的單元。我通過打開這些單元並在所有打開的文件中查找,或使用grep搜索(但我更喜歡更好的解決方案)來解決這個問題。

我也非常喜歡一個解決方案,我不必去打開一些單獨的包並在我更改lib文件夾中的這些文件(這是我應該使用項目組?)時重新編譯它。

回答

8

應用程序之間的共享單元總是會在一個應用程序中發生不兼容的更改,從而導致另一個應用程序發生故障。另一方面,製作這些單元的副本更糟糕,因此,將它們移動到自己的子目錄中的做法至少會增加心理障礙,在不考慮其他程序的情況下更改它們。

至於將它們添加到項目文件中:我通常添加一些我經常訪問的單元(用於擴展或參考)從IDE到項目,並讓其他編譯器選擇使用搜索路徑。我在每個項目的基礎上這樣做,這意味着,一些單位可能是幾個項目的一部分,爲什麼不呢?

如果你真的想創建一個基於軟件包的應用程序,那麼把它們放入一個包中是有道理的,否則,爲什麼要麻煩?

有關我如何安排我的項目和庫的詳細信息,請參閱http://www.dummzeuch.de/delphi/subversion/english.html

3

我通常創建一個包含所有共享單元的包,並使用這些單元。 如果您沒有明確標記「使用運行時包構建」,則包內容(所有使用的dcu)將與任何其他單元鏈接到您的項目。

+1

的_package_不會在所有鏈接。它將像任何普通版本一樣鏈接DCU文件。 – 2009-02-13 00:14:58

+0

@Rob,你說得對,我的意思是包內容= .dcu。 – 2009-02-13 00:17:17

5

我不喜歡讓項目共享文件。很多時候,你會試圖編輯其中一個共享文件,並且你會在另一個項目中破壞某些東西,或者你會忘記你必須重建另一個項目。

當共享文件被分離到他們自己的庫(包)中時,那麼編輯它們會有一些額外的障礙。我認爲這是件好事。這將提醒您,您正在從項目特定代碼切換到共享代碼。您可以使用項目組讓您將每個項目集中在一個IDE實例中。將圖書館項目安排在可執行項目之前。從第一個項目開始,「構建全部」命令將按順序構建所有內容。

保持您的DCU文件與PAS文件分開。您可以通過設置「DCU輸出目錄」項目選項將包裝單元發送到其他位置,輕鬆完成此操作。然後將目標目錄放在其他項目的「搜索路徑」上。他們會找到DCU,但他們不會找到PAS文件,所以沒有其他項目會意外地重新編譯一個不是真正的成員的單元。

擁有單獨的軟件包也不鼓勵使用項目特定的條件定義。當你在項目之間共享單元時,會造成各種麻煩。找到一種方法,讓相應項目中的所有項目特定選項保持不變。共享庫不應該要求項目​​特定的修改。如果一個庫需要根據誰使用它而採取不同的行動,那麼就應該使用庫回調函數這樣的技術,庫用戶可以設置它來修改庫的行爲。

4

我需要有一個很好的理由來共享代碼添加到包。如果您只有幾個共享文件,將它們全部粘貼到名爲Shared的目錄中。這應該使文件在項目之間共享變得明顯。

還使用一個很好的構建工具來做自動構建,所以你會很快發現,如果你打破了一些東西。

.bpl文件適用於組件,但對於這類事情會帶來嚴重的複雜性,除非您擁有大量的共享文件。

2

如果您實際上有兩個應該在同一臺物理機器上運行並共享一些代碼的二進制文件,我只會使用運行時軟件包。請記住,運行時軟件包大多是全有或全無的方法。一旦決定使用它們,您將不再能夠將RTL和VCL單元直接鏈接到項目中,而是必須單獨部署這些單元。

但是,與項目組結合使用時,程序包仍然可以解決您的問題,這正是我正在做的。我討厭在多個項目中包含共享單元。在包中包含共享單元(但不包含運行包的實際項目)允許您將該包添加到項目組中,這樣您(和IDE!)將始終讓它們易於訪問,而且與項目特定碼。嚴格地說,你甚至不需要編譯這些軟件包。他們只能作爲項目經理的組織單位。

注意,對於在文件中查找,您也可以指定「在項目組中的所有文件」