2012-04-10 42 views
6

Như tôi có thể thấy, Gjs imports, chỉ tải /usr/share/gjs-1.0/usr/lib/gjs-1.0 theo mặc định. Tôi muốn mô đun hóa một ứng dụng, như chúng ta có thể làm với nút, nhưng tôi phải tìm các mô-đun liên quan đến tệp kịch bản lệnh.Cách đặt đường dẫn bao gồm trong mã Gjs?

Tôi thấy điều này hai cách để thêm bao gồm đường dẫn:

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

... nhưng cả hai đều liên quan đến thư mục hiện hành, chứ không phải vào file (obliviously) và chúng cần phải được khai báo trên dòng lệnh, làm phức tạp không cần thiết này.

Làm cách nào tôi có thể đặt đường dẫn bao gồm trong mã Gjs? (Vì vậy, tôi có thể thực hiện điều này liên quan đến tệp)

Hoặc ... Có một cách khác để nhập tệp từ bất kỳ đâu, như trong python?

(Xin vui lòng, bạn không cần phải đề xuất sử dụng trình khởi chạy shellscript để giải quyết vấn đề --include-pathGJS_PATH. Điều đó rõ ràng nhưng ít mạnh hơn. Nếu chúng tôi không có giải pháp tốt hơn, chúng tôi tồn tại với điều đó.)

Trả lời

8

Bạn cần đặt hoặc sửa đổi imports.searchPath (điều này không rõ ràng vì nó không hiển thị với for (x in imports)print(x)). Vì vậy, điều này:

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

nhập tệp “foo.js” làm đối tượng foo.

Điều này tương thích với Seed, mặc dù có imports biết rằng nó có số searchPath.

(Các phiên bản trước của câu trả lời này ít chính xác hơn và bị viêm hơn. Xin lỗi).

5

Như Douglas nói, bạn cần phải sửa đổi imports.searchPath để bao gồm vị trí thư viện của bạn. Sử dụng . rất đơn giản, nhưng phụ thuộc vào các tệp luôn được chạy từ cùng một vị trí thư mục. Thật không may là việc tìm kiếm thư mục của kịch bản hiện đang thực thi là một hack lớn. Đây là cách Gnome Shell does it for the extensions API

Tôi đã thích nghi này vào các chức năng sau đây để sử dụng chung:

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()]; 
} 

Đây là cách bạn có thể sử dụng nó từ bạn tập tin điểm vào app.js, sau khi xác định getCurrentFile chức năng:

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! hiện đang nhập thư viện của chúng tôi cực kỳ dễ dàng:

// import your app libraries (if they were in lib/app_name) 
const Core = imports.app_name.core; 
Các vấn đề liên quan