Μήπως γραφομηχανή παρέχουν σαφή Δημόσια API για NodeJS Ενότητα Πρόσβασης;

ψήφοι
11

Μέσα από μια εφαρμογή κόμβου, θα ήθελα να κάνω:

var typeScript = require('typescript'); 

typeScript.compile('...')

Ψάχνω για την εφαρμογή του compiler σε ένα σύστημα κατασκευής, αλλά χωρίς πρόσβαση σε ένα δημόσιο API (typescript.compile, κλπ) αυτό είναι αδύνατο.

Εδώ είναι ένα πιο ολοκληρωμένο παράδειγμα του τι θέλω να κάνω, αν και η παρακάτω είναι για LiveScript, δεν γραφομηχανή, utilitized σε ένα πρόγραμμα γραμμένο για το σύστημα κατασκευή-Brunch.io:

LiveScript = require 'LiveScript'
sysPath = require 'path'

module.exports = class LiveScriptCompiler
  brunchPlugin: yes
  type: 'javascript'
  extension: 'ls'

  constructor: (@config) ->
    null

  compile: (data, path, callback) ->
    try
      result = LiveScript.compile data, bare: yes
    catch err
      error = err
    finally
      callback error, result

  include: [
    (sysPath.join __dirname, '..', 'vendor', 'prelude-browser-0.6.0.js')
  ]

Περίεργος αν κάποιος βρει ένα έργο-γύρω;

Εκσυγχρονίζω

Κατέληξα την εφαρμογή της δικής μου λύση σε μια ποικιλία από τα προβλήματα που αναφέρονται παραπάνω και αλλού. Παρακαλώ δείτε https://github.com/damassi/TypeScript-Watcher για περισσότερες πληροφορίες και τη χρήση.

Δημοσιεύθηκε 03/10/2012 στις 22:40
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
8

Αυτό και μόνο είναι λίγο Hacky, αλλά αυτό θα λειτουργήσει.

Σκέφτηκα για αυτό το ίδιο ακριβώς χθες και είχα τον έλεγχο του κώδικά τους. Εάν έχετε ελέγξει bin / typscript.js από πηγαίο κώδικα τους (Είναι ένα πολύ πολύ μεγάλο αρχείο, με σχεδόν 21k γραμμές κώδικα), θα δείτε δημιουργεί TypeScript.TypeScriptCompiler, και τότε θα διαπιστώσετε ότι αυτό δεν εκθέτουν έναν τρόπο κατάρτισης .

var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile, 
    new TypeScript.NullLogger(), settings);

Τώρα, θα πρέπει να έχετε έναν εύκολο τρόπο για να το εκθέσει. Για να το κάνετε αυτό, θα πρέπει να τροποποιήσουν τον κώδικά τους, η οποία είναι ο λόγος για αυτό είναι Hacky. Για να το κάνετε αυτό, μπορείτε να τροποποιήσετε typescript.js προσθέτοντας:

module.exports = exports = TypeScript;

Δικαίωμα στο τέλος του αρχείου.

Στη συνέχεια, μπορείτε να δημιουργήσετε ένα index.js αρχείο στη ρίζα της μονάδας (σημείωση: εγκαταστήσετε τη μονάδα σε ένα τοπικό πεδίο για όλα αυτά: «NPM εγκατάσταση γραφομηχανή»), η οποία εκθέτει το αντικείμενο.

exports.TypeScript = require("bin/typescript");

Και έτοιμο! Τώρα μπορείτε να την αποκαλούν απλώς και καταρτίζουν τον κωδικό σας χρήση. Μπορείτε να ελέγξετε τον τρόπο χρήσης του API για τη σύνταξη του φακέλου tsc.js.

Ζητώ συγγνώμη εκ των προτέρων για το φρικτό κωδικό μέλλον:

var fs = require("fs");
var TypeScript = require("typescript");
var path = "test.ts";
var pathout = "test.js";
var content = fs.readFileSync(path, "utf-8");
var fd = fs.openSync(pathout, 'w'); 
var outFile = { 
    Write: function (str) { 
        fs.writeSync(fd, str); 
    }, 
    WriteLine: function (str) {
    console.log(fd, str); 
        fs.writeSync(fd, str + '\r\n'); 
    }, 
    Close: function () { 
        fs.closeSync(fd); 
        fd = null; 
    } 
};
var createFile = function (path) { 
    function mkdirRecursiveSync(path) { 
        var stats = fs.statSync(path); 
        if(stats.isFile()) { 
            throw "\"" + path + "\" exists but isn't a directory."; 
        } else { 
            if(stats.isDirectory()) { 
                return; 
            } else { 
                mkdirRecursiveSync(_path.dirname(path)); 
                fs.mkdirSync(path, 509); 
            } 
        } 
    } 
    mkdirRecursiveSync(_path.dirname(path));
    console.log(path) 
    var fd = fs.openSync(path, 'w'); 
    return { 
        Write: function (str) { 
            fs.writeSync(fd, str); 
        }, 
        WriteLine: function (str) { 
            fs.writeSync(fd, str + '\r\n'); 
        }, 
        Close: function () { 
            fs.closeSync(fd); 
            fd = null; 
        } 
    }; 
};
var stderr = { 
    Write: function (str) { 
        process.stderr.write(str); 
    }, 
    WriteLine: function (str) { 
        process.stderr.write(str + '\n'); 
    }, 
    Close: function () { 
    } 
}
var compiler = new TypeScript.TypeScriptCompiler(outFile, outFile);
compiler.setErrorOutput(stderr);
compiler.addUnit(content, path);
compiler.typeCheck();
compiler.emit(false, createFile);
outFile.Close();

