J'ai vu deux techniques couramment utilisées pour ajouter le répertoire du fichier en cours d'exécution au $ LOAD_PATH (ou $ :). Je vois les avantages de faire cela au cas où vous ne travailleriez pas avec un bijou. L'un semble plus verbeux que l'autre, évidemment, mais y a-t-il une raison d'aller avec l'un plutôt que l'autre?
La première méthode verbeuse (pourrait être excessive):
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
et le plus simple, rapide et sale:
$:.unshift File.dirname(__FILE__)
Y a-t-il une raison d'aller avec l'un sur l'autre?
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}
__dir__
(à partir de Ruby 2.0) peut rendre l'un de ces éléments plus concis.Réponses:
Je dirais
$:.unshift File.dirname(__FILE__)
plutôt que l'autre, simplement parce que j'en ai vu beaucoup plus d'utilisation dans le code que celui-$LOAD_PATH
là, et c'est aussi plus court!la source
Le chemin de chargement Ruby est très couramment vu écrit comme $:, mais ce n'est pas parce qu'il est court qu'il ne l'améliore pas. Si vous préférez la clarté à l'intelligence, ou si la brièveté pour elle-même vous démange, vous n'avez pas besoin de le faire simplement parce que tout le monde l'est. Dire bonjour à ...
... et dites au revoir à ...
la source
Je n'aime pas trop la manière «rapide et sale». Tous les nouveaux utilisateurs de Ruby se demanderont ce que
$:.
c'est.Je trouve cela plus évident.
Ou si je tiens à avoir le chemin complet ...
MISE À JOUR 2009/09/10
Dernièrement, j'ai fait ce qui suit:
Je l'ai vu dans tout un tas de projets ruby différents en naviguant sur GitHub.
Semble être la convention?
la source
bin
fichier qui était toujours relatif au vôtrecode
et qu'il n'était jamais exécuté que par lebin
fichier ... bootstrap dans le bac. Si vous avez une bibliothèque, démarrez en haut de votre code de bibliothèque comme danslib/code.rb
pour accéder à tout ce qui se trouve souslib/code/
. J'espère que cette randonnée vous aidera!__dir__
peut être utilisé pour obtenir un chemin vers le répertoire du fichier courant.Si vous tapez
script/console
votre projet Rails et entrez$:
, vous obtiendrez un tableau qui comprend tous les répertoires nécessaires pour charger Ruby. Ce qu'il faut retenir de ce petit exercice, c'est qu'il$:
s'agit d'un tableau. Cela étant, vous pouvez exécuter des fonctions dessus, comme ajouter au début d'autres répertoires avec launshift
méthode ou l'<<
opérateur. Comme vous l'avez laissé entendre dans votre déclaration$:
et$LOAD_PATH
sont les mêmes.L'inconvénient de le faire de la manière rapide et sale comme vous l'avez mentionné est le suivant: si vous avez déjà le répertoire dans votre chemin de démarrage, il se répétera.
Exemple:
J'ai un plugin que j'ai créé appelé todo. Mon annuaire est structuré comme ceci:
Dans le fichier init.rb, j'ai entré le code suivant:
Notez comment je dis au bloc de code d'exécuter les actions à l'intérieur du bloc sur les chaînes 'models', 'controllers' et 'models', où je répète 'models'. (Pour info,
%w{ ... }
c'est juste une autre façon de dire à Ruby de contenir un tableau de chaînes). Quand je coursscript/console
, je tape ce qui suit:Et je tape ceci pour qu'il soit plus facile de lire le contenu de la chaîne. Le résultat que j'obtiens est:
Comme vous pouvez le voir, bien que ce soit un exemple aussi simple que je pourrais créer en utilisant un projet sur lequel je travaille actuellement, si vous ne faites pas attention, la manière rapide et sale conduira à des chemins répétés. Le chemin le plus long vérifiera les chemins répétés et s'assurera qu'ils ne se produisent pas.
Si vous êtes un programmeur Rails expérimenté, vous avez probablement une très bonne idée de ce que vous faites et ne faites probablement pas l'erreur de répéter les chemins. Si vous êtes un débutant, j'irais avec le chemin le plus long jusqu'à ce que vous compreniez vraiment ce que vous faites.
la source
load_paths
etload_once_paths.delete
sont obsolètes. Serait aidé à mettre à jour les lignes qui s'y réfèrent comme:ActiveSupport::Dependencies.autoload_paths << path
ActiveSupport::Dependencies.autoload_once_paths.delete(path)
Le mieux que j'ai rencontré pour ajouter un répertoire via un chemin relatif lors de l'utilisation de Rspec. Je le trouve assez verbeux mais aussi toujours une belle doublure.
la source
Il existe un joyau qui vous permettra de configurer votre chemin de chargement avec un code plus agréable et plus propre. Vérifiez ceci: https://github.com/nayyara-samuel/load-path .
Il a également une bonne documentation
la source
Je sais que cela fait longtemps que cette question n'a pas été posée pour la première fois, mais j'ai une réponse supplémentaire que je veux partager.
J'ai plusieurs applications Ruby qui ont été développées par un autre programmeur sur plusieurs années, et elles réutilisent les mêmes classes dans les différentes applications bien qu'elles puissent accéder à la même base de données. Comme cela enfreint la règle DRY, j'ai décidé de créer une bibliothèque de classes à partager par toutes les applications Ruby. J'aurais pu le mettre dans la bibliothèque principale Ruby, mais cela cacherait le code personnalisé dans la base de code commune, ce que je ne voulais pas faire.
J'ai eu un problème où j'avais un conflit de nom entre un nom déjà défini "profile.rb" et une classe que j'utilisais. Ce conflit n'était pas un problème jusqu'à ce que j'essaye de créer la bibliothèque de code commune. Normalement, Ruby recherche d'abord les emplacements des applications, puis va vers les emplacements $ LOAD_PATH.
Le fichier application_controller.rb n'a pas pu trouver la classe que j'ai créée et a renvoyé une erreur sur la définition d'origine car ce n'est pas une classe. Depuis que j'ai supprimé la définition de classe de la section app / models de l'application, Ruby n'a pas pu la trouver là-bas et est allée la chercher dans les chemins Ruby.
J'ai donc modifié la variable $ LOAD_PATH pour inclure un chemin vers le répertoire de la bibliothèque que j'utilisais. Cela peut être fait dans le fichier environment.rb au moment de l'initialisation.
Même avec le nouveau répertoire ajouté au chemin de recherche, Ruby lançait une erreur car il prenait de préférence le fichier défini par le système en premier. Le chemin de recherche dans la variable $ LOAD_PATH recherche de préférence les chemins Ruby en premier.
Donc, j'avais besoin de changer l'ordre de recherche pour que Ruby trouve la classe dans ma bibliothèque commune avant de rechercher les bibliothèques intégrées.
Ce code l'a fait dans le fichier environment.rb:
Je ne pense pas que vous puissiez utiliser l'une des constructions de codage avancées données auparavant à ce niveau, mais cela fonctionne très bien si vous souhaitez configurer quelque chose au moment de l'initialisation dans votre application. Vous devez conserver l'ordre d'origine de la variable $ LOAD_PATH d'origine lorsqu'elle est ajoutée à la nouvelle variable, sinon certaines des principales classes Ruby sont perdues.
Dans le fichier application_controller.rb, j'utilise simplement un
et cela charge les fichiers de bibliothèque personnalisés pour l'ensemble de l'application, c'est-à-dire que je n'ai pas à utiliser les commandes require dans chaque contrôleur.
Pour moi, c'était la solution que je recherchais, et j'ai pensé l'ajouter à cette réponse pour transmettre l'information.
la source