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만 볼 수도 있다.)