2009-02-13 60 views
6

我的很多項目都包含Castle/NHibernate/Rhino-Tools堆棧。令人困惑的是Castle取決於一些NHibernate庫,NHibernate取決於一些Castle庫,而Rhino-Tools取決於兩者。如何將外部庫打包到.Net項目中?

我已經在我的機器上構建了所​​有三個項目,但我覺得複製NHibernate/Castle庫有點多餘,因爲我使用NHibernate和Castle構建的結果庫構建了Rhino-Tools。

現在,我在我的項目樹中的my/thirdparty/libs文件夾中包含了單獨文件夾中的所有項目。我應該只在我的項目中使用/ thirdparty/libs/rhino-tools並從那裏使用Castle/NHibernate庫?這似乎沒有複製文件是合乎邏輯的,但我也希望每個項目都有自己獨特的文件夾。

您對此有何看法?

回答

1

我使用每個文件夾,這似乎是約定。

  1. 如果您要複製它們,真的會有所作爲嗎?
  2. 如果你想切換一個呢?假設您使用新的O/R映射器。刪除NHibernate文件夾要比選擇性地刪除Rhino-Tools文件夾中的DLL要容易得多。
  3. 藉此它是合乎邏輯的結論,你就不會在你的lib文件夾中的任何文件夾組織,因爲一切使用log4net的:)
+0

如果你保留其他文件夾,你會從Rhino-Tools文件夾中刪除所有的Castle/NHibernate庫文件嗎?我想我得到的是如何組織沒有大量重複的第三方依賴關係。 – 2009-02-13 08:39:24

1

添加額外的探測路徑,您的app.config文件來定位依賴的DLL。這樣,你只需要一份你想要的東西就可以逃脫。雖然使用此功能有一些怪癖(您必須以某種方式創建文件夾結構)。查看here瞭解更多關於標籤的信息。

1

我將定義建議在每個項目樹中都有第三方或供應商文件夾。如果您發現有32個rhino-tools軟件包令人討厭,您可以在代碼庫中擁有它的一個副本,並在項目樹中對其進行外部引用。假設你正在使用SVN,你可以創建一個名爲「thirdparty libs」的存儲庫,並在這個版本庫中有版本化的副本。然後,您在項目樹中的「第三方」文件夾中創建一個外部屬性,然後依次自動檢查您的集中式第三方庫。這樣,例如,如果出現安全性或錯誤修正,只需在一個位置更新,但每個項目仍然在選擇使用哪個第三方庫和哪些版本。

關於在第三方庫的內部代表,我不介意那些。當你第一次編譯你的項目時,由於存在隱式依賴關係,一些庫不會複製到bin文件夾中,所以你可以在bin文件夾中添加一個外部屬性,然後它會自動檢查缺失的庫。這樣你仍然只需要在一個地方更新你的第三方庫。

3

這是我們試圖在Refix open source project on CodePlex中解決的一個問題。

這個想法是,Refix將解析解決方案中的所有項目,並且在項目編譯之前,將必要的二進制文件從機器上的單個本地存儲庫複製到解決方案樹中的文件夾中,並將項目指向它們。這樣,就不需要提交二進制文件。您的本地Refix存儲庫將從遠程存儲庫中提取二進制文件(我們正在設置一個存儲庫)。refixcentral.com),並且您可以爲您的團隊/部門/公司設置一箇中間人員,這個中間人員可以持有任何未集中管理的軟件。

它也將嘗試解決衝突的版本號 - 也可能是原諒不匹配的組件版本號,導致解決方案編譯但在運行時因無法加載依賴項而翻倒,因爲兩個不同版本將需要。

因此,要回答「你如何在你的.Net項目中打包外部庫」的問題,我們的願景是,你不會 - 你只需在構建腳本中包含一個Refix步驟,讓它擔心它您。

相關問題