Για κάποιο λόγο όποιος έγραψε τον κωδικό που ήταν ένας πραγματικός οπαδός του C # και προχώρησε για να πάει μπροστά και να χρησιμοποιούν μεθόδους που ονομάζεται WriteLine, Κλείσιμο και να γράφουν, τα οποία είναι στην πραγματικότητα μόνο περιτυλίγματα. Θα μπορούσατε να πάρετε αυτό της εναέριας να πρέπει να προσθέσετε αυτό λειτουργεί, αλλά θα πρέπει να τροποποιήσετε πολλά κώδικα στη λειτουργική μονάδα και δεν αξίζει τον κόπο. Νομίζω ότι το καλύτερο είναι να έχουμε μια τάξη για να επεκτείνουν (ή αν είστε ακόμα στο JS, κληρονομούν το πρωτότυπο) και αφήστε το να κάνει αυτό για σας, ώστε να είναι στεγνό.

Κάτι πολύ ωραίο είναι ότι αν θέλετε να μεταφράσετε 500 γραφομηχανή αρχεία και τα βάζουμε όλα σε ένα ενιαίο αρχείο .js, μπορείτε απλά να καλέσετε compiler.addUnit (anothercontent, anotherpath)? 500 φορές και στη συνέχεια να δούμε όλα πάνε σε ένα ενιαίο αρχείο :)

Εστίαση σε καλύτερα πράγματα: αν έχετε ελέγξει tsc.js κωδικό, θα βρείτε μια κατηγορία παρτίδα compiler. Αν θέλετε αυτό για μια διαδικασία κατασκευής, θα μπορούσε να είναι καλύτερο να χρησιμοποιήσετε κάτι πιο ισχυρό σαν αυτό. Παρέχει βλέποντας τα αρχεία και πολλά άλλα.

Έχοντας βιαστικά τον κωδικό, νομίζω ότι θα υποβάλει μόνο ένα εισιτήριο για την ομάδα ανάπτυξης και να τους ζητήσει να παρέχει μια σαφέστερη API ¬¬

Σημείωση: Όλα αρχείο διαβάζει εδώ μέσα γίνονται με σύγχρονο τρόπο. Αυτό είναι κακό, πολύ κακό, όσον αφορά τις επιδόσεις. Δεν ξέρω ακριβώς τι σκοπεύετε να κάνετε, αλλά δεν θα μπορούσα να συστήσω περισσότερο που μπορείτε να βρείτε έναν τρόπο να κάνουν αυτό το ασύγχρονη αν είναι δυνατόν.

Απαντήθηκε 03/10/2012 στις 23:52
πηγή χρήστη

ψήφοι
2

Επί του παρόντος, δεν είναι δυνατόν να επιτευχθεί μια συλλογή απλά με ένα απαιτούν και ζητούν την κατάρτιση. Εάν μπορείτε να δείτε τα harness.ts υπάρχει μια μονάδα compiler που παρέχει ένα μάλλον απλό τρόπο για να γίνει αυτό, αλλά θα ήθελα να προτείνω να καλέσετε TSC εξωτερικά.

///<reference path='node.d.ts'/>
import exec = module('child_process');

var child = exec.exec('tsc foo.ts',
  function (error, stdout, stderr) {
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

Πιστεύω ότι αυτό θα κάνει τη δουλειά.

Απαντήθηκε 03/10/2012 στις 23:01
πηγή χρήστη

ψήφοι
1

Θα μπορούσατε να δοκιμάσετε https://github.com/sinclairzx81/typescript.api . Το έργο αυτό κάνει τα πράγματα επέκταση require (), αλλά έχει επίσης κάποια λειτουργικότητα για την κατάρτιση ts πηγή χειροκίνητα. Θα πρέπει να είναι δυνατή η δημιουργία ενός αυτοματοποιημένου συστήματος κατασκευής με αυτό.

Σημειώστε εν τούτοις ενσωματωμένο της στην γραφομηχανή 0,9 compiler, έτσι ώστε να μπορεί ή δεν μπορεί να έχει επιτυχία κατάρτιση 0.8.3 πηγή δίνονται διάφορες ενημερώσεις στη γλώσσα.

Απαντήθηκε 13/05/2013 στις 12:03
πηγή χρήστη

ψήφοι
1

καλύτερα απαιτούν θα μπορούσε να σας βοηθήσει να επιτευχθεί αυτό, αν το μόνο που θέλετε είναι η εκτέλεση / πρόσβαση στο αρχείο γραφομηχανή.

Σας επιτρέπει να απαιτούν () γραφομηχανή αρχεία - δεν απαιτείται προ-κατάρτιση - και ένα σωρό άλλες μορφές αρχείων (CoffeeScript, clojurescript, YAML, xml, κλπ)

require('better-require')();
var myModule = require('./mymodule.ts');

Αποκάλυψη: Έγραψα καλύτερα απαιτούν.

Απαντήθηκε 01/11/2012 στις 16:06
πηγή χρήστη

ψήφοι
1

Ελέγξτε αυτό το έργο GitHub από niutech, μπορεί να μετατρέψει τον κωδικό γραφομηχανή για να κώδικα JS on the fly στο πρόγραμμα περιήγησης , αλλά υποθέτω ότι μπορεί εύκολα να τροποποιηθεί για να εργαστούν σε node.js.

Απαντήθηκε 07/10/2012 στις 07:41
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more