Дали тези неща постигат точно същото?
- стартиране на ruby процес с
bundle exec ruby foo.rb
- с
require "bundler/setup"
като първи ред наfoo.rb
Дали тези неща постигат точно същото?
bundle exec ruby foo.rb
require "bundler/setup"
като първи ред на foo.rb
Във вашия конкретен пример те могат да се считат за еднакви, но в действителност не са еднакви.
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
.