2012-03-24 48 views
10

我想爲我自定義的組件做一個包。它基於幾個庫,包括Graphics32,GraphicEx和CCR.Exif。自定義組件依賴性地獄

我創建了一個項目,寫的單元,包括它的註冊過程中,增加了一些額外的引用德爾福通知我關於到需要部分(包括dbrtl.dcp,inet.dcp,soaprtl.dcp,vclimg。 dcp,xmlrtl.dcp和dclGraphicEx140.dcp),並向添加了許多單元,其中包含部分,以避免隱含發生的警告。該項目編譯並可以在我自己的機器上安裝和使用,沒有問題。但是,當我想將它安裝在另一臺機器上時,麻煩就開始了。最後,我必須複製所有我使用的第三方組件的DCU,以及來自GraphicEx的DCP和BPL,我甚至必須安裝它。

提供大量的文件是一件令人失望的事情,但可以克服,但不得不安裝其他軟件包也是不行的。我可以通過在部分包含部分放置更多的單元來擺脫DCP和BPL,但是在我自己的機器上導致出現錯誤消息,其中實際安裝了GraphicEx。這對我來說很讓人困惑,因爲Graphics32沒有這樣的事情發生......

無論如何,我該如何保持我的發行版儘量避免這種情況?我希望我的團隊中的其他開發人員能夠使用該包,而不必擔心我用來構建它的內容。首先,不能將所有第三方單元編譯到我自己的DCU中嗎?

+7

組件安裝是Delphi的恥辱,現在Embarcadero不斷忽略。 – kludg 2012-03-24 17:53:15

+0

你正在做什麼類型的分發,編譯應用程序的用戶或其他開發人員在IDE中使用它們? – afrazier 2012-03-24 19:06:22

+0

@afrazier包含其他開發人員(團隊成員)使用的控件的包。 – 2012-03-24 19:41:04

回答

0

摘要

有沒有用Delphi了一段時間,但是,沒有發展自己的自定義可視化控件(最後一個版本我的工作是德爾福6)。

處理程序包依賴關係時有兩個問題。一種是在Delphi環境中安裝,使控件顯示在組件面板上,另外還有組件編輯器&屬性編輯器。

另一個將編譯的軟件包分發到客戶機器時。

這也取決於你正在運行的Delphi版本。

設計時間

當開發一個定製包,有一個封裝選項標籤,指示目標文件夾。

手冊通常會告訴開發人員將這些文本框留空。有時起作用,有時不起作用。我在每個文本框中寫明每個文件夾路徑。

.dcp」文件有一個文本框路徑,其他「 .dcu」文件夾路徑等等。

如果您有可視化控件和諸如屬性編輯器或組件編輯器之類的東西,則最好將代碼拆分爲2個包(「運行時」&「Designtime」)。

我通常把delphi(packages)項目放在delphi安裝文件夾之外。

運行時間

通常,快速的方法是把 「* .bpl」 「.dcp」 文件在Windows(32)/系統文件夾,或類似的 「DLL」 windows文件夾。


包文件夾結構的源代碼建議

軟件包管理是很困難的。我不知道Embarcadero安裝過程已經改變了多少,以及Delphi的更新版本。下面的圖表是關於如何組織源代碼的一個例子。希望能幫助到你。

