Tuesday, January 15, 2019

處理 Clojure 的模糊依賴 (confusing dependencies) 問題

我用 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 來手動指定/選用依賴。