Використовувати пакетні граблі exec чи просто граблі?


84

Я вивчив Rails, використовуючи лише команду rake типу rake db:migrate; однак я прочитав, що повинен використовувати bundle exec rake ...замість простого rake. Тепер я збентежений, що використовувати.

Чи повинен я використовувати bundle exec rakeзамість простого rakeчи це просто переваги? Будь-яке розуміння буде дуже вдячне! Дякую!

Відповіді:


129

bundle exec виконує команду в контексті вашого пакета.

Це означає, що він використовує дорогоцінні камені, вказані у вашому Gemfile. Більшу частину часу біг bundle exec rake fooмає такі самі результати, як якщо б ви щойно бігали rake foo, особливо якщо у вас встановлені ті самі дорогоцінні камені, що встановлені у всій системі, як у вашому Gemfile. Однак деякі програми можуть вказувати різні версії дорогоцінних каменів, ніж ті, які ви встановили по всій системі, і можуть вимагати, щоб саме ці дорогоцінні камені та версії могли працювати належним чином. Якщо ви просто працюєте без bundle exec, ви можете отримати деякі дивні помилки.

Використовуючи bundle exec гарантії того, що програма запускається із середовищем, зазначеним у gemfile, що, сподіваємось, означає, що саме середовище, в якому творці програми хочуть, щоб вона працювала, що, сподіваємось, означає, що вона повинна працювати належним чином, незалежно від того, яка дивна настройка у вас на комп'ютера.

Це в основному стандартизує середовище, в якому працює програма. Це допомагає уникнути пекла версій та значно полегшує життя.

Для отримання додаткової інформації див. Http://bundler.io/v1.3/man/bundle-exec.1.html .


4
Якщо ви втомилися постійно вводити пакунок exec, ви можете налаштувати rvm так, що це не потрібно: ruby.railstutorial.org/chapters/…
Ленс Фішер

1
Примітка: Сторінка сторінки пакета
Americo Savinon

1
Приємним побічним ефектом використання bundle execє те, що він також підкаже вам, чи варто запускати bundle installвстановлення версій дорогоцінних каменів, яких вам не вистачає, порівняно з файлом Gemfile.lock.
Jay Mitchell,

Ви це дуже добре пояснили .. Дякую.
Arup Rakshit

5

$ bundle exec rake db: migrate
Використовує версію rake, вказану в Gemfile, для виконання завдання rake db:migrate.

Але в Gemfile не вказано жодної граблі-граблі!
Так, але самоцвіт rake був встановлений як залежність якогось іншого дорогоцінного каменя - дивіться у Gemfile.lock. Тож правило повинно бути: Використовує версію rake, зазначену в Gemfile.lock.

Але Gemfile.lock не вказує конкретну версію - він вказує версію, більшу за xy!
Тоді правило має бути таким: Використовується версія rake, яка була встановлена ​​в поточному gemset.

$ rake db: мігруйте
Зазвичай, коли ви видаєте команду в командному рядку, наприклад, rake, ваша система шукає команду у списку каталогів, зазначених у вашій змінній середовища PATH. Перший каталог, що містить команду, - це версія команди, яка використовується. Щоб побачити, який це каталог, ви можете зробити:

$ which rake

Отже, якщо ви виконаєте,

$ rake db:migrate

що може використовувати інший грабель, ніж той, який ви встановили bundle install. Але навіть якщо ваша система знайде таку саму версію rake bundle exec, будь-які дорогоцінні камені, необхідні вихідному коду rake, будуть шукатись у місцях, що не входять у ваш проект. Тому існує багато способів, які просто:

$ rake db:migrate

може все зіпсувати.

Відповідно до підручника Ruby on Rails (безкоштовно в Інтернеті), розділ 3.6, якщо ви використовуєте rvm 1.11.x +, вам не потрібно вводити команди перед bundle exec.


1

запуск будь-якого позовного без bundle execRubygems завантажить останню версію дорогоцінного каменя, встановлену у вашій системі

Додавши bundle execпрефікс, замість цього виконуваний файл буде запущений у контексті вашого Gemfile.lock, що означає, що він буде запущений із використанням версії, визначеної у файлі gem.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.