2014-04-25 14 views
12

Normalnie w plikach węzłów po prostu umieścićJak zrobić plik wykonywalny powłoki węzła przy użyciu maszynopis

#!/usr/bin/env node 

u góry i uczynić go wykonywalnym, aby utworzyć plik, który można uruchomić z terminalu bash. Jednak jeśli zrobię to w pliku maszynopisu, kompilator mówi "błąd TS1001: nieoczekiwany znak" # "" i odmawia skompilowania go. W jaki sposób mogę utworzyć plik wykonywalny powłoki za pomocą maszynopisu?

+0

Napisz plik wykonywalny w JS i po prostu wymagaj() swojego pliku TypeScript. – jgillich

+0

to praca nie jest rozwiązaniem. Co jeśli chcę przetworzyć argumenty linii poleceń w TypeScript? –

+0

Shebangs zakłada, że ​​interpreter docelowy używa znaku # # jako swojego znaku komentarza, tak że sam shebang jest ignorowany. Masz dodatkowe komplikacje, że nie ma interpretera TypeScript; najpierw skompiluj go do JavaScript, a potem zinterpretuj wynik. – chepner

Odpowiedz

8

Mieli Państwo prawo zgłosić błąd firmie Microsoft i nie mieli racji, aby zamknąć ją jako wontfix.

Do czasu naprawienia jest, oto sposób obejścia tego problemu. Wklej następujący tekst do pliku i zapisać go jako shebangify:

#!/usr/bin/env node 
var fs = require('fs'); 
var path = process.argv[2]; 
var data = "#!/usr/bin/env node\n\n"; 
data += fs.readFileSync(path); 
fs.writeFileSync(path, data); 

(NB Aby utrzymać tę odpowiedź zwięzłe, powyższy kod nie ma żadnego sprawdzania błędów lub inne udoskonalenia, więc używać na własne ryzyko lub używać this zamiast również zobaczyć this SO question uzyskać więcej informacji o poprzedzenie plików)

Dodać plik wykonywalny z przy użyciu terminala, aby przejść do katalogu pliku i wykonanie:..

$ chmod +x shebangify 

Gdy masz CRE w programie do pisania (np. nazywa myscript.ts), który chcesz skompilować i zamieni się w skrypcie (np zwany myscript), należy to zrobić wykonując sekwencję wzdłuż tych linii w terminalu:

$ tsc --out myscript myscript.ts ; ./shebangify myscript ; chmod +x myscript 
+0

Nie działa to dobrze w przypadku map źródłowych. – chocolateboy

+0

@ chocolateboy Nie korzystałem wcześniej z map źródłowych. Dzięki za podpowiedź, żebym je sprawdził! Nie jestem pewien, czy wielu ludzi zminimalizowało swoje skrypty powłoki, nawet jeśli używają pliku node.js, ale mógłbym się pomylić. Może to poprawia wydajność? W każdym razie, jeśli masz rozwiązanie problemu z pytającym, że * nie * dobrze działa z mapami źródłowymi, opublikuj to jako odpowiedź lub zasugeruj odpowiednią edycję do kopalni :) AKTUALIZACJA: właśnie zobaczyłem twój komentarz poniżej, że wsparcie dla shebang zostało [ dodano] (https://github.com/Microsoft/TypeScript/pull/4120). Hurra! – sampablokuper

1

nie mam wystarczająco dużo punktów reputacji do publikowania komentarz, ale pomyślałem, że dobrze byłoby, gdyby wszyscy wiedzieli, że otwieram nowy numer na GitHubie, ponieważ tego używają twórcy Typescript do śledzenia takich rzeczy: https://github.com/Microsoft/TypeScript/issues/2749.

+3

Wsparcie Shebang zostało [dodane] (https://github.com/Microsoft/TypeScript/issues/4120) i będzie dostępne w TypeScript 1.6. W międzyczasie można go przetestować za pomocą 'npm install -g maszynopis @ next'. – chocolateboy

+0

@ chocolateboy, to doskonała wiadomość! – sampablokuper

+0

Dzięki za udostępnienie @ chocolateboy! – Jonathan

Powiązane problemy