[ruby-on-rails] 번들 실행 레이크는 무엇을 의미합니까?

무슨 bundle exec rake db:migrate뜻입니까? 아니면 그냥 bundle exec rake <command>일반적으로?

나는 bundleGemfile의 것들을 관리 한다는 것을 이해합니다 . “exec”라는 단어의 의미를 알고 있습니다. 나는 rake당신이 할 수있는 모든 다른 대본 을 유지 한다는 것을 이해하고 , 그것이 그 db:migrate중 하나 라는 것을 알고 있습니다. 나는이 모든 단어들이 함께 무엇을하는지 모른다. 데이터베이스 마이그레이션 bundle을 실행 rake하기 위해 실행 해야하는 이유는 무엇 입니까?



답변

bundle execA는 Bundler 프로그램의 현재 번들 (디렉토리의에서 하나의 맥락에서 스크립트를 실행하는 명령 Gemfile ). rake db:migrate여기서 db 는 네임 스페이스이고 migrate 는 정의 된 작업 이름입니다.

따라서 현재 번들의 컨텍스트 bundle exec rake db:migrate에서 명령 db:migrate으로 레이크 스크립트를 실행합니다 .

“왜?”에 관해서 번 들러 페이지 에서 인용하겠습니다 .

경우에 따라 실행 파일이 bundle exec시스템에 설치되어 번들과 충돌하는 gem을 가져 오지 않으면 실행 파일 없이도 실행 파일 이 작동하지 않을 수 있습니다.

그러나 이것은 신뢰할 수 없으며 상당한 고통의 원천입니다. 작동하는 것처럼 보이지만 나중에 또는 다른 시스템에서 작동하지 않을 수 있습니다.


답변

bundle exec프로그램에서 실행 중 입니다. 프로그램 제작자는 특정 버전의 보석을 사용할 수있을 때 작성했습니다. Gemfile 프로그램은 제작자가 사용하기로 결정한 gem의 버전을 지정합니다. 즉,이 gem 버전에 대해 스크립트가 올바르게 실행되도록 만들어졌습니다.

시스템 전체의 Gemfile은이 Gemfile과 다를 수 있습니다. 이 스크립트가 잘 작동하지 않는 새롭거나 오래된 보석이있을 수 있습니다. 이 버전의 차이로 인해 이상한 오류가 발생할 수 있습니다.

bundle exec이러한 오류를 피하는 데 도움이됩니다. 시스템 전체의 Gemfile 대신 스크립트의 Gemfile에 지정된 gem을 사용하여 스크립트를 실행합니다. 쉘 별명을 사용하여 특정 gem 버전을 실행합니다.

매뉴얼 페이지 에서 자세한 내용을 참조 하십시오 .

Gemfile의 예는 다음과 같습니다.

source 'http://rubygems.org'

gem 'rails', '2.8.3'

여기서는 bundle execRails 버전 2.8.3을 사용하여 스크립트를 실행하지만 시스템 전체에 설치 한 다른 버전은 아닙니다.


답변

gemfile.lock에 머신에 다른 버전의 gem이 설치되어있을 때 많이 나타납니다. 레이크 (또는 rspec 또는 기타)를 실행 한 후 다음과 같은 경고가 표시 될 수 있습니다.

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

앞에 추가 bundle exec하면 버전 차이에 관계없이 번 들러 가이 명령을 실행하도록 지시합니다. 항상 문제가있는 것은 아니지만 문제가 발생할 수 있습니다.

다행히도이를 해결하는 보석이 있습니다 : rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

그런 다음 갈퀴, rspec 등을 다시 시도하십시오.


답변

생략 할 수있는 방법이 있다는 것을 언급해야 할 것입니다 bundle exec(모두 Michael Hartls Ruby on Rails Tutorial 책의 3.6.1 장에 나와 있습니다 ).

가장 간단한 방법은 충분히 최신 버전의 RVM (> = 1.11.x)을 사용하는 것입니다.

이전 버전의 RVM으로 제한되어 있으면 언제든지 calasyr에서 언급 한이 방법을 사용할 수 있습니다 .

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

bundler_stubs디렉토리는 또한 추가해야합니다 .gitignore파일.

세 번째 옵션은 rubygems-bundlerRVM을 사용하지 않는 경우 gem 을 사용하는 것입니다 .

$ gem install rubygems-bundler
$ gem regenerate_binstubs


답변

레이크 작업을 직접 실행하거나 gem의 이진 파일을 실행할 때 명령이 예상대로 작동한다고 보장 할 수 없습니다. 버전 1.0은 시스템에 동일한 gem이 설치되어 있지만 프로젝트에는 2.0이라는 높은 버전이있을 수 있습니다. 이 경우 어떤 것을 사용할지 예측할 수 없습니다.

원하는 gem 버전을 적용하려면 다음을 수행하십시오. bundle exec 현재 번들의 컨텍스트에서 바이너리를 실행하는 명령을 사용하십시오. 번들 번들을 사용할 때 번 들러는 현재 프로젝트에 대해 구성된 gem 버전을 확인하고이를 사용하여 작업을 수행합니다.

또한 bin 스텁을 사용하여 사용하지 않는 방법을 보여주는 게시물 도 작성했습니다 .


답변

bundle exec많이 사용 하지는 않았지만 지금 설정 중입니다.

잘못된 갈퀴를 사용하고 문제를 추적하는 데 많은 시간이 낭비되는 사례가 있습니다. 이를 피하는 데 도움이됩니다.

bundle exec특정 프로젝트 디렉토리 내에서 기본적으로 사용할 수 있도록 RVM을 설정하는 방법은 다음과 같습니다 .

https://thoughtbot.com/blog/use-bundlers-binstubs


답변

이는 번 들러가 인식하지 못하고 db : migrate 태스크를 실행하지 않는 모든 레이크에 대해 번 들러가 인식하고 Gemfile의 일부인 레이크를 사용함을 의미합니다.