Dans l'article précédent, j'ai écrit sur ce que j'ai appelé un script shell avec cron et j'ai trébuché lors de l'exécution de ruby.
En fait, je suis tombé sur un autre, donc je vais le sortir pour ne pas oublier son contenu.
À propos de l'erreur que j'ai eue en faisant Bundler.require
dans le fichier ruby.
Vous pouvez accéder au répertoire où se trouve le Gemfile, puis exécuter ruby. Mais je ne comprends pas bien.
/home/user_name/ruby_test.sh
#!/bin/bash
cd /home/user_name/sample && ruby /home/user_name/sample/tasks/test_ruby.rb
crontab
00 13 * * * /bin/bash /home/user_name/ruby_test.sh > /home/user_name/log/ruby_test.log 2>&1
/home/user_name/ruby_test.sh
#!/bin/bash
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
rbenv shell 2.7.1
ruby /home/user_name/sample/tasks/test_ruby.rb
/home/user_name/sample/tasks/test_ruby.rb
require 'bundler/setup'
Bundler.require
#Le processus du rubis se poursuit ci-dessous
Le script exécuté. En regardant le fichier journal, il y a un problème. ..
/home/user_name/log/ruby_test.log
/home/user_name/sample/tasks/test_ruby.rb:2:in `<main>': private method `require' called for Bundler:Module (NoMethodError)
Cela ne semble pas fonctionner.
Mais
cd /home/user_name/sample
ruby /tasks/test_ruby.rb
Si vous exécutez, vous pouvez l'exécuter sans aucune erreur.
Je n'ai pas compris pourquoi, mais
https://github.com/rubygems/bundler/blob/master/lib/bundler.rb#L173
Bundler.require
J'ai décidé de voir ce qu'il faisait.
bundler/lib/bundler.rb
def require(*groups)
setup(*groups).require(*groups)
end
Suivons ce qu'est "setup".
https://github.com/rubygems/bundler/blob/35be6d9a603084f719fec4f4028c18860def07f6/lib/bundler.rb#L139
bundler/lib/bundler.rb
def setup(*groups)
# Return if all groups are already loaded
return @setup if defined?(@setup) && @setup
definition.validate_runtime!
SharedHelpers.print_major_deprecations!
if groups.empty?
# Load all groups, but only once
@setup = load.setup
else
load.setup(*groups)
end
end
Cette fois, j'appelle sans arguments
@ setup = load.setup
est susceptible d'être appelé.
bundler/lib/bundler.rb
def load
@load ||= Runtime.new(root, definition)
end
bundler/lib/bundler/runtime.rb
def setup(*groups)
@definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen_bundle?
groups.map!(&:to_sym)
# Has to happen first
clean_load_path
specs = groups.any? ? @definition.specs_for(groups) : requested_specs
SharedHelpers.set_bundle_environment
Bundler.rubygems.replace_entrypoints(specs)
# Activate the specs
load_paths = specs.map do |spec|
unless spec.loaded_from
raise GemNotFound, "#{spec.full_name} is missing. Run `bundle install` to get it."
end
check_for_activated_spec!(spec)
Bundler.rubygems.mark_loaded(spec)
spec.load_paths.reject {|path| $LOAD_PATH.include?(path) }
end.reverse.flatten
Bundler.rubygems.add_to_load_path(load_paths)
setup_manpath
lock(:preserve_unknown_sections => true)
self
end
Je ne peux pas l'appeler exigé en premier lieu. Je réalise que regarder vers l'avenir ne fera que m'aider à étudier. J'obtiens une erreur disant que c'est une méthode privée, mais cela ne ressemble pas à une méthode privée. Cherchez-vous juste au mauvais endroit? ?? ?? ?? ??
Remarque: Bundler est désormais une archive. Il semble préférable d'utiliser rubygems.
Je le relirai quand j'aurai le temps, Je ne comprends toujours pas exactement où l'erreur est renvoyée et pourquoi elle s'est produite. .. : désappointé:
/home/user_name/ruby_test.sh
#!/bin/bash
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
rbenv shell 2.7.1
cd /home/user_name/sample && ruby /home/user_name/sample/tasks/test_ruby.rb
Je ne comprends pas bien, mais cela a fonctionné. .. .. : penser: je ne comprends pas. Devoirs du week-end. .. Je continuerai d'enquêter pour le moment. : notebook :: runner:
Si vous avez des personnes aimables, je vous serais reconnaissant de bien vouloir me le faire savoir dans les commentaires. : arc:
Merci pour la lecture. : arc:
Recommended Posts