2013-03-06 61 views
0

我不確定問題的標題是否正確,但請閱讀問題。爲什麼我們需要依賴管理的複雜性

我一直工作在C/C++對我的工作生活中的大部分(近11年)。我們只有C/C++源文件/頭文件,並且所有依賴項都由Makefiles管理。事情很簡單,易於管理。

過去1.5年我已經轉移到Java域。我覺得非常惱火與任何新工作的最困難的方面是依賴經理。例如maven,leiningen,builder,sbt等等等等。當我從開源世界下載任何新東西時,只需要花費大量時間來設置編譯,構建和運行環境,就可以使用它。當我使用eclipse時也是如此。爲什麼不能將所有的依賴關係與要下載的軟件一起放置?爲什麼諸如maven,leiningen等的工具必須單獨建立互聯網來下載依賴關係。我知道maven構成一個本地存儲庫,並且應該能夠在本地找到依賴關係,因爲它總是下載整個互聯網,但爲什麼會使用這個模型。我位於防火牆之後,並非一切都可以訪問,並且這些工具無法下載依賴關係。我相信在大多數工作環境中都存在同樣的情況。

最近,我開始使用Clojure,和男孩它已經爲Clojure的獲得日食配置有疼痛感。 Leiningen應該是一些必須用於任何clojure開發的魔法。有時候感覺學習leiningen比學習clojure概念更重要。我爲leiningen下載了所謂的「獨立」jar文件,因爲「自我安裝」不適合我。但它騙了我。只要我運行'lein'命令它正在互聯網連接,並試圖下載一些東西。爲什麼?它甚至不會打印幫助菜單,而無需連接互聯網。爲什麼?我不能繞過我的互聯網防火牆來滿足它的要求,因爲我不知道,也沒有人能告訴我這個傢伙想要什麼。根本沒有別的辦法。

而且每個人似乎都在發明自己的。 Java有螞蟻,這很簡單,去了Maven,一些項目使用基於Ruby的Builder,Clojure有leiningen,Scala有。去有別的東西。爲什麼?爲什麼我們需要在一個已經充滿複雜性的世界中增加複雜性。爲什麼不能有一個工具。

所有您在Java技術方面的專家,請原諒我的咆哮。我相信這個問題將會由於一些不努力去理解事情的人而被低估和封閉。但請相信我,我已經花了足夠的時間與這種不必要的複雜性作鬥爭。

我只是想知道別人是如何解決這個問題,或者我是唯一一個不幸面臨這些問題。

+4

「我確信這個問題將會由於一些不努力去理解這些事情的人而被低估和關閉」。我們回答具體的問題。我相信這是很痛苦的,但是你需要將你的問題形成一些有可能被回答的問題。這,不能。 – Dmitry 2013-03-06 10:05:38

+0

問題是爲什麼我們需要這種複雜的依賴關係管理,而且我是唯一面臨這些問題的人。如果其他人正面臨這些問題,這件事可以做些什麼。謝謝你的評論。 – weima 2013-03-06 10:13:11

+0

有許多問題可以解決,但太多問題無法解決。例如,如果您嘗試在不包含的情況下使用std :: cout <<字符串,則C++會吐出垃圾。再次,這更像是一個哲學問題,複雜性在這裏停留。 – Dmitry 2013-03-06 10:15:21

回答

2

我想這個問題不能接受答案。我虛心向你提供元素,希望他們能幫助你對問題有一些瞭解。

主要有2個問題我認同的Java構建系統:

  • 他們中的一些聲明,而別人都在用腳本
  • 的Java工具用於建築碎片和行使控制依賴於人和Java領域的管理,而不是技術選擇。

Maven是以標準方式使用形式語法定義構建方法的重中之重。你的朋友。xml文件包含的不僅僅是你的構建:它是你的工件,項目元數據,模塊和插件的身份。它特別關注依賴和聲明的聲明。 Maven是聲明式的。

對於特定人羣的程序員來說,這很好,而且他們不會經常創建新項目。它隨着時間的推移運行良好,它很好地鞏固了構建。

Ant是一個不同的系統,您可以定義將按特定順序鏈接執行的任務。所有定義都是使用XML製作的,實際上,您正在編寫腳本並聲明它們將如何拼接在一起。構建者(完全公開:我是一個提交者)是一種構建系統,它創建於處理聲明式方法效率低下的沮喪情況,這種情況下構建需要做額外的步驟和複雜的測試以及剛性爲構建使用XML。它是基於腳本的,通過配置實施約定(期望幾個很好的默認設置,但是如果你需要改變的話可以讓你開車)。

我對Gradle和SBT並不熟悉,但我認爲他們擴展並基於這種方法,從我所聽到的。

因此,這給你我希望更好地瞭解構建工具的景觀。

沒有標準構建工具出現的原因可能與Sun沒有推出Java的原因有關。最終,我認爲他們採用了Ant(我有一些大多數JSR jar都是用它構建的)。在這個領域還有一些產品擴展了這些構建系統;在維護代碼的人之間總是會有巨大的差異,而不是在旁邊。人們爭辯說,嗯,人們爭論不休。構建系統是啓動火焰戰爭的好方法。我們很難同意一個標準,但現在一些常見的元素現在可以很好地解決Maven的工件問題。

而對於需要在下載Internet一遍又一遍,這是一個相當長的故事,但這裏有可能觸發不必要的下載需要的幾件事情:

  • 任何依賴的使用SNAPSHOT會嘗試獲取最新的快照。這是一個偉大的計劃,但它收費。你可能依賴於依賴快照的東西,並因此而下載。

  • Maven不會重新下載工件,但有時會檢查md5。這很容易解決,只需使用命令行中的-O選項即可。

像Buildr這樣的工具是圍繞這個問題一勞永逸地構建的。首先,你只下載你所說的話。其次,除非你提出要求,否則不會再有聯繫。默認情況下,Buildr不會玩傳遞依賴關係遊戲,雖然你可以問它,但你必須明確地做。

我希望這是內容豐富的,你在爪哇的土地之旅將變得不那麼痛苦。