Gemfile
과
Gemfile.lock
을 버전 관리하세요. 하지만 .bundle
은
각 기기에 따라 지정되므로 제외하셔야 합니다.
$ echo ".bundle" >> .gitignore $ git add Gemfile Gemfile.lock .gitignore $ git commit -m "Add Bundler support"
vendor/bundle
디렉터리에 설치하고
모든 의존성을 만족하는지 확인합니다.
$ bundle install --deployment
평상시처럼 애플리케이션 서버를 기동하면 개발 환경과 완전히 동일한 번들러 환경을 사용합니다.
bundle package
를 실행했다면 자동으로
캐시된 gem이 사용됩니다.
deploy.rb
에 추가하시기만 하면 됩니다.
require 'bundler/capistrano'
cap deploy
를 실행하시면 자동으로 원격 서버에서
배포용 옵션과 함께 bundle install
을 실행하게 됩니다.
카피스트라노 작업에서 변경할 수 있는 옵션의 목록은 cap -e bundle:install
로
보실 수 있습니다.
deploy.rb
에
다음 줄을 추가하세요.
require 'bundler/vlad'
vlad:bundle:install
작업이 사용가능하게 됩니다.
배포의 일부분으로 동작하는지 확인하세요. 예를 들면 이런 식입니다.
task "vlad:deploy" => %w[ vlad:update vlad:bundle:install vlad:start_app vlad:cleanup ]
bundle exec
을
사용하는지 확인하세요.
$ bundle exec rake db:setup
--binstubs
옵션을 사용해 설치 명령이 bundle exec
대신 사용 가능한 실행 파일 바이너리를 생성하도록 하세요.
`bundle install --deployment`
를 실행 합니다.
--without
옵션을 사용해 특정 그룹을 제외하고 싶다면 `heroku config`
을
사용하셔야 합니다.
$ heroku config:add BUNDLE_WITHOUT="test development" --app app_nameHeroku Bundler Documentation
bundle install
을 실행할 때 번들러는 (기본 값으로) gem을 시스템 gem 저장소에
설치합니다. 이 말은 gem list
에서 볼 수 있다는 의미입니다. 추가적으로
여러 애플리케이션을 개발 중이라면 각각의 애플리케이션에서 다운로드해 설치할 필요가
없습니다. 이렇게 하면 개발할 때는 편하지만 배포할 때는 다소 문제가 될 수 있습니다.
배포 시나리오에서 유닉스 사용자는 시스템 영역에 gem을 설치할 권한이 없을 것입니다.
배포하는 사용자에게 권한이 있(거나 sudo
를 사용한)다 하더라도 애플리케이션을
실행하는 사용자에게는 권한이 없을 수도 있습니다. 예를 들어 패신저는 루비 서브 프로세스를
제한된 사용자인 nobody
로 실행합니다.
배포 환경에서는 환경을 격리하는 데 보다 힘을 씁니다.(어떤 서드파티 의존성이 바뀌었을 때
배포 중에 bundle install
이 느려진다고 해도 말이죠.)
결과적으로 번들러를 --deployment
플래그와 함께 사용하면 배포환경에서 번들러를
사용하는 최선의 사례을 캡슐화합니다. 이 사례들은 번들러의 개발 기간 동안 받은 중요한
피드백뿐만 아니라, 버그 리포트를 기반으로 합니다. 버그 리포트의 대부분은 가장 적합한
배포를 위한 번들러를 구성하는 방법에 대한 오해를 반영하고 있습니다.
--deployment
플래그는 기본적으로 다음을 추가합니다.
vendor/bundle
에
설치할 것입니다. 애플리케이션 안에서 (Bundler.setup
과
Bundler.require
를 사용해) 번들러를 실행하면 번들러는 이 위치를
투명하게 기억할 것입니다.
bundle pack
을 실행한 적이 있고 vendor/cache
디렉터리가
체크인 되어있고 git gem을 가지고 있지 않다면, 번들러는 번들을 설치할 때 인터넷에
접속하지 않을 것입니다.
Gemfile.lock
스냅숏을 요청하고 없다면 실패합니다.
Gemfile
이 오래된 버전이라 하더라도 Gemfile.lock
을
갱신하지 않습니다.
카피스트라노를 사용하시고 계신다면 vendor/bundle
을
shared/vendor_bundle
의 심볼릭 링크로 만드실 수 있습니다. 이렇게 하면 번들러는
배포판 사이에 설치된 gem을 공유해 (변경되지 않았다면 배포 과정을 단축하면서) 다른
애플리케이션과 격리되는 장점은 유지 할 수 있습니다.
기본적으로 번들 디렉터리는 vendor/bundle
입니다. 그리고 배포 프로세스의 일부로
번들을 설치하면 애플리케이션을 체크아웃한 같은 유닉스 사용자들도 애플리케이션에서 필요한
서드파티 코드들이 설치되어 있는 것을 확인 할 수 있습니다. 이 말은 페신저(또는 유니콘)가
애플리케이션을 볼 수 있다면, 의존성도 볼 수 있다는 이야기입니다.
--deployment
플래그는 실제로 프로덕션에 코드를 반영하기 전에 (개발과 스테이징
환경에서) 테스트가 끝난 최신의 Gemfile.lock
을 필요로 합니다. 배포하기 전에
bundle check
를 실행해 Gemfile.lock
이 최신 상태인지 확인할 수
있습니다. 마지막으로 Gemfile
을 변경한 이후 bundle install
을 실행하고
성공적으로 애플리케이션을 부트(하거나, 테스트를 실행)했다면 항상 최신 상태임을 주의하세요.