leiningen dependency priority (1)

leiningen으로 프로젝트를 하면 필요에 따라, project.clj에 이런 저런 라이브러리를 추가하게 된다. [org.clojure/clojure "1.6.0"]와 같은 경우는 거의 항상 포함하게 되는 라이브러리다. 프로젝트에 ‘clojure 1.6.0’와 ‘abc’를 dependencies로 추가했는데, ‘abc’의 dependency로 clojure 1.4.1을 추가했다면 내 프로젝트에선 어떤 버젼의 클로져를 보고 있을까?

기본법칙 2가지

  • depth가 적은 dependency를 우선으로 한다.
[A "1.0.1"]
[B "2.0.0"]
   [A "2.0.3]

이 경우 A는 1.0.1이 쓰인다.

  • 같은 depth 프로젝트의 dependecy가 겹친다면, 먼저 쓴 것이 적용된다.
[A "1.0.1"]
  [B "1.0.1"]
[C "1.0.1"]
  [B "1.1.3"]

이 경우 B는 1.0.1이 쓰인다. C를 A앞에 두었다면 B는 1.1.3이 쓰인다.

dependency priority 를 알아야 하는 이유

두번째 예를 기준으로 살펴보자.

내가 B의 1.0.1을 쓴다는 것은, 현재 프로젝트에서 B가 쓰인다면 그 B는 1.0.1버젼의 B다. 다시 말해 C프로젝트에서 1.1.3이라고 썼지만, C는 결국 B 1.0.1을 사용하고 있는 것이다.

그럴리가 없는데 No such var: project/function 같은 에러가 나온다면, 내가 어떤 버젼의 하위 프로젝트의 함수를 쓰고 있는지 잘 고민해보자.

( 되도록이면 모든 라이브러리들이 하위 호환성을 잘 생각하고 만들었기를 빌면서.. )

Tip

1) 위와 같이 dependency depth를 트리로 살펴보는 방법. 내가 어떤 프로젝트의 어떤 버젼을 보고있는지 수 있다.

$ lein deps :tree

2) .lein/profiles.clj에 추가한 dependancy는 project.clj 이 후에 쓰여진다. 3) plugin depth는 프로젝트 dependency와 따로적용된다. ( $ lein deps :plugin-tree하면 plugin tree만 볼 수도 있다.)


Minsun Lee

clojure-bridge, drawing, trip, alien!