bundle-exec - kézikönyv, opciók, parancspéldák


NÉV

bundle-exec - Parancs végrehajtása a köteg kontextusában

SZINOPSZIS

bundle exec [--keep-file-descriptors] command

LEÍRÁS

Ez a parancs végrehajtja a parancsot, és elérhetővé teszi a [Gemfile(5)][Gemfile(5)]-ben megadott összes drágakövet követelhető számára a Ruby programokban.

Lényegében, ha normál esetben az rspec spec/my_spec.rb-hez hasonlót futtattál volna, és a [Gemfile(5)][Gemfile() fájlban megadott drágaköveket szeretnéd használni. 5)], és telepítve van a bundle install(1) bundle-install.1.html segítségével, futtassa a bundle exec rspec spec/my_spec.rb parancsot.

Ne feledje, hogy a bundle exec nem igényli, hogy a shell ` PATH-ján elérhető legyen a végrehajtható fájl.

LEHETŐSÉGEK

--keep-file-descriptors

Az Exec a Ruby 2.0-ban elkezdte elvetni a nem szabványos fájlleírókat. A jelző átadása után az exec visszatér az 1.9-es viselkedéshez, amikor minden fájlleírót átad az új folyamatnak.

CSOMAG TELEPÍTÉSE --BINSTUBS

Ha a --binstubs jelzőt használja a bundle install(1) bundle-install.1.html-ben, a Bundler automatikusan létrehoz egy könyvtárat (amelynek alapértelmezése az app_root/bin), amely tartalmazza a csomagban található gyöngyszemekből elérhető összes végrehajtható fájlt.

A --binstubs használata után a bin/rspec spec/my_spec.rb megegyezik a bundle exec rspec spec/my_spec.rb fájllal.

KÖRNYEZETI MÓDOSÍTÁSOK

A bundle exec számos módosítást végez a shell-környezetben, majd teljes egészében végrehajtja a megadott parancsot.

  • győződjön meg arról, hogy továbbra is lehetséges a bundle végrehajtása a bundle exec által meghívott parancson belül (a $BUNDLE_BIN_PATH használatával)

  • helyezze a csomag végrehajtható fájljait (például rails, rspec, rackup) tartalmazó könyvtárat a ` PATH-ra

  • győződjön meg arról, hogy ha a bundler az alhéjban van meghívva, ugyanazt a Gemfile fájlt használja (a BUNDLE_GEMFILE beállításával)

  • add hozzá a -rbundler/setup elemet a $RUBYOPT elemhez, ami biztosítja, hogy az alhéjban meghívott Ruby programok láthassák a kötegben lévő drágaköveket

A Rubygemeket is módosítja:

  • letiltja a csomagban nem szereplő további drágakövek betöltését

  • módosítsa a gem metódust no-op-ra, ha a követelményeknek megfelelő gem található a csomagban, és adjon ki Gem::LoadError-t, ha nem

  • Határozza meg a Gem.refresh értéket no-opként, mivel a forrásindex mindig lefagy a bundler használatakor, és megakadályozza, hogy a rendszerből származó drágakövek a környezetbe szivárogjanak.

  • A csomagban lévő drágakövek használatához írja felül a Gem.bin_path elemet, így a rendszer végrehajtható fájljai működnek

  • Adja hozzá a csomagban található összes drágakövet a Gem.loaded_specs mappába

Végül a bundle exec implicit módon módosítja a Gemfile.lock fájlt is, ha a zárolási fájl és a Gemfile nem egyezik. A Bundlernek szüksége van a Gemfile-re olyan dolgok meghatározásához, mint például a drágakő csoportjai, autorequire és platformok stb., és ez az információ nem kerül tárolásra a zárfájlban. A Gemfile-t és a lockfile-t szinkronizálni kell a sikeres exec csomagolásához, így a bundle exec előre frissíti a zárolási fájlt.

Betöltés

Alapértelmezés szerint, amikor exec-et próbál meg egy ruby shebang-ot tartalmazó fájlhoz kötni, a Bundler Kernel.exec helyett ezt a fájlt Kernel.exec helyett Kernel.exec . Az esetek túlnyomó többségében ez a teljesítmény javulását jelenti. Ritka esetekben ez apró mellékhatásokat okozhat (például a $0 vagy a __FILE__ pontos tartalmától való függést), és az optimalizálás letiltható a disable_exec_load beállítás.

Göngyölítés

Minden Ruby-kód, amely egy alhéjat nyit meg (például rendszer, backticks vagy %x{}), automatikusan az aktuális Bundler környezetet fogja használni. Ha olyan Ruby-parancsra van szüksége, amely nem része az aktuális csomagnak, használja a with_unbundled_env metódust egy blokkal. A blokkon belül létrehozott alhéjak a Bundler aktiválása előtt jelen lévő környezetet kapják. Például a Homebrew parancsok futtatják a Rubyt, de nem működnek egy csomagon belül:

Bundler.with_unbundled_env do
  `brew install wget`
end

A with_unbundled_env használata akkor is szükséges, ha másik csomagot vesz igénybe. Az alhéjban futtatott Bundler-parancsok az aktuális Gemfile-t öröklik, így azoknak a parancsoknak is, amelyeknek egy másik csomag kontextusában kell futniuk, a with_unbundled_env-t is használniuk kell.

Bundler.with_unbundled_env do
  Dir.chdir "/other/bundler/project" do
    `bundle exec ./script`
  end
end

A Bundler olyan kényelmi segédeszközöket biztosít, amelyek összecsomagolják a rendszert és az execet, és így használhatók:

Bundler.clean_system('brew install wget') 
Bundler.clean_exec('brew install wget')

RUBYGEMS PLUGINS

Jelenleg a Rubygems bővítményrendszer minden rubygems_plugin.rb nevű fájlt megkövetel a bármely telepített gem betöltési útvonalán, ha bármely Ruby kódhoz rubygems.rb szükséges. Ez magában foglalja a rendszerbe telepített végrehajtható fájlokat, például rails, rackup és rspec.

Mivel a Rubygems beépülő modulok tetszőleges Ruby kódot tartalmazhatnak, általában önmagukat vagy függőségeiket aktiválják.

Például a gemcutter 0.5 gem a json_pure-tól függött. Ha telepítve volt a gemcutter ezen verziója (még akkor is, ha is volt egy újabb verziója, amelynél nincs probléma), a Rubygems aktiválná a gemcutter 0.5 és a json_pure <.

Ha a Gemfile(5) a json_pure elemet (vagy a json_pure-tól függő gyöngyszemet) is tartalmazta, akkor a rendszeren lévő legújabb verzió ütközhet a Gemfile(5) vagy a Gemfile.lock pillanatképes verziójával.

Ha ez megtörténik, a csomagoló a következőt mondja:

You have already activated json_pure 1.4.6 but your Gemfile
requires json_pure 1.4.3. Consider using bundle exec.

Ebben a helyzetben szinte biztosan el akarja távolítani a mögöttes drágakövet a problémás gem plugin segítségével. Általánosságban elmondható, hogy ezeknek a bővítményeknek a szerzői (jelen esetben a gemcutter gem) újabb verziókat adtak ki, amelyek óvatosabbak a beépülő moduljaikban.

Futtatással megtalálhatja a gem plugint tartalmazó drágakövek listáját

ruby -e "puts Gem.find_files('rubygems_plugin.rb')"

Legalább a legújabb verziók kivételével távolítsa el az összes gem-bővítményt, és távolítsa el az összes nem használt gem-bővítményt is (gem uninstall gem_name).