Pour ajouter un répertoire $LOAD_PATH (Ruby)
J'ai vu deux techniques couramment utilisées pour ajouter le répertoire du fichier actuellement en cours d'exécution à l' $LOAD_PATH (ou $:). Je vois les avantages de le faire dans le cas où vous ne travaillez pas avec un bijou. L'un semble plus détaillé que les autres, évidemment, mais est-il une raison pour aller avec l'un plutôt que l'autre?
La première, en clair méthode (peut-être exagéré):
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
et la plus simple, rapide et sale:
$:.unshift File.dirname(__FILE__)
Aucune raison d'aller avec l'un plutôt que l'autre?
- Un un peu moins verbeux version de la verbose est:
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}
- comment au sujet de la "si" clause? Comment les deux ci-dessus équivalent?
- Comme quelqu'un qui est venu ici pour essayer de comprendre comment l'utiliser, c'est super cryptique. Je ne vois pas où le nom du répertoire est à venir à partir d'exemples. Je vous serais reconnaissant si quelqu'un pouvait le faire comprendre.
- À l'aide de
__dir__
(comme de Ruby 2.0) peut faire l'un de ces plus concis.
Vous devez vous connecter pour publier un commentaire.
Je dirais aller avec
$:.unshift File.dirname(__FILE__)
sur l'autre, tout simplement parce que j'ai vu beaucoup plus de l'utilisation de l'informatique dans le code de la$LOAD_PATH
, et c'est plus court aussi!Ruby le chemin de chargement est très souvent vu écrit $: , mais juste parce que c'est court, n'en fait pas mieux. Si vous préférez la clarté de l'intelligence, ou si la brièveté de son propre bien fait de vous des démangeaisons, vous n'avez pas besoin de le faire, juste parce que tout le monde.
Bonjour à ...
... et dire au revoir à ...
Je n'aime pas trop sur le "rapide et sale" façon.
Quelqu'un de nouveau à Ruby sera réfléchissant à ce
$:.
est.Je trouve cela plus évident.
Ou si je me préoccuper d'avoir le chemin complet...
Mise à JOUR 2009/09/10
Que de la fin, j'ai été en procédant de la manière suivante:
Je l'ai vu dans un tas de différents ruby projets lors de la navigation sur GitHub.
Semble être la convention?
bin
fichier qui était toujours par rapport à votrecode
et c'est seulement exécuté par lebin
fichier... bootstrap dans la poubelle. Si vous avez une bibliothèque, puis bootstrap en haut de la vous êtes de la bibliothèque de code comme danslib/code.rb
pour obtenir l'accès à tout souslib/code/
. Espérons que cette randonnée permet de!__dir__
peut être utilisé pour obtenir un chemin vers le répertoire du fichier.Si vous tapez
script/console
dans vos Rails de projet et$:
, vous obtiendrez un tableau qui comprend tous les répertoires nécessaires au chargement de Ruby. Faut-il retenir de ce petit exercice est que$:
est un tableau. Cela étant, vous pouvez exécuter des fonctions sur elle comme ajoutant à d'autres répertoires avec launshift
méthode ou la<<
de l'opérateur. Comme vous l'implicite dans votre déclaration$:
et$LOAD_PATH
sont les mêmes.L'inconvénient de le faire de la même façon rapide et sale comme vous l'avez mentionné, c'est ceci: si vous avez déjà le répertoire dans votre chemin d'accès au démarrage, il se répète.
Exemple:
J'ai un plugin que j'ai créé appelé todo. Mon répertoire est structuré comme suit:
Dans l'init.rb fichier que j'ai entré le code suivant:
Note comment je dire le bloc de code à exécuter les actions à l'intérieur du bloc pour les cordes de "modèles", "contrôleurs", et de "modèles", où, je le répète "modèles". (Pour info,
%w{ ... }
est juste une autre façon de dire Ruby pour contenir un tableau de chaînes de caractères). Quand je lancescript/console
, je tapez la commande suivante:Et j'ai ce type de sorte qu'il est plus facile de lire le contenu de la chaîne. La sortie que je reçois est:
Comme vous pouvez le voir, si ce n'est qu'un simple exemple, j'ai pu créer tout en utilisant un projet que je suis en train de travailler, si vous ne faites pas attention à la façon rapide et sale conduira à de multiples chemins. Le plus long chemin va vérifier en cas de récidive de chemins d'accès et assurez-vous qu'ils ne se produisent pas.
Si vous avez l'expérience des Rails de programmeur, vous avez probablement une très bonne idée de ce que vous faites et susceptibles de ne pas faire l'erreur de répéter les chemins d'accès. Si vous êtes un débutant, je voudrais aller avec le plus long chemin jusqu'à ce que vous comprenez vraiment ce que vous faites.
load_paths
etload_once_paths.delete
ont été dépréciés. Il serait utile de mettre à jour les lignes qui font référence à eux comme à:ActiveSupport::Dependencies.autoload_paths << path
ActiveSupport::Dependencies.autoload_once_paths.delete(path)
Meilleur que j'ai trouver pour l'ajout d'un dir via le chemin d'accès relatif lors de l'utilisation de Rspec. Je trouve ça assez détaillé, mais aussi encore une belle doublure.
Il y a un bijou qui vous permettra de configurer votre chemin de chargement avec le plus agréable et plus propre code. Check this out: https://github.com/nayyara-samuel/load-path.
Il dispose également d'une bonne documentation
Je sais que ça a été un long temps depuis que cette question a été posée la première fois, mais j'ai plus de réponse que je veux partager.
J'ai plusieurs applications Ruby qui ont été développés par un autre programmeur sur plusieurs années, et ils ré-utiliser les mêmes classes dans les différentes applications, bien qu'ils pourraient accéder à la même base de données. Depuis cette viole SÈCHE, règle, j'ai décidé de créer une bibliothèque de classe pour être partagé par toutes les applications Ruby. J'ai pu l'avoir mis dans les principaux Ruby bibliothèque, mais qui permettrait de masquer le code personnalisé dans la base de code commune qui je n'ai pas envie de faire.
J'ai eu un problème où j'ai eu un conflit de nom entre un déjà défini le nom du profil".rb", et une classe que j'utilisais. Ce conflit n'était pas un problème jusqu'à ce que j'ai essayé de créer le code commun de la bibliothèque. Normalement, Ruby recherches de demande de lieux de la première, puis va à l' $LOAD_PATH endroits.
La application_controller.rb ne pouvait pas trouver la classe que j'ai créée, et a jeté une erreur sur la définition d'origine, car il n'est pas une classe. Depuis que j'ai enlevé la définition de la classe à partir de l'app/models section de la demande, Ruby ne pouvait pas le trouver là-bas, et est allé la chercher dans le Ruby chemins.
Donc, j'ai modifié le $LOAD_PATH variable d'inclure un chemin d'accès au répertoire de la bibliothèque, j'ai été à l'aide. Cela peut être fait dans l'environnement.rb fichier pendant la phase d'initialisation.
Même avec le nouveau répertoire ajouté au chemin de recherche, Ruby était de lancer une erreur parce qu'il a été préférentiellement de prendre le système de fichier défini par la première. Le chemin de recherche dans le $LOAD_PATH variable préférentiellement les recherches de l'Ruby chemins première.
Donc, j'avais besoin de changer l'ordre de recherche afin que Ruby trouvé la classe dans ma bibliothèque commune avant fouillé les bibliothèques intégrées.
Ce code de l'environnement.rb fichier:
Je ne pense pas que vous pouvez utiliser l'une des avancées de codage des constructions donné avant à ce niveau, mais il fonctionne très bien si vous voulez quelque chose d'installation lors de l'initialisation de temps dans votre application. Vous devez conserver l'original de l'ordre de l'original $LOAD_PATH variable lorsqu'il est ajouté à la nouvelle variable sinon certaines des principales classes Ruby se perdre.
Dans le application_controller.rb fichier, j'utilise simplement un
et charge personnalisée des fichiers de la bibliothèque pour l'ensemble de l'application, c'est à dire, je n'ai pas d'utilisation nécessitent de disposer de commandes dans chaque contrôleur.
Pour moi, c'était la solution que je cherchais, et j'ai pensé que je pourrais ajouter à cette réponse pour transmettre l'information.