Je travaille sur une application Ruby déployée comme gemme. J'aimerais inclure un fichier de données en lecture seule avec le gemme et je ne suis pas sûr de savoir comment / où cela devrait être emballé p>
Pour un petit fond, cette application traite de la spécification MIDI qui inclut des centaines de valeurs constantes. Par exemple, le contrôleur "Volume du canal" est toujours identifié par la valeur 7. "Sustain" est identifié par 64. Etc etc ... dans le passé, les gens ont inclus ces valeurs comme un ensemble important de constantes dans leur code. C'est bien, mais il me semble plus approprié d'inclure ceux d'un format agnostique linguistique tel que YAML P>
Utilisation du gem_path Pour localiser le fichier YAML est laid et ne fonctionnerait pas non plus lorsque vous utilisez la bibliothèque dans un déploiement non-GEM. P>
Merci pour votre aide p>
4 Réponses :
Si vous placez ce fichier quelque part dans l'arborescence source de votre gemme, vous pouvez utiliser un chemin relatif pour le charger. D'où vous voulez le lire, vous pouvez définir le chemin comme suit: Vous pouvez utiliser le modificateur de chemin .. comme vous le feriez sur la coquille pour monter un répertoire. P> fichier.dirname (__ file__) + "/Here/is/my/file.txt" code> p> p>
Ah, ça a du sens! Je suppose que je n'ai jamais tout mis ensemble ensemble. Merci beaucoup
Merci à 5 ans et la réponse est toujours très utile.
Je ne pense pas que les rubygems rendent les affirmations sur l'endroit où vous devriez stocker des fichiers comme celui-ci. Je le mettrais sous lib / code> et faire comme @MKRMR dit. J'utiliserais
file.expand_path code>, cependant, car il est moins en tapant et corrige des problèmes occasionnels avec des symboles symboliques et des fichiers mobiles:
yaml.load_file (fichier.expand_path ('../../ MIDI_CODES .yml ', __file __)) code> p>
Merci. Je vais lire sur expand_path, mais cela ressemble à un bon conseil. Juste hors de curiosité, pourquoi lib /?
S'il s'agissait d'un fichier de configuration ou que l'utilisateur était censé le mettre à jour, je pourrais le mettre à la racine. Je regarde la structure du répertoire GEM en tant qu'interface qui expose des tests, de la documentation, de l'installation et du code GEM via des répertoires. IMHO, ce fichier de données relève le plus de près la catégorie du "code de la GEM" et devrait donc aller dans la lib /. Il dit aux autres "Ne touchez pas ceci à moins que vous codez sur ce joyau." C'est aussi ce que j'ai vu d'autres gemmes.
Il existe un emplacement spécifié pour ces fichiers. P>
/ données code> dans votre gemme li>
- Utilisez le
gem.datadir code> une méthode> pour localiser ce répertoire. LI>
ol>
Ceci semble créer un répertoire qui devrait être public. P>
Si vous voulez que ce fichier soit privé, à l'aide du fichier fichier.dirname (__ file__) + "/ chemin" code> astuce va accomplir cela. P>
Pouvez-vous prendre en charge votre réponse avec un lien vers une documentation ou une autre source de confiance qui dit que le but code> datadir code> est en effet de stocker les données statiques et prédéfinies i>, pas certaines données utilisateur. Ou quelque chose, s'il vous plaît?
Je l'ai vu dans le code source: Github.com/Rubygems/ rubygems / blob / maître / lib / rubygems.rb # L36 0 Il semble être obsolète.
Le gestionnaire de paquets Rubygems a ses fichiers statiques placés dans le répertoire lib code>. Par exemple, les certificats (
*. PEM code>) sont stockés dans
LIB / RUBYGEMS / SSL_CERTS CODE>
. Je crois qu'ils peuvent être considérés comme la source la plus faisant autorité, alors je vous recommande de faire de même. P>