Che cosa significa "richiesto: falso" in Gemfile?


429

Fa questo:

gem 'whenever', require: false

significa che la gemma deve essere installata o significa che non è necessaria?


1
La maggior parte delle risposte (inclusa quella accettata) riguarda le Rails che eseguono le Bundler.requireimpostazioni predefinite come ho capito. Solo le risposte di Ciro e Nesha sono corrette.
Nakilon,

Risposte:


472

Questo significa installare la gemma, ma non chiamare Require quando si avvia Bundler. Quindi dovrai chiamare manualmente

require "whenever"

se vuoi usare la libreria.

Se dovessi farlo

gem "whenever", require: "whereever"

quindi il bundler scaricava la gemma chiamata ogni volta, ma chiamava

require "whereever"

Questo viene spesso usato se il nome della libreria da richiedere è diverso dal nome della gemma.


112
@VenkatD. a volte vuoi installare certe gemme ma non vuoi caricarle in ogni processo. Ho un particolare compito di rake che voglio invocare periodicamente su Heroku attraverso il loro componente aggiuntivo pianificato. Questa particolare attività di rake richiede alcune gemme che il resto dell'applicazione non ha bisogno. Quindi ho :require => falsequeste gemme particolari ed esplicitamente require "thegem"dal compito del rastrello. Ciò risparmierebbe quindi memoria nei principali processi dell'app e nei tempi di avvio, ecc. Le prestazioni dell'app, tuttavia, non dovrebbero essere influenzate anche se sono necessarie queste gemme aggiuntive in ogni processo.
Michael van Rooijen,

5
@MichaelvanRooijen - ottimi punti, tuttavia: "Le prestazioni dell'app, tuttavia, non dovrebbero essere influenzate anche se hai bisogno di queste gemme aggiuntive in ogni processo". Non penso sia vero. L'allocazione degli oggetti richiede lavoro e il GC deve scorrere tutti loro ogni volta, quindi più = più lento, secondo confreaks.com/videos/2668-gogaruco2013-measuring-ruby
Nathan Long,

1
@MichaelvanRooijen - In pratica, hai ragione, in genere non importa se non usi la libreria. Ma richiedere una gemma caricherà almeno il suo file principale in lib, e probabilmente lo farà di più. Anche se tu require 'yaml', ora hai il YAMLmodulo come oggetto in memoria.
Nathan Long,

2
Cosa succede se si desidera impostare il requisito su false e anche il nome della libreria è diverso dal nome della gemma?
Peter-Jan Celis,

2
@ Peter-JanCelis In quel caso avresti appena impostato :require => falsee poi nel tuo codice hai unrequire 'library_name_here'
Rob Di Marco

73

Si utilizza :require => falsequando si desidera installare la gemma ma non "richiesto".

Quindi nell'esempio che hai dato: gem 'whenever', :require => false quando qualcuno esegue bundle installa il gemma ogni volta che verrebbe installato come con gem install whenever. Ogni volta che viene utilizzato per creare processi cron eseguendo un'attività rake ma di solito non viene utilizzato dall'applicazione rails (o altro framework se non rails).

Quindi puoi usarlo :require => falseper tutto ciò che devi eseguire dalla riga di comando ma che non è necessario nel tuo codice.


6
Questo potrebbe anche essere usato per una gemma che usi solo in un piccolo sottoinsieme di richieste.
Nathan Long,

61

require: falsedice di Bundler.requirenon richiedere quella gemma specifica: la gemma deve essere richiesta esplicitamente tramite require 'gem'.

Questa opzione non influisce su:

  • bundle install: la gemma verrà installata indipendentemente

  • il requirepercorso di ricerca impostato dal bundler.

    Il bundler aggiunge elementi al percorso quando si esegue una delle seguenti operazioni:

    • Bundle.setup
    • che viene chiamato da require bundler/setup
    • che viene chiamato da bundle exec

Esempio

Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

main.rb

# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end

# The Bundler object is automatically required on `bundle exec`.
Bundler.require

Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end

# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker

Quindi quanto segue non genererà eccezioni:

bundle install --path=.bundle
bundle exec ruby main.rb

Su GitHub per farti giocare.

Utilizzo delle rotaie

Come spiegato nel tutorial di inizializzazione , il modello Rails predefinito viene eseguito all'avvio:

  • config/boot.rb
  • config/application.rb

config/boot.rb contiene:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

che esegue require 'bundler/setup'e imposta il percorso richiesto.

config/application.rb fa:

Bundler.require(:default, Rails.env)

che in realtà richiede le gemme.


Si noti che l'utilizzo require 'fakerpotrebbe non utilizzare la versione gem corretta, in particolare se Gemfile punta a un riferimento git.
dazonico,

@dazonic è diverso da Haml nell'esempio?
Ciro Santilli 2 冠状 病 六四 事件 法轮功

9

Ogni volta che specifichi una gemma nella tua Gemfileed esegui bundle install, il bundler andrà ad installare la gemma specificata e caricherà il codice per quella gemma nella tua app mettendo in require 'whenever'questo modo il bundler caricherà il codice per tutte le gemme nella tua app Rails e potrai chiamare qualsiasi metodo da qualsiasi gemma senza alcun dolore, come fai la maggior parte delle volte.

ma le gemme come whenever, faker or capistrano sono qualcosa di cui non hai bisogno nel codice dell'app che ti serve ogni volta che il codice nel schedule.rb file per gestire i croni e il codice capistrano nel deploy.rb file per personalizzare la ricetta di distribuzione, quindi non è necessario caricare il codice per queste gemme nel codice dell'app e ovunque tu sia vuoi chiamare qualsiasi metodo da queste gemme che puoi richiedere manualmente queste gemme da solo mettendo require "whenever" . quindi inserisci il :require => falsetuo Gemfile per queste gemme, in questo modo il bundler installerà quella gemma ma non caricherà il codice per quella gemma stessa, puoi farlo ogni volta che vuoi semplicemente inserendo come "quando" nel tuo caso.


2

Per richiedere le gemme nel tuo Gemfile, dovrai chiamare Bundler.require .

Puoi impedire al bundler di richiedere la gemma require: false, ma installerà e manterrà comunque la gemma. Dai un'occhiata per una spiegazione più dettagliata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.