manipulacion listas clases arreglos archivos ruby rubygems metaprogramming

listas - ¿Cómo obtengo una lista de archivos que han sido ''requeridos'' en Ruby?



manipulacion de archivos en ruby (2)

Aquí hay una manera de obtener todas las llamadas que se requieren. Crea este archivo: show_requires.rb

alias :orig_require :require def require s print "Requires #{s}/n" if orig_require(s) end

Entonces comienza tu aplicación con

ruby -r show_requires.rb myapp.rb

Esto produce algo como:

C:/code/test>ruby -r show_requires.rb test.rb Requires stringio Requires yaml/error Requires syck Requires yaml/ypath Requires yaml/basenode Requires yaml/syck Requires yaml/tag Requires yaml/stream Requires yaml/constants Requires date/format Requires date Requires yaml/rubytypes Requires yaml/types Requires yaml Requires etc Requires dl Requires rbreadline Requires readline

Si solo desea los requisitos de nivel superior, agregue un global para rastrear el nivel de anidamiento:

$_rq_lvl = 0 alias :orig_require :require def require s $_rq_lvl+=1 print "Requires #{s}/n" if orig_require(s) and $_rq_lvl == 1 $_rq_lvl -=1 end

Entonces obtienes:

C:/code/test>ruby -r require_test.rb test.rb Requires yaml Requires readline

Esto es puramente un experimento, pero me pregunto si es posible obtener una lista de las gemas require en el tiempo de ejecución a través de algún tipo de metaprogramación. Por ejemplo, digamos que tengo:

require ''rubygems'' require ''sinatra'' require ''nokogiri'' # don''t know what to do here

¿Cómo puedo imprimir lo siguiente en tiempo de ejecución?

this app needs rubygems, sinatra, nokogiri


No puede hacer esto exactamente, porque requerir un archivo puede requerir otros, y Ruby no puede distinguir la diferencia entre el archivo que usted solicitó y el archivo que otra persona solicitó.

Puede consultar $LOADED_FEATURES para obtener una lista de cada cosa que se ha requerido. Pero debe usar Bundler si desea especificar dependencias explícitamente.

Aquí hay una manera completamente imperfecta de adivinar los nombres de las gemas y enumerar todo:

ruby-1.9.2-p180 :001 > $LOADED_FEATURES. select { |feature| feature.include? ''gems'' }. map { |feature| File.dirname(feature) }. map { |feature| feature.split(''/'').last }. uniq.sort => ["1.9.1", "action_dispatch", "action_pack", "action_view", "actions", "active_model", "active_record", "active_support", "addressable", "agent", "array", "aws", "builder", "bundler", "cache_stores", "cancan", "cdn", "class", "client", "common", "compute", "connection", "control", "controllers", "core", "core_ext", "core_extensions", "css", "data_mapper", "decorators", "dependencies", "dependency_detection", "deprecation", "devise", "digest", "dns", "encodings", "encryptor", "engine", "errors", "excon", "ext", "failure", "faraday", "fields", "fog", "formatador", "geographer", "haml", "hash", "helpers", "heroku_san", "hmac", "hooks", "hoptoad_notifier", "html", "http", "i18n", "idna", "importers", "inflector", "initializers", "instrumentation", "integrations", "interpolate", "interval_skip_list", "jquery-rails", "json", "kaminari", "kernel", "lib", "mail", "metric_parser", "mime", "mixins", "model_adapters", "models", "module", "mongo_mapper", "mongoid", "multibyte", "new_relic", "node", "nokogiri", "numeric", "oauth", "object", "omniauth", "orm_adapter", "package", "parser", "parsers", "plugin", "pp", "providers", "queued", "rack", "rails", "railtie", "redis", "request", "request_proxy", "resp ruby-1.9.2-p180 :008 >onse", "resque", "retriever_methods", "routing", "ruby_extensions", "ruby_flipper", "rubygems", "runtime", "samplers", "sass", "sax", "script", "scss", "selector", "sequel", "ses", "shell", "signature", "simple_geo", "state_machine", "stats_engine", "storage", "strategies", "string", "tar_reader", "template", "terremark", "thor", "tokens", "tree", "treetop", "twitter", "us", "util", "vendor", "version_specific", "visitors", "warden", "xml", "xml_mini", "xpath", "xslt"]