2014-04-25 10 views
12

Normalmente in file di nodi Ho appena messoCome fare un file eseguibile nodo di shell, usando dattiloscritto

#!/usr/bin/env node 

in alto e renderlo eseguibile per creare un file che può essere eseguito da un terminale bash. Tuttavia se lo faccio in un file Typescript, il compilatore dice "errore TS1001: carattere imprevisto" # "" e si rifiuta di compilarlo. Quindi, come posso creare un file di nodo eseguibile della shell con Typescript?

+0

Scrivere l'eseguibile in JS e solo richiedere() il proprio file TypeScript. – jgillich

+0

non è una soluzione. Cosa succede se voglio elaborare gli argomenti della riga di comando in TypeScript? –

+0

Gli shebang presumono che l'interprete di destinazione utilizzi '# come suo carattere di commento, in modo che lo shebang stesso venga ignorato. Hai la complicanza aggiunta che non c'è un interprete TypeScript; per prima cosa lo compili in JavaScript, quindi interpreti il ​​risultato. – chepner

risposta

8

Avevi ragione a segnalare il bug a Microsoft, e hanno sbagliato a chiuderlo come wontfix.

Fino a quando non è stato impostato , ecco una soluzione alternativa. Incollare il seguente in un file di testo e salvarlo come 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 Per mantenere questa risposta concisa, il codice di cui sopra non ha alcun controllo degli errori o di altri parametri, in modo da utilizzare a proprio rischio o utilizzare this invece Inoltre, vedere this SO question per maggiori informazioni su anteponendo ai file)

rendere il file eseguibile con utilizzando un terminale per navigare directory del file e l'esecuzione di:..

$ chmod +x shebangify 

una volta che avete cre un programma Typescript (ad es. chiamato myscript.ts) che si desidera compilare e trasformare in uno script di shell (ad esempio, chiamato myscript), farlo eseguendo una sequenza lungo queste linee nel vostro terminale:

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

Questo non funziona bene con le mappe di origine. – chocolateboy

+0

@chocolateboy Non ho usato le mappe sorgente prima. Grazie per avermi invitato a cercarli! Non sono sicuro che molte persone minimizzino i loro script di shell, anche se stanno usando node.js, ma potrei sbagliarmi. Forse farlo migliora le prestazioni? Comunque, se hai una soluzione al problema del questionario che * fa * gioca bene con le mappe di origine, per favore postalo come risposta, o suggerisci una modifica appropriata alla mia :) AGGIORNAMENTO: appena visto il tuo commento qui sotto che il supporto di shebang è stato [ aggiunto] (https://github.com/Microsoft/TypeScript/pull/4120). Evviva! – sampablokuper

1

Non ho abbastanza punti reputazione per pubblicare un commento, ma ho pensato che sarebbe stato bello per tutti sapere che ho aperto un nuovo problema su GitHub poiché questo è ciò che gli sviluppatori di Typescript utilizzano per tenere traccia di cose come questa: https://github.com/Microsoft/TypeScript/issues/2749.

+3

Il supporto per Shebang è stato [aggiunto] (https://github.com/Microsoft/TypeScript/issues/4120) e sarà disponibile in TypeScript 1.6. Nel frattempo, può essere testato con 'npm install -g typescript @ next'. – chocolateboy

+0

@chocolateboy, questa è un'ottima notizia! – sampablokuper

+0

Grazie per aver condiviso @chocolateboy! – Jonathan