물론 어떤 경우에는 애플리케이션에서 사용하는 특정 의존성만 업데이트하길
원할 수 있습니다. 예를 들어, rails
를 3.0.0
최종으로 업데이트한다고 합시다. 중요한 것은 하나의 의존성을 업데이트 해야
하기 때문에 모든 의존성을 업데이트할 필요는 없다는 점입니다. 예제의
의존성은 3개뿐이지만, 이 경우에도 모든 것을 업데이트하는 것은 귀찮은
문제의 원인이 될 수 있습니다.
설명하자면 rails 3.0.0.rc
gem은 actionpack
3.0.0.rc
gem에 의존하고 있고, 이는 다시 rack ~> 1.2.1
에
의존합니다.(>= 1.2.1
과 < 1.3.0
을 동시에 만족)
rack-cache
gem은 rack >= 0.4
에 의존합니다.
rails 3.0.0
최종 gem이 rack ~> 1.2.1
에도 의존하고
rails 3.0.0
릴리스 이후에 Rack 팀이 rack 1.2.2
를
릴리스했다고 가정해 봅시다.
레일스를 업데이트하기 위해 단순하게 모든 gem을 업데이트한다고 하면,
rails 3.0.0
과 rack-cache
의 요구사항을 모두
만족하는 rack 1.2.2
를 얻게될 것입니다. 하지만
rack 1.2.2
와 비호환일 수도 있는 rack-cache
의
업데이트는 요청한 적이 없습니다.(이유가 무엇이든 간에) 그리고 rack
1.2.1
에서 rack 1.2.2
로 업데이트 하면 아마 아무것도 망가뜨리지
않을 것입니다만, 훨씬 큰 변경에서는 비슷한 시나리오가 생길 수
있습니다.(더 자세한 논의는 밑의 [1]을 참조하세요.)
이 문제를 피하기 위해, gem을 업데이트할 때 번들러는 다른 gem이 의존하고
있는 gem의 의존성은 업데이트하지 않습니다. 이 예제의
rack-cache
가 여전히 rack
에 의존하고 있기 때문에
번들러는 rack
gem을 업데이트하지 않습니다. 이는
rails
의 업데이트가 실수로 rack-cache
를 망가트리지
않도록 보증해 줍니다. rails 3.0.0
의 의존성인 actionpack
3.0.0
이 rack 1.2.1
과 호환하기 때문에, 번들러는 그대로
두고, rack-cache
는 rack 1.2.2
와 비호환임에도
계속 동작하게 됩니다.
원래의 의존성을 rails 3.0.0.rc
로 정의했기 때문에,
rails 3.0.0
으로 업데이트하려 한다면, Gemfile
을
gem 'rails', '3.0.0'
으로 업데이트하고 다음을 실행하면 됩니다.
$ bundle install
위에서 설명한 것처럼, bundle install
명령은 항상 보수적으로
업데이트를 하고, Gemfile
에서 명시적으로 변경하지 않은
gem(또는 그 의존성)을 업데이트하지 않습니다. 이 말은 Gemfile
에서
rack-cache
를 변경하지 않았다면 번들러는 그것**과 그
의존성**(rack
)을 하나의 변경할 수 없는 단위로 취급합니다.
rails 3.0.0
이 rack-cache
와 비호환이라면 번들러는
의존성 스냅숏(Gemfile.lock
)과 업데이트된 Gemfile
사이의 충돌을 보고해 줍니다.
Gemfile
을 업데이트할 때 시스템이 모든 필요한 의존성을 가지고
있다면, 번들러는 애플리케이션을 시동할 때 Gemfile.lock
을
투명하게 업데이트해 줍니다. 예를 들어, Gemfile
에
시스템에는 이미 설치되어 있는 mysql
을 추가한 경우,
bundle install
을 실행하지 않고도 애플리케이션을 시동할 수
있고, 번들러는 "마지막으로 성공한" Gemfile.lock
스냅숏 설정을
지속합니다.
이것은 gem을 최소한의 의존성으로 추가하거나 업데이트할 때
유용합니다.(데이터베이스 드라이버, wirble
,
ruby-debug
) 이는 중요한 의존성(rails
)이 있는 gem을
업데이트 하거나 gem에 의존성이 많을 경우(rack
) 아마도 실패하게
될 것입니다. 투명하게 업데이트가 실패한 경우, 애플리케이션은 기동에
실패하게 되고 bundle install
을 실행할 때 번들러는 에러 메시지를
출력할 것입니다.
가끔 Gemfile을 수정하지 않고 의존성을 업데이트하고 싶을 때가 있습니다.
예를 들어 rack-cache
를 최신 버전으로 업데이트하고 싶다고
하면 Gemfile
에 rack-cache
의 버전을 지정하지
않았기 때문에, 아마 정기적으로 rack-cache
의 최신 버전을
얻길 원할 것입니다. 이렇게 하려면 bundle update
명령을
사용하시면 됩니다.
$ bundle update rack-cache
이 명령어는 rack-cache
와 그 의존성을 Gemfile
에서
허용하는 최신 버전으로 업데이트합니다.(이 경우, 최신 버전 사용가능) 이
명령은 다른 의존성을 수정하지 않습니다.
하지만 필요한 경우에는 다른 gem의 의존성을 업데이트할 수 있습니다. 예를
들어 rack-cache
의 최신 버전이 rack >= 1.2.2
을
의존성으로 지정하고 있다면, 번들러는 당신이 rack
의
업데이트를 시킨 적이 없더라도 rack
을 1.2.2
로
업데이트할 것입니다. 번들러가 다른 gem에 의존하는 gem을 업데이트 했다면
업데이트가 끝난 후 알 수 있습니다.
모든 gem의 가능한 최신 버전으로 업데이트하고 싶다면, 다음 명령을 실행하세요.
$ bundle update
이 명령은 Gemfile.lock
을 무시하고 의존성을 다시 해결합니다.
이렇게 하려면, git reset --hard
와 테스트 스위트를 준비해
두세요. 모든 의존성을 해결 하는 것은 놀라운 결과를 얻을 수 있습니다. 특히
마지막으로 업데이트한 후에 많은 서드 파티 패키지가 새 버전을 발표했다면
더더욱 그렇습니다.