Bundle exec и изискват „bundler/setup“ еквивалентни ли са?

Дали тези неща постигат точно същото?

  • стартиране на ruby ​​процес с bundle exec ruby foo.rb
  • с require "bundler/setup" като първи ред на foo.rb

person Michiel de Mare    schedule 20.06.2012    source източник


Отговори (1)


Във вашия конкретен пример те могат да се считат за еднакви, но в действителност не са еднакви.

bundle exec прави някои промени в средата, които bundler/setup не прави. Ако вашият foo.rb никога не изпълнява подобвивка или никога не се опитва да изпълни други ruby ​​изпълними файлове в подобвивки, тогава и двете версии са еквивалентни (и двете ще заредят пакетните скъпоценни камъни правилно и ще работят по същия начин).

Цялата идея с bundle exec е да ви даде възможност да изпълните изпълними файлове, които първоначално не са проектирани с мисъл за групиране. Като rspec, rails, rackup. Ако вашето собствено приложение (foo.rb) не се опитва да изпълнява такива изпълними файлове, които може да зависят от вашите пакети, тогава няма значение и в двата случая. Тъй като всичко, което искате да сте сигурни с bundler, е, че зареждате правилните скъпоценни камъни и за това bundler/setup работи точно както се очаква във вашия случай.

От документите за пакетиране, когато говорим за стартиране на изпълними файлове на системата Ruby:

В някои случаи стартирането на изпълними файлове без bundle exec може да работи, ако изпълнимият файл е инсталиран във вашата система и не изтегля никакви скъпоценни камъни, които са в конфликт с вашия пакет.

Това обаче е ненадеждно и е източник на значителна болка. Дори и да изглежда, че работи, може да не работи в бъдеще или на друга машина.

След това от man страницата на bundle exec можете да получите някои допълнителни улики за това какво всъщност прави bundle exec:

МОДИФИКАЦИИ НА ОКОЛНАТА СРЕДА

  • уверете се, че все още е възможно да платите за пакет от вътре в команда, извикана от bundle exec (използвайки $BUNDLE_BIN_PATH)
  • поставете директорията, съдържаща изпълними файлове (като rails, rspec, rackup) за вашия пакет на $PATH
  • уверете се, че ако bundler се извика в подобвивката, той използва същия Gemfile (чрез настройка BUNDLE_GEMFILE)
  • добавете -rbundler/setup към $RUBYOPT, което гарантира, че Ruby програмите, извиквани в подобвивката, могат да видят скъпоценните камъни в пакета

Така че, ако създавате приложението си с поддръжка за пакетиране, тогава никога не е необходимо да bundle exec приложението си.

Но ако трябва да използвате други инструменти, които зареждат кода на вашето приложение, което може да зареди скъпоценни камъни, преди да заредят кода на вашето приложение (което след това може да изтегли грешен непакет скъпоценен камък) , тогава трябва да използвате bundle exec.

person Casper    schedule 20.06.2012