Im vorherigen Artikel habe ich über ein Shell-Skript mit Cron geschrieben und bin beim Ausführen von Ruby gestolpert. Eigentlich bin ich auf einen anderen gestoßen, also werde ich ihn ausgeben, um seinen Inhalt nicht zu vergessen. Über den Fehler, den ich beim Ausführen von "Bundler.require" in der Ruby-Datei erhalten habe.
Sie können in das Verzeichnis cd, in dem sich die Gemfile befindet, und dann ruby ausführen. Aber ich verstehe es nicht richtig.
/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
#Der Rubinprozess wird unten fortgesetzt
Das ausgeführte Skript. Wenn Sie sich die Protokolldatei ansehen, stimmt etwas nicht. ..
/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)
Es scheint nicht zu funktionieren.
Aber
cd /home/user_name/sample
ruby /tasks/test_ruby.rb
Wenn Sie ausführen, können Sie es ohne Fehler ausführen.
Ich habe nicht verstanden warum, aber
https://github.com/rubygems/bundler/blob/master/lib/bundler.rb#L173
Bundler.require
Ich beschloss zu sehen, was er tat.
bundler/lib/bundler.rb
def require(*groups)
setup(*groups).require(*groups)
end
Folgen wir dem 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
Diesmal rufe ich ohne Argumente an
@ setup = load.setup
wird wahrscheinlich aufgerufen.
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
Ich kann es überhaupt nicht als erforderlich bezeichnen. Mir ist klar, dass ein Blick nach vorne mir nur beim Lernen hilft. Ich erhalte die Fehlermeldung, dass es sich um eine private Methode handelt, die jedoch nicht wie eine private Methode aussieht. Suchen Sie nur am falschen Ort? ?? ?? ?? ??
Hinweis: Bundler ist jetzt ein Archiv. Es scheint besser zu sein, rubygems zu verwenden.
Ich werde es wieder lesen, wenn ich Zeit habe, Ich verstehe immer noch nicht genau, wo der Fehler zurückgegeben wird und warum er passiert ist. .. : enttäuscht:
/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
Ich verstehe es nicht richtig, aber es hat funktioniert. .. .. : Denken: Ich verstehe es nicht. Wochenendhausaufgaben. .. Ich werde vorerst weiter nachforschen. : Notizbuch :: Läufer:
Wenn Sie irgendwelche freundlichen Leute haben, wäre ich dankbar, wenn Sie mich in den Kommentaren wissen lassen könnten. : Bogen:
Danke fürs Lesen. : Bogen:
Recommended Posts