번들 실행 레이크는 무엇을 의미합니까?


350

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

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

답변:


468

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

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

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

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

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


7
즉, 항상 번들 exec를 실행해야 함을 의미합니다. 루비 버전 관리자를 사용하여 레일에 루비와 루비를 설치했습니다.
Pradeep Sharma

11
@Edmund "번들 (bundle)"은 영어 단어로, 비슷한 것들을 의미하며 보통 깔끔하게 묶여 있습니다. 특히이 질문에서 이것은 Gems (자체가 포함 된 루비 코드 라이브러리) 그룹을 나타냅니다. 번 들러 는 여기에서 Gems를 관리하기 위해 사용하는 소프트웨어의 이름입니다. 그리고 bundleBundler가 사용하는 명령입니다.
ghoppe

2
Gemfile을 사용하여 폴더에 CD를 넣을 때마다 쉘이 Gemfile에 지정된 버전 (예 : Ruby 버전)을 자동으로 사용한다는 인상을 받았습니다. 그 가정을 바탕으로, rake db : migrate는 번들 exec없이 항상 잘 실행될 것이라고 생각했습니다. CMIIW
Pahlevi Fikri Auliya

1
@PahleviFikriAuliya .ruby-gemset프로젝트 루트에 파일 이있는 경우에만 해당됩니다 . .ruby-versionRVM을 사용하는 경우 루비 버전을 설정 하는 파일 도 있습니다 .
메기

1
링크 된 페이지는 더 이상 지정한 인용문을 언급하지 않습니다. 고마워요.
Gaurang Tandon

153

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을 사용하여 스크립트를 실행하지만 시스템 전체에 설치 한 다른 버전은 아닙니다.


9
OP : D가 선택한 것보다이 답변이 더 좋습니다. 훨씬 더 명확합니다.
mauricioschneider

1
따라서이 예제에 추가하려면 : 사람이 단순히 rake db:migrate빠져 나간 bundle exec경우 1.5.2 (최신)의 랙이있을 수있는 시스템 전체 Gemfile을 사용하여 실행됩니까?
Smokin Joe

구체적인 예를 들어 훨씬 더 나은 대답.
ahnbizcad

2
따라서 bundle exec앱의 Gemfile에있는 "앱 특정"로컬 보석을 bundle사용하고, "시스템 별"글로벌 보석을 사용합니다 (있는 경우) gem install a_certain_gem. 지역 대 세계
ahnbizcad

선택한 것보다 훨씬 나은 답변입니다.
Boon

9

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 등을 다시 시도하십시오.


2020 년에도 여전히 훌륭한 솔루션입니다.
Brateq

6

생략 할 수있는 방법이 있다는 것을 언급해야 할 것입니다 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

1

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

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

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


1

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

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

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

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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.