[-]--+--c: 
.....| 
.....+--[-]--+--software 
.............| 
.............+--[+]-----java 
.............| 
.............+--[+]-----php 
.............| 
.............+--[-]--+--delphi (not the delphi folder in program files) 
.....................| 
.....................+--[+]-----apps (source code for delphi programs) 
.....................| 
.....................+--[+]-----other 
.....................| 
.....................+--[-]--+--packages (all delphi packages source code here) 
.............................| 
.............................+--[+]-----lib (a single package for non visual controls, libraries) 
.............................| 
.............................+--[+]-----tools (package pair for non visual tcomponent descendants) 
.............................| 
.............................+--[+]-----json (example) 
.............................| 
.............................+--[+]-----xml (example) 
.............................| 
.............................+--[-]--+--mycontrols (folder custom visual controls) 
.............................|.......| 
.............................|.......+--[-]--+--delphi40 (folder for delphi40 version of "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+----------dsgvclctrls40.dpk (design-time package "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+----------runvclctrls40.dpk (run-time package "mycontrols") 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--demos (individual example for each "mycontrol") 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--design ("*.pas" component editors destination folder) 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--sources ("*.pas" source code destination folder) 
.............................|.......|.......| 
.............................|.......|.......+--[+]--+--bin ("*.dcu" destination folder) 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi50 (folder for delphi50 version of "mycontrols") 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi60 (folder for delphi60 version of "mycontrols") 
.............................|.......|........ 
.............................|.......+--[+]--+--delphi70 (folder for delphi70 version of "mycontrols") 
.............................|................ 
.............................+--[-]-----etc... 

乾杯。

+3

對不起,但我不明白這是如何回答我如何編寫和/或分發組件的問題,以便用戶(開發人員)不必採取特殊措施(下載/安裝依賴項,組織他的項目以特定的方式)使用它。 – 2012-03-25 13:29:14

+0

「設計時間」是您的目標的前一步。 「運行時間」更多地指向分配。 – umlcat 2012-03-25 19:30:48

0

Thijs,你只是不能只用一個包裝。目標開發人員幾乎需要添加到包中的所有內容。但是有一種替代方式可以做你想做的事情:用你自己的組件中使用的所有組件/庫構建一個DLL,並將所有這些外部組件/庫包含到你將從DLL中導出的代碼中。然後構建組件,而不直接使用外部組件,而是使用您構建的DLL。你不能在你的組件中「使用」其他外部組件/庫的任何單元。您必須建立一個包含所有數據類型的新單元,並且需要聲明您從DLL中導出的任何內容。所有這些都非常有效,但對於大量外部組件或庫很快就會變得非常複雜。

+0

而不是一個DLL,我可以使用BPL,能夠使用對象嗎?難道不可能將BPL編譯成exe文件嗎? – 2013-04-28 22:04:18

2

對於編寫組件的人來說,你所經歷的是一件平常的事情。分配總是這樣。軟件包不包含其他軟件包,他們會引用它們。這是他們的本性。

爲了克服這種情況,我總是把我的成分在我會,如果他們賣的產品以同樣的方式:我建立一個設置嚮導發放和登記的一切包裝需求。

在我的情況下,InnoSetup工作得很好(http://www.jrsoftware.org/isinfo.php)。

+0

如何檢查包是否已安裝(因爲您不能擁有兩次)?有沒有一個固定的位置在哪裏期待它。 – 2013-11-09 18:00:32

+0

@ThijsvanDien:所有在IDE註冊的軟件包都列在Windows註冊表下的HKEY_CURRENT_USER \ Software \ Embarcadero \ BDS \ 7.0 \ Known Packages中。 BDS版本取決於Delphi版本。如果我沒有弄錯,7.0意味着Delphi 2010.查看該項下的項目以確定某個包是否已經存在於IDE中。 – AlexSC 2013-11-10 01:47:47

0

我認爲AlexSC有最好的答案,但我認爲如果你無法肯定有一個沒有依賴關係的自定義組件,那麼可能會有其他選擇。

我嘗試爲我們的開發人員創建一個內部組件時遇到了Delphi依賴性挫敗。我的建議:

  1. 卸載所有依賴的組件使用

  2. 在您的組件包,去掉上面的DCP從需要從你的包款。

  3. 複製你的依賴關係的源文件到您的組件

當您分發的組件,你必須與所需的依賴條件的代碼distibute它

你會運行如果你想單獨使用依賴,因爲Delphi不允許你在已安裝的包中有重複的單元名稱。

另外,您不想使用DCU的原因在於DCU是針對特定平臺和編譯器編譯的。因此,除非您確定所有devolper都使用相同版本的Delphi在相同的平臺上,否則需要重新編譯依賴關係代碼。

再次,AlexSC有最好的答案,InnoStudio是一個偉大的小工具。