2012-04-10 13 views
6

Wie ich sehen konnte, lädt die Gjs imports standardmäßig nur und /usr/lib/gjs-1.0. Ich möchte eine Anwendung modularisieren, wie wir es mit Knoten machen können, aber ich muss Module relativ zur Skriptdatei finden.Wie setze ich einen Include-Pfad in den Gjs-Code?

fand ich diese zwei Möglichkeiten, umfassen Pfade hinzuzufügen:

  1. gjs --include-path=my-modules my-script.js
  2. GJS_PATH=my-modules gjs my-script.js

... aber beide sind in das aktuelle Verzeichnis verwandt, nicht in die Datei (obliviously), und sie mussten in der Befehlszeile deklariert werden, was dies unnötig komplex machte.

Wie kann ich einen Include-Pfad im Gjs-Code festlegen? (So kann ich dies relativ zu der Datei machen)

Oder ... Es gibt eine andere Möglichkeit, Dateien von überall zu importieren, wie in Python?

(Bitte, Sie brauchen keinen Shell Launcher zu verwenden, um vorzuschlagen, um das --include-path und GJS_PATH Problem zu lösen. Das liegt auf der Hand, aber weniger leistungsfähig. Wenn wir nicht eine bessere Lösung haben, werden wir überleben damit.)

Antwort

8

Sie müssen imports.searchPath einstellen oder ändern (was nicht offensichtlich ist, weil es nicht mit for (x in imports)print(x) angezeigt wird). So folgt aus:

imports.searchPath.unshift('.'); 
var foo = imports.foo; 

importiert die Datei „foo.js“ als foo Objekt.

Dies ist kompatibel mit Seed, obwohl dort imports weiß, dass es eine searchPath hat.

(Frühere Versionen dieser Antwort waren wesentlich ungenauer und entzündlicher. Sorry).

5

Wie Douglas sagt, müssen Sie ändern, um Ihren Bibliotheksstandort einzuschließen. Die Verwendung von . ist einfach, hängt jedoch davon ab, dass die Dateien immer vom selben Speicherort aus ausgeführt werden. Leider ist das Finden des Verzeichnisses des gerade ausgeführten Skripts ein großer Hack. Hier ist, wie Gnome Shell does it for the extensions API

ich dies in die folgende Funktion für den allgemeinen Gebrauch angepasst haben:

const Gio = imports.gi.Gio; 

function getCurrentFile() { 
    let stack = (new Error()).stack; 

    // Assuming we're importing this directly from an extension (and we shouldn't 
    // ever not be), its UUID should be directly in the path here. 
    let stackLine = stack.split('\n')[1]; 
    if (!stackLine) 
     throw new Error('Could not find current file'); 

    // The stack line is like: 
    // init([object Object])@/home/user/data/gnome-shell/extensions/[email protected]/prefs.js:8 
    // 
    // In the case that we're importing from 
    // module scope, the first field is blank: 
    // @/home/user/data/gnome-shell/extensions/[email protected]/prefs.js:8 
    let match = new RegExp('@(.+):\\d+').exec(stackLine); 
    if (!match) 
     throw new Error('Could not find current file'); 

    let path = match[1]; 
    let file = Gio.File.new_for_path(path); 
    return [file.get_path(), file.get_parent().get_path(), file.get_basename()]; 
} 

Hier ist, wie Sie es von Ihrem Einstiegspunkt Datei verwendet werden könnte app.js, nach Definition der getCurrentFile Funktion:

let file_info = getCurrentFile(); 

// define library location relative to entry point file 
const LIB_PATH = file_info[1] + '/lib'; 
// then add it to the imports search path 
imports.searchPath.unshift(LIB_PATH); 

Wee! jetzt ist der Import unserer Bibliotheken superleicht:

// import your app libraries (if they were in lib/app_name) 
const Core = imports.app_name.core;