2012-05-01 7 views
29

Cucumber.js è la fornitura di una linea di comando "binario", che è un semplice file che contiene un .jsshebang istruzioni:NPM pacchetto di script 'bin' per Windows

#!/usr/bin/env node 
var Cucumber = require('../lib/cucumber'); 
// ... 

Il binario è specificato in package.json con la chiave di configurazione "bin":

{ "name" : "cucumber" 
, "description" : "The official JavaScript implementation of Cucumber." 
// ... 
, "bin": { "cucumber.js": "./bin/cucumber.js" } 
// ... 

tutto questo funziona bene su sistemi POSIX. Qualcuno ha segnalato an issue durante l'esecuzione di Cucumber.js su Windows.

Fondamentalmente, il file .js sembra essere eseguito tramite l'interprete JScript di Windows (non Node.js) e genera un errore di sintassi a causa dell'istruzione shebang.

La mia domanda è: qual è il modo consigliato di impostare uno script "binario" che funzioni su entrambi i sistemi UNIX e Windows?

Grazie.

risposta

44

Windows ignora la riga di shebang #!/usr/bin/env node e lo eseguirà in base all'associazione di file .js. Sii esplicito sulla chiamata allo script con il nodo

node hello.js 

ps. Pedanteria: gli shebang non sono nello standard POSIX ma sono supportati dalla maggior parte dei sistemi * nix.


Se si comprime il vostro progetto per Npm, utilizzare il campo 'bin' in package.json. Poi su Windows, Npm installerà un wrapper .cmd lungo il lato lo script in modo gli utenti possono eseguire dalla riga di comando

hello 

Per NPM per creare il giusto spessore, the script must have the shebang line#!/usr/bin/env node

+4

Il problema era il nome di script binario che terminava con un suffisso ".js". NPM crea sia un 'cucumber.js' unix-friendly che un baco windows-friendly' cucumber.js.cmd' basato sull'istruzione di configurazione "bin". A causa del modo in cui Windows gestisce le "estensioni" del file, quando si digitava 'node_modules \ .bin \ cucumber.js' era in esecuzione il file' .js' tramite JScript invece del file '.cmd'. Grazie per il pedante post script;) – jbpros

+0

Mi sono imbattuto esattamente in questo stesso problema. Sto cercando di trovare una soluzione che non richieda a me di dire agli utenti di Windows di digitare un comando diverso. I file JavaScript che precedono il file .cmd generato da npm vengono eseguiti in Windows Script Host; Spero che ci sia un modo per sfruttare tale proxy per la CLI basata su Node: http: // StackOverflow.it/questions/24113091/equivalente-di-unix-exec-in-jscript-windows-script-host – ELLIOTTCABLE

+0

come faccio a farlo eseguire da nodejs invece di microsoft jscript? anche cambiarlo in 'node./index.js' non lo fa funzionare. correzione: ri eseguendo 'npm link' sembra funzionare –

5

tuo "bin" dovrebbe be "cetriolo" npm creerà un file "cetriolo" o "cetriolo.cmd" che punta a "nodo% SCRIPTNAME%". il primo è per gli ambienti posix, il secondo per Windows ... Se vuoi che il "js" faccia parte del nome dell'eseguibile ... dovresti usare un hyphon invece ... "cetriolo-js" ... Avendo un file .js verrà prima del .js.cmd nel tuo caso, facendo in modo che l'interprete di WScript lo esegua come un file JScript, non uno script di nodo.

Suggerisco di guardare coffee-script's package.json per un buon esempio.

{ 
    "name":   "coffee-script", 
    "description": "Unfancy JavaScript", 
    "keywords":  ["javascript", "language", "coffeescript", "compiler"], 
    "author":  "Jeremy Ashkenas", 
    "version":  "1.4.0", 
    "licenses":  [{ 
    "type":  "MIT", 
    "url":  "https://raw.github.com/jashkenas/coffee-script/master/LICENSE" 
    }], 
    "engines":  { 
    "node":  ">=0.4.0" 
    }, 
    "directories" : { 
    "lib" : "./lib/coffee-script" 
    }, 
    "main" : "./lib/coffee-script/coffee-script", 
    "bin":   { 
    "coffee":  "./bin/coffee", 
    "cake":  "./bin/cake" 
    }, 
    "scripts": { 
    "test": "node ./bin/cake test" 
    }, 
    "homepage":  "http://coffeescript.org", 
    "bugs":   "https://github.com/jashkenas/coffee-script/issues", 
    "repository": { 
    "type": "git", 
    "url": "git://github.com/jashkenas/coffee-script.git" 
    }, 
    "devDependencies": { 
    "uglify-js": ">=1.0.0", 
    "jison":  ">=0.2.0" 
    } 
}