टाइपप्रति NodeJS मॉड्यूल पहुँच के लिए एक स्पष्ट सार्वजनिक एपीआई प्रदान करता है?

वोट
11

एक नोड ऐप्लिकेशन के अंदर से मुझे क्या करना चाहते हैं:

var typeScript = require('typescript'); 

typeScript.compile('...')

मैं एक निर्माण प्रणाली में है लेकिन एक सार्वजनिक एपीआई (typescript.compile, आदि) यह असंभव है के लिए उपयोग के बिना संकलक लागू करने के लिए देख रहा हूँ।

यहाँ मैं क्या करना चाहते हैं क्या की अधिक विस्तृत जानकारी उदाहरण है, हालांकि नीचे LiveScript, नहीं टाइपप्रति, एक प्लगइन Brunch.io निर्माण-सिस्टम के लिए लिखा में utilitized के लिए है:

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 है लेकिन यह काम करेंगे।

मैं यह बहुत ही बस कल के बारे में सोचा और मैं उनके कोड की जाँच की गई थी। आप अपने sourcecode से 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");

और त्यार! अब आप बस इसे कहते हैं और इसे का उपयोग कर अपने कोड संकलन कर सकते हैं। आप देख सकते हैं कि कैसे 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();

किसी कारण जो कोई भी कोड लिखा था सी # की एक असली प्रशंसक था और आगे जाना है के लिए रवाना हुए और उपयोग के तरीकों WriteLine, बंद और लिखें, जो वास्तव में सिर्फ रैपर हैं कहा जाता है। आप इस कार्यों को जोड़ने में होने की भूमि के ऊपर के इस मिल सकता है, लेकिन आप मॉड्यूल में कोड का एक बहुत कुछ को संशोधित करने के लिए होता है और यह इसके लायक नहीं है। मुझे लगता है कि यह एक वर्ग का विस्तार करने के लिए सबसे अच्छा है (या यदि आप जे एस पर अभी भी कर रहे हैं, प्रोटोटाइप के वारिस) और यह करना है कि आप के लिए, यह सूखी बनाने के लिए करते हैं।

कुछ वास्तव में अच्छा है कि अगर आप 500 टाइपप्रति फ़ाइलों का अनुवाद और उन सब एक एकल .js फ़ाइल में रखना चाहते हैं, तो आप सिर्फ compiler.addUnit (anothercontent, anotherpath) कॉल कर सकते हैं है, 500 बार और फिर इसे सभी को देखने के एक एकल फाइल में जाने :)

बेहतर चीजों पर ध्यान केंद्रित: यदि आप tsc.js कोड की जाँच करें, आप एक बैच संकलक वर्ग मिल जाएगा। यदि आप एक निर्माण प्रक्रिया के लिए इस चाहते हैं, यह इस तरह के और मजबूत कुछ का उपयोग करने के लिए बेहतर हो सकता है। यह फ़ाइलें और अधिक देख सकते हैं।

कोड में ब्राउज़ करने के बाद, मुझे लगता है कि मैं सिर्फ विकास दल के लिए एक टिकट जमा करें और उन्हें पूछना एक स्पष्ट एपीआई प्रदान करने के लिए होगा ¬¬

नोट: सभी फ़ाइल यहाँ में पढ़ता है एक तुल्यकालिक तरीके से किया जाता है। इस प्रदर्शन के मामले में बुरा है, बहुत खराब है,। मैं वास्तव में नहीं पता है तुम क्या करने की योजना क्या है, लेकिन मैं और अधिक है कि आप यदि संभव हो तो इस async बनाने के लिए एक रास्ता खोजने की सिफारिश नहीं कर सका।

03/10/2012 को 23:52
का स्रोत उपयोगकर्ता

वोट
2

वर्तमान में यह सिर्फ एक आवश्यकता होने और संकलन को फोन करके एक संकलन प्राप्त करने के लिए संभव नहीं है। आप harness.ts पर देख सकते हैं एक संकलक मॉड्यूल है कि यह ऐसा करने का बल्कि एक सरल तरीका प्रदान करता है वहाँ है, लेकिन मैं आप बाहर से 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 । इस परियोजना की आवश्यकता होती है () विस्तार सामान करता है, लेकिन यह भी मैन्युअल ts स्रोत संकलित करने के लिए कुछ कार्यक्षमता है। यह इसके साथ एक स्वचालित निर्माण प्रणाली बनाने के लिए संभव हो जाना चाहिए।

टाइपप्रति 0.9 संकलक पर इसके निर्माण किया यद्यपि ध्यान दें, तो आप या सफलता 0.8.3 स्रोत दी गई भाषा के लिए विभिन्न अपडेट संकलन नहीं हो सकता है हो सकता है।

13/05/2013 को 12:03
का स्रोत उपयोगकर्ता

वोट
1

बेहतर की आवश्यकता होती है मदद कर सकता है आप इस लक्ष्य को हासिल सब आप चाहते हैं निष्पादित हो रहा है / टाइपप्रति फ़ाइल तक पहुँचने है।

यह आप () टाइपप्रति फ़ाइलों की आवश्यकता की सुविधा देता है - कोई पूर्व संकलन की जरूरत - और अन्य फ़ाइल प्रारूपों (coffeescript, clojurescript, YAML, एक्सएमएल, आदि) का एक समूह

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

प्रकटीकरण: मैंने लिखा बेहतर की आवश्यकता है।

01/11/2012 को 16:06
का स्रोत उपयोगकर्ता

वोट
1

चेक इस GitHub परियोजना niutech द्वारा, यह मक्खी पर जे एस कोड को टाइपप्रति कोड में बदल सकते हैं ब्राउज़र में है, लेकिन मुझे लगता है कि यह आसानी से 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