2016-04-11 8 views
6

Ich arbeite an einem einfachen nodejs electron (früher bekannt als Atom Shell) Projekt. Ich schreibe es Winkel 2 verwendet wird, das Projekt den gleichen Projekt-Setup mit, wie sie in der Dokumentation zu Typoskript empfehlen:Require nodejs "child_process" mit TypeScript, SystemJS und Electron

tsc:

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "system", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false 
    }, 
    "exclude": [ 
    "node_modules", 
    "typings/main", 
    "typings/main.d.ts" 
    ] 
} 

Ich brauche einen Befehl auszuführen, fand ich heraus, dass Ich kann es mit Knoten "child_process" tun. Ich konnte sowieso nicht finden, dass ich es "importiere" oder "require", während sein Typ aus der Datei node.d.ts verwendet wird. Ich habe die „child_process“ Schnittstelle in der node.d.ts Datei gefunden, die mein Bedürfnis entspricht, dies ist, wie es in der node.d.ts Datei suchen:

declare module "child_process" { 
    import * as events from "events"; 
    import * as stream from "stream"; 

    export interface ChildProcess extends events.EventEmitter { 
     stdin: stream.Writable; 
     stdout: stream.Readable; 
     stderr: stream.Readable; 
     pid: number; 
     kill(signal?: string): void; 
     send(message: any, sendHandle?: any): void; 
     disconnect(): void; 
     unref(): void; 
    } 

    export function spawn(command: string, args?: string[], options?: { 
     cwd?: string; 
     stdio?: any; 
     custom?: any; 
     env?: any; 
     detached?: boolean; 
    }): ChildProcess; 
    export function exec(command: string, options: { 
     cwd?: string; 
     stdio?: any; 
     customFds?: any; 
     env?: any; 
     encoding?: string; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
    }, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function exec(command: string, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function execFile(file: string, 
     callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function execFile(file: string, args?: string[], 
     callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function execFile(file: string, args?: string[], options?: { 
     cwd?: string; 
     stdio?: any; 
     customFds?: any; 
     env?: any; 
     encoding?: string; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
    }, callback?: (error: Error, stdout: Buffer, stderr: Buffer) =>void): ChildProcess; 
    export function fork(modulePath: string, args?: string[], options?: { 
     cwd?: string; 
     env?: any; 
     execPath?: string; 
     execArgv?: string[]; 
     silent?: boolean; 
     uid?: number; 
     gid?: number; 
    }): ChildProcess; 
    export function spawnSync(command: string, args?: string[], options?: { 
     cwd?: string; 
     input?: string | Buffer; 
     stdio?: any; 
     env?: any; 
     uid?: number; 
     gid?: number; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
     encoding?: string; 
    }): { 
     pid: number; 
     output: string[]; 
     stdout: string | Buffer; 
     stderr: string | Buffer; 
     status: number; 
     signal: string; 
     error: Error; 
    }; 
    export function execSync(command: string, options?: { 
     cwd?: string; 
     input?: string|Buffer; 
     stdio?: any; 
     env?: any; 
     uid?: number; 
     gid?: number; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
     encoding?: string; 
    }): string | Buffer; 
    export function execFileSync(command: string, args?: string[], options?: { 
     cwd?: string; 
     input?: string|Buffer; 
     stdio?: any; 
     env?: any; 
     uid?: number; 
     gid?: number; 
     timeout?: number; 
     maxBuffer?: number; 
     killSignal?: string; 
     encoding?: string; 
    }): string | Buffer; 
} 

aber ich kann nur (wie ich kenne) nur diese Art erhalten, indem Import mit:

import * as child_process from 'child_process'; 

Einziges Problem ist, dass, wenn ich dies tun, meine app kippt Last und ich erhalte die folgenden Fehler in der Konsole:

GET file:///C:/angular2Samples/NGW-electron-VS%20-%20TEMP/child_process net::ERR_FILE_NOT_FOUND 

Vorerst Ich bekomme mein wa y um unter Verwendung von:

var child_process = require('child_process'); 

aber ich konnte sowieso nicht findet die Typinformationen zu diesem var hinzuzufügen:

var child_process : I_CANT_PUT_ANY_CHILD_PROCESS_TYPE_HERE = require('child_process'); 

Alle Ideen, wie ich die child_process bekommen kann (oder ein anderer Knoten erklärt Module, die keine öffentliche Schnittstelle sind, die ich nach dem Operator ":" mit Typinformationen angeben kann?

Dank viel im Voraus für jede Hilfe und

UPDATE :) Erklärungen ------------------------------ ------------------------------------

Wie Tenbits vorgeschlagen habe ich die Referenz wie folgt hinzugefügt an den Anfang der Datei: ///

und die Import-Anweisung, die Sie gesagt haben, verwendet, aber nicht mein Modul Loader chage. Es funktionierte immer noch nicht mit dem gleichen Fehler wie erwartet. Ich fühle mich nicht sehr wohl dabei, das Modulsystem zu ändern, da mein Projekt angular 2 verwendet und ihre Dokumente und einige ihrer Anleitungen neue Projekte, die keine frühere Vorliebe für diese Angelegenheit haben (Ich bin sehr neu in der Modul-Loader-Szene und im nicht vollständig verstehen, wie es noch funktioniert). Als ich versuchte, es zu ändern, habe ich einige Fehler in Bezug auf eckige 2 Sachen bekommen, zu denen ich im Moment nicht genug Zeit habe. Sollte es keinen Weg geben, ohne den Modullader zu wechseln?von am systemjs Website Blick sagt es zu Beginn, dass es Commonjs Module unterstützt: Systemjs doc

würde ich appriciate wirklich eine Lösung, die nicht das Modulsystem nicht ändert, oder vielleicht eine Tiefe explanition über, was los ist, UND DAS Ansätze für diese Art von Modul-Lade Probleme

da draußen existiert

Antwort

12

Ok, nach einigen Recherchen #L138 ich habe die Lösung gefunden

Sie import wie vor

verwenden können
import * as child from 'child_process'; 

var foo: child.ChildProcess = child.exec('foo.sh'); 
console.log(typeof foo.on); 

Sie sollten jedoch SystemJS konfigurieren, um das Modul auf NodeJS abzubilden.

System.config({ 
    map: { 
    'child_process': '@node/child_process' 
    } 
}); 

Das war's!

+0

Thanks a lot für Ihren Kommentar! Ich habe es versucht, bitte schauen Sie auf mein Update auf die Questetion in Bezug auf Ihre Antwort :) –

+0

Ich bin nicht ganz habe es: Haben Sie versucht 'import child = require ('child_process');' statt 'var child = erfordern ('child_process'); '? Haben Sie das gleiche Ergebnis wie mit 'var'? – tenbits

+0

Ja, genau das gleiche (beachte, dass ich das Modul nicht zu commonjs geändert habe, wie du es vorgeschlagen hast, der Grund dafür ist in meinem Update oben notiert) –

0

Für mich funktionierte es mit dem Rückruf, um die Ergebnisse anzuzeigen.

import * as child from 'child_process'; 

var foo: child.ChildProcess = child.exec('dir', (error: string, stdout: string, stderr: string) => { 
      console.log(stdout);  
     }); 

Ich habe hinzufügen keine Zuordnungen in SystemJS wie ich habe keine solche Konfiguration in der Knoten-Anwendung