Má strojopisem explicitní veřejné API pro NodeJS modulu Access?

hlasů
11

Zv rámci aplikace uzlu bych chtěl dělat:

var typeScript = require('typescript'); 

typeScript.compile('...')

Dívám se realizovat překladač do sestavení systému, ale bez přístupu k veřejné API (typescript.compile, etc) to je nemožné.

Zde je úplnější příklad toho, co bych chtěl dělat, když je dole je pro LiveScript, nikoliv psacím stroji, utilitized v plugin napsán pro systém budovat-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')
  ]

Zvědavý, jestli někdo našel obejití?

Aktualizace

Skončil jsem se provádí svůj vlastní řešení celé řady problémů shora a jinde uvedené. Naleznete https://github.com/damassi/TypeScript-Watcher pro více informací a použití.

Položena 03/10/2012 v 22:40
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
8

Tenhle je trochu hacky, ale že to bude fungovat.

Přemýšlel jsem o této velmi stejné by to bylo včera, a já kontroloval svůj kód. Pokud zaškrtnete bin / typscript.js ze svého zdrojového kódu (Je to velmi velmi velký soubor, s téměř 21k řádků kódu), uvidíte, že vytváří TypeScript.TypeScriptCompiler, a pak zjistíte, že to vystavit způsob sestavování ,

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

Nyní budete potřebovat snadný způsob, jak ji vystavit. Chcete-li to, budete muset změnit svůj kód, což je důvod, proč je to hacky. Chcete-li to provést, můžete upravit typescript.js přidáním:

module.exports = exports = TypeScript;

Hned na konci souboru.

Potom můžete vytvořit index.js soubor v kořenovém adresáři modulu (upozornění: instalaci modulu v místním prostor pro to vše: „NPM nainstalovat strojopis“), který odhaluje objekt.

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

A připraven! Nyní můžete jej stačí zavolat a kompilovat kód používat. Můžete zkontrolovat, jak používat API pro kompilaci v souboru tsc.js.

Předem se omlouvám za hrozného kódu vpředu:

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

Z nějakého důvodu, kdo napsal kód byl skutečný fanoušek C # a pokračoval jít dopředu a způsoby použití volal .WriteLine, Close a zápis, které jsou ve skutečnosti jen obaly. Dalo by se dostat to v režii museli přidat tuto funkci, ale budete muset změnit spoustu kódu v modulu a je za to nestojí. Myslím, že je lepší mít třídu rozšířit (nebo pokud jste ještě na JS, zdědí prototyp) a nechat to udělat za vás, aby to v suchu.

Něco opravdu pěkné je, že pokud chcete překládat 500 strojopisu soubory a dát je všechny do jednoho JS souboru, stačí zavolat compiler.addUnit (anothercontent, anotherpath); 500 krát a pak to všechno jít do jednoho souboru :)

Zaměřit se na lepší věci: Pokud zaškrtnete tsc.js kód najdete třídu šarže kompilátoru. Chcete-li, pro stavební proces, možná by bylo lepší použít něco robustnější líbí. Poskytuje sledují soubory a další.

Mít procházet kód, myslím, že budu jen předloží vstupenku do vývojového týmu a požádat je, aby poskytla jasnější API ¬¬

Poznámka: Všechny soubor přečte tady jsou prováděny v synchronním způsobem. To je špatné, velmi špatné, pokud jde o výkon. Nevím přesně, co máte v plánu udělat, ale nemohl jsem doporučit více než najít způsob, jak tento asynchronní pokud je to možné.

Odpovězeno 03/10/2012 v 23:52
zdroj uživatelem

hlasů
2

V současné době není možné dosáhnout kompilaci jen tím, že má požadovat a volání sestavit. Pokud jste se podívat na harness.ts je překladač modul, který poskytuje poměrně jednoduchý způsob, jak to udělat, ale řekla bych, že budete volat TSC externě.

///<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);
    }
});

Věřím, že to bude dělat svou práci.

Odpovězeno 03/10/2012 v 23:01
zdroj uživatelem

hlasů
1

Mohli byste vyzkoušet https://github.com/sinclairzx81/typescript.api . Tento projekt dělá require () prodlužovací věci, ale také má některé funkce pro manuální kompilaci ts zdroj. Mělo by být možné vytvořit automatizovaný build systém s ním.

Všimněte tho jeho postaven na strojopisem 0,9 kompilátor, takže si mohou, ale nemusí mít úspěch kompilace 0.8.3 zdrojové uvedeny různé aktualizace jazyka.

Odpovězeno 13/05/2013 v 12:03
zdroj uživatelem

hlasů
1

lépe vyžadují mohl pomoci dosáhnout, pokud vše, co chcete, je provádění / přístupu k souboru strojopisem.

To vám umožní require () strojopisem soubory - potřeba žádné pre-kompilace - a spoustu dalších formátů (coffeescript, clojurescript, YAML, XML, atd.)

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

Zveřejnění: I napsal lépe vyžadují.

Odpovězeno 01/11/2012 v 16:06
zdroj uživatelem

hlasů
1

Zkontrolujte, zda tento GitHub projekt by niutech, to může přeměnit na psacím stroji kód JS kódu za běhu v prohlížeči , ale myslím, že to může být snadno upravena tak, aby práci v node.js.

Odpovězeno 07/10/2012 v 07:41
zdroj uživatelem

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