¿Qué requieren: false’ en el Gemfile decir?

Hace esto:

gem 'whenever', require: false

significa que la gema necesita ser instalado, o ¿quiere esto decir que no es necesario?

  • La mayoría de las respuestas (incluyendo aceptado) son sobre Rieles que hacer el Bundler.require por defecto como yo lo entiendo. Sólo Ciro y Nesha las respuestas son correctas.
InformationsquelleAutor rafamvc | 2011-01-26

5 Kommentare

  1. 459

    Esto significa instalar la gema, pero no los llaman requieren al iniciar Bundler. Por lo que tendrá que manualmente llamada

    require "whenever"

    si quieres hacer uso de la biblioteca.

    Si usted fuera a hacer

    gem "whenever", require: "whereever"

    bundler podría descargar la joya llamado siempre, pero llamaría

    require "whereever"

    Esto se utiliza a menudo si el nombre de la biblioteca para exigir es diferente que el nombre de la gema.

    • a veces desea instalar ciertas gemas, pero usted no quiere a la carga en cada proceso. Tengo una particular tarea de rake que quiero invocar periódicamente en Heroku a través de sus schedular add-on. Esta particular tarea de rake requiere de ciertas gemas que el resto de la aplicación doensn que no necesita. Así que me :require => false estas gemas y explícitamente require "thegem" de la tarea de rake. Este sería, a continuación, guardar la memoria en la principal aplicación de los procesos y el tiempo de inicio, etc. El rendimiento de la aplicación, sin embargo, no debe ser afectado incluso si se requieren estas gemas adicionales en cada proceso.
    • «Esto es a menudo utilizado si el nombre de la biblioteca para exigir es diferente que el nombre de la joya.» – ¡Gracias! Que me ayudó a entender por qué una joya que estaba usando no era auto-obligatorio.
    • grandes puntos, sin embargo: «el rendimiento de la Aplicación, sin embargo, no debe ser afectado incluso si se requieren estas gemas adicionales en cada proceso». No creo que sea cierto. La asignación de los objetos de trabajo, y la GC tiene que ejecutar a través de todos ellos cada vez, de manera más = más lento, de acuerdo a la confreaks.com/videos/2668-gogaruco2013-measuring-ruby
    • si usted realmente // uso de las gemas. Depende de lo que estás haciendo. Yo estaba hablando en el contexto de la utilización de :require => false o no. Incluso si usted requiere la gema pero que en realidad no crear instancias de objetos que no importa, y, potencialmente, sólo afecta a los tiempos de arranque para cargar el código de la base de que la gema. E. g. Post.limit(100_000).map(&:title) destruye rendimiento, por lo que usted no hace esto. Sin embargo, estos métodos están disponibles en la memoria. En su lugar te gustaría hacer Post.limit(100_000).pluck(:title). Yo por supuesto estoy de acuerdo en que si realmente /uso/ incluye joyas, desaceleraría.
    • En la práctica, tienes razón, en general no van a importar menos que el uso de la biblioteca. Pero que requieren de una joya, al menos, cargar su archivo principal en lib, y probablemente no se requiere de su propio. Incluso si usted require 'yaml', ahora tiene la YAML módulo como un objeto en la memoria.
    • Lo que si desea establecer exigir a false y el nombre de la biblioteca es diferente a la de la gema nombre así?
    • En el caso de que usted acaba de establecer :require => false y, a continuación, en el código tienen un require 'library_name_here'
    • Un ejemplo es el de la guardia-rspec joya, de acuerdo con las instrucciones que se supone que se incluyen gem 'guard-rspec', require: false en el Guardfile, Por github.com/guard/guard-rspec
    • Hace alguna diferencia si estoy declarando una joya en un fichero Gemfile para un script en ruby, donde tengo que manualmente requieren gemas de todos modos?

  2. 71

    Utilizar :require => false cuando se desea la joya para ser instalado, pero no «necesaria».

    Así, en el ejemplo que dio:
    gem 'whenever', :require => false
    cuando alguien corre paquete de instalar el siempre gema sería instalado como con gem install whenever. Siempre que se utiliza para crear cron puestos de trabajo mediante la ejecución de una tarea rake pero no se suele utilizar desde dentro de los carriles (u otro marco si no rieles) de la aplicación.

    Así que usted puede utilizar :require => false para cualquier cosa que usted necesita para ejecutar desde la línea de comandos, pero no es necesario dentro de su código.

    • Esto podría también ser utilizado para una joya de un solo uso en un pequeño subconjunto de las solicitudes.
  3. 56

    require: false dice Bundler.require no requieren que determinados joya: la joya debe ser requerido explícitamente a través de require 'gem'.

    Esta opción hace no afectar:

    • bundle install: la gema será instalado independientemente

    • la require búsqueda en la ruta de instalación por bundler.

      Bundler añade cosas a la ruta cuando se realice cualquiera de:

      • Bundle.setup
      • que es llamado por require bundler/setup
      • que es llamado por bundle exec

    Ejemplo

    Gemfile

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

    principal.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

    A continuación, el siguiente no se plantean excepciones:

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

    En GitHub para que usted juegue con él.

    Carriles de uso

    Como se explica en el inicialización tutorial, el defecto Rails plantilla se ejecuta en el arranque:

    • 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'])

    que hace el require 'bundler/setup' y establece la ruta de acceso.

    config/application.rb hace:

    Bundler.require(:default, Rails.env)

    que en realidad requiere de las gemas.

    • Tenga en cuenta que el uso de require 'faker no podría usar la correcta versión de la gema, especialmente si usted está Gemfile puntos a un git ref.
    • es Haml diferente en el ejemplo?
  4. 8

    Siempre que se especifique una Joya en su Gemfile y ejecutar bundle install, bundler va a ir a instalar especificado joya de carga y código para que la Joya en ti app poniendo require 'whenever' de esta manera bundler será la carga de código para todas sus Joyas en su aplicación Rails, y usted puede llamar a cualquier método de cualquier Joya sin ningún tipo de dolor, como lo hace la mayoría del tiempo.

    pero Joyas como whenever, faker or capistrano son algo que no necesita en el código de la aplicación que usted necesita siempre de código en su schedule.rb archivo para gestionar los trabajos y capistrano código en deploy.rb archivo para personalizar la implementación de la receta para que usted no necesita para cargar el código para estas gemas en el código de la aplicación
    y dondequiera que usted quiere llamar a cualquier método de estas Gemas manualmente, puede requerir thsese gemas por ti mismo poniendo require "whenever" . así que pongo :require => false en tu Gemfile de estas Gemas, de esta manera bundler va a instalar la Gema pero no carga el código para que la Joya en sí mismo, puede hacerlo siempre que lo desee, simplemente poniendo como requieren de un ‘siempre’ en su caso.

  5. 1

    Para exigir a las gemas en tu Gemfile, usted tendrá que llamar Bundler.require.

    Puede evitar bundler exigir la joya con require: false, pero va a instalar y mantener la gema. Compruebe esto para una explicación más detallada.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea