Paket yürütme komisyonu ne anlama geliyor?


351

Ne anlama bundle exec rake db:migrategeliyor? Yoksa bundle exec rake <command>genel olarak mı?

Bunun bundleGemfile'da bir şeyleri korumaya özen gösterdiğini anlıyorum. "Exec" kelimesinin ne anlama geldiğini biliyorum. rakeYapabileceğiniz tüm farklı senaryo şeylerini koruduğunu anlıyorum ve db:migratebunun bunlardan biri olduğunu biliyorum . Tüm bu kelimelerin birlikte ne yaptığını bilmiyorum. Bir veritabanı geçişini bundleyürütmek rakeiçin neden yürütmek için kullanılmalı ?

Yanıtlar:


468

bundle execbir komut dosyasını geçerli paket bağlamında (dizininizin Gemfile'sinden ) bir komut dosyası yürütmek için kullanılan bir Bundler komutudur . script db ad ve migrate tanımlanan görev adıdır.rake db:migrate

Bu nedenle bundle exec rake db:migrate, rake komut dosyasını db:migrategeçerli paket bağlamındaki komutla yürütür .

"Neden?" Bundler sayfasından alıntı yapacağım :

Bazı durumlarda, yürütülebilir bundle execdosya sisteminize yüklenirse ve paketinizle çakışan herhangi bir mücevher çekmezse, yürütülebilir dosyalar çalıştırılmadan çalışabilir.

Bununla birlikte, bu güvenilir değildir ve önemli bir ağrının kaynağıdır. Çalışıyor gibi görünse bile, gelecekte veya başka bir makinede çalışmayabilir.


7
Bu her zaman paket exec çalıştırmamız gerektiği anlamına mı geliyor, raylara ruby ​​ve ruby ​​yüklemek için ruby ​​sürüm yöneticisini kullandım.
Pradeep Sharma

11
@Edmund Bir "paket", genellikle düzgün bir şekilde bağlanmış benzer bir grup şey anlamına gelen İngilizce bir kelimedir. Özellikle bu soruda, bir grup Gems (bağımsız yakut kod kütüphaneleri) anlamına gelir. Bundler , Gems'i yönetmek için burada kullandığımız yazılımın adıdır. Ve bundleBundler tarafından kullanılan komuttur.
ghoppe

2
Gemfile ile bir klasöre cd yaptığımızda, kabuğun otomatik olarak Gemfile'de (ör. Ruby sürümü) belirtilen sürümleri kullanacağı izlenimini edindim. Bu varsayımı temel alarak, komisyon db: migrate paket exec olmadan her zaman iyi çalışacağını düşündüm. CMIIW
Fikri Auliya

1
@PahleviFikriAuliya, yalnızca .ruby-gemsetproje kökünüzde bir dosyanız varsa doğrudur . .ruby-versionRVM kullanıyorsanız yakut sürümünüzü ayarlayan bir dosya da vardır .
Yayın

1
Bağlantı verilen sayfa artık belirttiğiniz fiyat teklifinden bahsetmiyor. Lütfen düzeltin, teşekkürler.
Gaurang Tandon

153

bundle execBir program üzerinde çalışıyorsunuz . Programın yaratıcıları, bazı mücevher sürümleri mevcut olduğunda yazdı. Gemfile programı, yaratıcıların kullanmaya karar verdiği mücevherlerin sürümlerini belirtir. Yani, komut dosyası bu mücevher sürümlerine karşı doğru çalışacak şekilde yapılmıştır.

Sistem genelinde Gemfile bu Gemfile farklı olabilir. Bu komut dosyasının iyi oynamadığı daha yeni veya daha eski mücevherleriniz olabilir. Sürümlerdeki bu fark size garip hatalar verebilir.

bundle execbu hataları önlemenize yardımcı olur. Komut dosyasını, sistem çapında Gemfile yerine komut dosyasının Gemfile dosyasında belirtilen mücevherleri kullanarak yürütür. Bazı mücevher versiyonlarını kabuk takma adlarının büyüsü ile yürütür.

Kılavuz sayfasında daha fazlasını görün .

İşte bir Gemfile örneği:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

Burada, bundle execkomut dosyasını sistem genelinde yükleyebileceğiniz başka bir sürümü değil, sürüm 2.8.3'ü kullanarak çalıştırırsınız.


9
Bu cevabı OP: D tarafından seçilenlerden daha iyi seviyorum! Çok daha net.
mauricioschneider

1
Öyleyse bu örneğe eklemek için: kişi rake db:migratedışarıda bundle execbıraktıysa, sistem çapında bir Gemfile kullanarak yürütülür ve burada 1.5.2 (en son) rafa sahip olabilir mi?
Smokin Joe

somut örneklerle çok daha iyi cevap.
ahnbizcad

2
Bu nedenle bundle exec, uygulamanızın Gemfile dosyasında "uygulamaya özgü", yerel taşlar bundlekullanır ve eğer yaptıysanız, "makineye özgü", küresel taşlar kullanır gem install a_certain_gem. yerel vs küresel
ahnbizcad

Seçilmiş olandan çok daha iyi cevap.
Boon

9

Gemfile.lock'unuz makinenizde yüklü mücevherlerin farklı sürümlerine sahip olduğunda bu çok fazla gelir. Tırmık (veya rspec veya diğerleri) çalıştırdıktan sonra aşağıdaki gibi bir uyarı alabilirsiniz:

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.

Prepending (Beklemede) bundle exec, pakete sürüm farkından bağımsız olarak bu komutu yürütmesini söyler. Her zaman bir sorun yoktur, ancak sorunlarla karşılaşabilirsiniz.

Neyse ki, bunu çözen bir mücevher var: rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

Sonra tırmık, rspec ya da her neyse deneyin.


2020'de hala harika bir çözüm.
Brateq

6

Muhtemelen, bundle execatlanmanın yolları olduğu belirtilmelidir (hepsi Michael Hartls Ruby on Rails Eğitim kitabının 3.6.1 bölümünde belirtilmiştir ).

En basit olanı, RVM'nin yeterince güncel bir versiyonunu kullanmaktır (> = 1.11.x).

RVM'nin önceki bir sürümüyle sınırlıysanız , calasyr tarafından da belirtilen bu yöntemi her zaman kullanabilirsiniz :

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

bundler_stubsDizin sonra da eklenmelidir .gitignoredosyası.

Üçüncü bir seçenek, rubygems-bundlerRVM kullanmıyorsanız gem'i kullanmaktır:

$ gem install rubygems-bundler
$ gem regenerate_binstubs

1

Komisyon görevini doğrudan çalıştırdığınızda veya bir gem'in herhangi bir ikili dosyasını yürüttüğünüzde, komutun beklendiği gibi davranacağının garantisi yoktur. Çünkü sisteminizde 1.0 sürümüne sahip aynı geminiz yüklü olabilir, ancak projenizde daha yüksek sürüm 2.0 diyelim. Bu durumda hangisinin kullanılacağını tahmin edemezsiniz.

İstenen mücevher sürümünü uygulamak için bundle exec, geçerli paket bağlamında ikili dosyayı yürütecek komutun yardımını alırsınız . Bu, bundle exec komutunu kullandığınızda bundler'ın geçerli proje için yapılandırılan gem versiyonunu kontrol etmesi ve bunu görevi yerine getirmek için kullanması anlamına gelir.

Ayrıca bin saplamaları kullanarak kullanmaktan nasıl kaçınabileceğimizi gösteren bir yazı yazdım .


1

Çok bundle execfazla kullanmadım, ama şimdi kuruyorum.

Yanlış tırmığın kullanıldığı ve problemi takip etmek için çok zaman harcadığım durumlar yaşadım. Bu, bundan kaçınmanıza yardımcı olur.

bundle execBelirli bir proje dizininde varsayılan olarak kullanabilmeniz için RVM'yi nasıl ayarlayacağınız aşağıda açıklanmıştır :

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


0

Paketleyicinin farkında olmadığı ve paketleyicinin db: migrate görevini bilmediği herhangi bir komisyon üzerinde Gemfile'nizin bir parçası olduğu komisyon kullanmak anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.