Solution de contournement pour l'erreur Bundler.require lors de l'exécution de ruby avec crontab

Quoi écrire dans cet article

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.

Site référencé: arc: Merci.

Conclusion

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

Qu'est-il arrivé

Arrangement de situation

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é:

Quoi qu'il en soit, je savais que ça marcherait si je cd, donc je vais essayer de l'écrire de cette façon.

/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

Solution de contournement pour l'erreur Bundler.require lors de l'exécution de ruby avec crontab
Erreur lors de la lecture avec java
Cause de l'erreur DOMA 4019 lors de la compilation avec Gradle pendant 7 jours
Étudier à CodeWar (ruby) ④ cas ~ quand
Solution de contournement pour l'erreur Xcode 12 «Inclure entre guillemets»
[Erreur] Concernant rbenv: ruby 2.5.1 n'est pas installé ot ~ lors de l'exécution du déploiement automatique
Premiers pas avec Ruby pour les ingénieurs Java
Erreur lors de la création de l'infrastructure avec l'application AWS
[Ruby / Rails] Mécanisme de nouvelle tentative d'erreur de thread
Conseils pour la gestion des erreurs de gRPC dans Ruby
[Résolution d'erreur] Se produit lors de la tentative de création d'un environnement pour le printemps avec docker
[Rails] Résolution d'erreur lors de la génération de jetons avec PAYJP
Libération: effectuer le déploiement donne le code d'erreur 400
[Docker pour Mac] Traiter l'erreur de stockage des informations d'identification
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
Spring - Evitement des erreurs / erreurs lors de la création de l'API pour POST