2010-01-02 8 views
5

Ich möchte Ruby-Anwendung (nicht Schienen) erstellen. Dies ist eine Konsolen-App, die einige Daten beibehalten muss. Ich verwende pstore als Datenbank. Ich möchte diese Anwendung als ein Juwel bereitstellen.Ruby Gems mit persistenten Daten

Meine Frage ist: Wo leben meine Daten?

Derzeit habe ich ein Datenverzeichnis als Geschwister zum bin-Verzeichnis in einem Standard-Edelstein-Layout erstellt. Ich würde daher erwarten, dass der Edelstein seine Daten "in sich selbst" speichert, nachdem er eingesetzt wurde. Aber wenn ich ein lokales Juwel installiere, um zu testen, finde ich, dass die Daten lokal in den Projektdateien gespeichert werden, nicht irgendwo innerhalb des Edelsteinverzeichnisses.

Natürlich könnte es mir einfach missverstehen, was "Rake install_gem" macht. Außerdem bin ich vage besorgt, dass, wenn ich sudo installieren muss, das gem, dass es tatsächlich in der Lage sein wird, die Datendatei "in sich selbst" in dem Gem-Verzeichnis zu erstellen.

Kann jemand das ein wenig klären?

Vielen Dank. John Schank

@makevoid - danke für die Antwort. Hier ist die Gesamtheit meines Hauptskriptes. In/ist ... (Ich habe es auf die Hauptfrage, weil ich bin nicht vertraut mit, wie Inhalte in einem Kommentar zu formatieren - und der eingefügte Code sah schrecklich

#!/usr/bin/env ruby 

$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib' 

require 'timesheet' 

begin 
    command_hash = TimesheetParser.parse 
    store = YAML::Store.new("data/time_entries.yaml") 
    tl = TimeLog.new(store) 
    ts = Timesheet.new(tl) 
    ts.process(command_hash) 
rescue Exception => e 
    raise if command_hash[:debug] 
    puts e.message 
+0

können Sie uns ausdrucken und uns den Pfad mitteilen, wo Ihre PStore-Datei gespeichert wird? Ist das in Ihrem primären Edelstein-Ladepfad? (* gem env * um es herauszufinden) – makevoid

+0

Ich fügte die Details zum ursprünglichen Beitrag hinzu, weil Kommentare nicht so reichhaltige Bearbeitungsfähigkeiten zu haben scheinen – jschank

+0

OK, so sieht es so aus, als ob ich die von Johannes gepostete Antwort verwenden möchte suche wahrscheinlich nach ENV ["timesheet_home"], damit Benutzer den Standort überschreiben können, auf ENV ["HOME"] und einen Standardstandort wie in Johannes 'Antwort zurückgreifen können. Und scheitern mit einer Erklärung, wenn keine festgelegt ist. Danke, jeder, der geantwortet hat! – jschank

Antwort

11

Unter Linux gibt es zwei häufig. gebrauchte Stellen für variable Daten zu speichern.

/home/user/.application

Wenn jeder Interessent benötigt eigenen Speicher ist in der Regel im Benutzerverzeichnis. der Pfad für die Speicherung im Benutzerverzeichnis getan, um dieses ist, sollte be

ENV["HOME"] + "/." + $application_name 

/var/lib/Anwendung

Wenn alle Benutzer die Speicher gemeinsam benutzen, oder die Anwendung sollte nur von einem Benutzer (die meisten Daemons) ausgeführt werden,/var ist der richtige Ort alle Arten von Daten zu speichern.

  • /var/log für Protokolle
  • /var/run für PIDs
  • /var/lock für Lockdateien
  • /var/www für httpservers
  • /var/tmp für nicht wichtig, aber persistenten Daten
  • /var/lib für alle anderen Daten

Der Pfad für die Speicherung in/var

"/var/lib/" + $application_name 

Vergewissern Sie sein sollte, sind die Berechtigungen für dieses Verzeichnis so, dass Sie Ihre Anwendung als root ausführen lassen Sie sich nicht müssen.

+0

Ich hatte daran gedacht, so etwas zu tun, aber ich war besorgt, dass es unter Windows nicht funktionieren würde. Gibt es eine andere Wendung zu diesem Thema, um es plattformübergreifend zu machen? oder wird diese technik auch an windows funktionieren? (Ist Windows eine Umgebungsvariable "HOME" vordefinieren?) – jschank

+0

Auch lese ich das richtig, in dem die appdata in einem dotfile-Verzeichnis in den Benutzerraum geht, aber in geteilten es geht in einen non-dotfile-Ordner für/var/lib? oder sollte das /var/lib/.application sein? Danke! John – jschank

+0

Das stimmt. Dotfiles sind versteckte Dateien in Unix. Daher sieht der Benutzer diese Konfigurationsdateien normalerweise nicht in seinem Home-Verzeichnis. Es macht keinen Sinn, sie in/var/lib unsichtbar zu machen. – johannes

0

Sie möchten auf keinen Fall Daten innerhalb des Gem-Verzeichnisses speichern. Das erwartete Verhalten ist, dass Benutzer Edelsteine ​​ohne Probleme deinstallieren und neu installieren können.Wenn du Daten im installierten Verzeichnis deines Edelsteins hast, wird die Deinstallation des Edelsteins diese Daten zerstören und deine Nutzer verärgern.

johannes hat die richtigen Ideen für den Einsatz unter Linux. Für einen Mac wären die spezifischen Verzeichnisse ein wenig anders. Das Gleiche gilt für Windows. Sie müssen nach den richtigen Orten für jede Plattform suchen, die Sie anvisieren möchten, und Ihren Code abhängig von der Art des Hosts, auf dem er ausgeführt wird, abhängig vom Speicherstandort ändern.

Vergessen Sie nicht, dass Benutzer Ihre Standardeinstellungen überschreiben. Eine Möglichkeit, das zu tun, wird sie sehr glücklich machen :)

+0

Hmm, über die Deinstallation, das macht Sinn. Allerdings bin ich mir nicht sicher, wie Sie in diesem Fall den Standard überschreiben. Es sei denn, der Benutzer macht etwas wie eine Umgebungsvariable. Da die App den Datenspeicher an einem bestimmten Speicherort erstellt, muss jeder aufgerufene Befehl an diesen Speicherort zurückkehren. (Und ich möchte den Speicherort des Datenspeichers nicht mit jedem Befehl angeben müssen) Kann jemand die Ausführungsplattform zur Laufzeit in Ruby ermitteln? – jschank

+0

Es gibt eine konstante RUBY_PLATFORM, mit der Sie die Plattform bestimmen können. Umgebungsvariablen sind eine hervorragende Möglichkeit, Benutzer die Standardeinstellungen überschreiben zu lassen. Immerhin sollten sie, wenn sie Standardwerte überschreiben, ein erfahrenerer Benutzer sein, der so etwas handhaben kann. – edebill