我用 Clojure 的 Luminus 開發 web application 已經是第二回了。連續兩回都在剛起步的時候,就撞到了類似的問題: 模糊依賴 (confusing dependencies) 問題
這個問題是這樣子產生的:
開發軟體總是會在 project.clj 裡的 :dependencies 引用不少需要用到的函式庫。而這些函式庫在開發的時候,也往往會有自己的依賴項。當第二層之後的依賴 (implicit dependencies) 之間有重複的依賴項,而且這些依賴項的新舊版本還不同的時候,就有可能發生,因為依賴的版本最後沒有辦法自動選定出一個大家都可以共用的,而導致程式無法啟動的錯誤。
比方說:
project.clj -> A -> C [version 1.0]
project.clj -> B -> C [version 1.5]
在這個例子,C 這個依賴就是一種模糊依賴 (confusing dependencies) 。
所幸,有一個很好用的指令,可以幫我們快速地搞定這個問題:
lein deps :tree
下了這個指令,它就會秀出 project 裡所有的依賴,不論是 explicit dependency 或是 implicit dependency 。同時它還會提出建議,建議說,要適度地善用 exclusions 來手動指定/選用依賴。