2012-05-01 19 views
29

Cucumber.js es el suministro de una línea de comandos "binario", que es un simple archivo que contiene una .jstinglado instrucción:NPM paquete de scripts 'bin' para Windows

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

El binario se especifica en package.json con la clave de configuración "bin":

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

todo esto funciona bien en sistemas POSIX. Alguien reportó an issue cuando ejecuta Cucumber.js en Windows.

Básicamente, el archivo .js parece ejecutarse mediante el intérprete JScript de Windows (no Node.js) y arroja un error de sintaxis debido a la instrucción shebang.

Mi pregunta es: ¿cuál es la forma recomendada de configurar un script "binario" que funcione en sistemas UNIX y Windows?

Gracias.

Respuesta

44

Windows ignora la línea de shebang #!/usr/bin/env node y la ejecutará de acuerdo con la asociación de archivos .js. Sea explícito al llamar su secuencia de comandos con el nodo

node hello.js 

ps. Pedantería: shebangs no son en el estándar POSIX, pero son compatibles con la mayoría del sistema * nix.


Si empaqueta su proyecto de MNP, utilizar el campo 'bin' en package.json. A continuación, en Windows, Npm instalará un envoltorio .cmd junto a la secuencia de comandos que los usuarios puedan ejecutarlo desde la línea de comandos

hello 

Para NPM para crear el derecho de cuña, the script must have the shebang line#!/usr/bin/env node

+4

El problema fue que el nombre del script binario terminaba con el sufijo ".js". NPM crea tanto un binario compatible con Windows 'cucumber.js' como un 'cucumber.js.cmd' compatible con Windows basado en la instrucción de configuración" bin ". Debido a la forma en que Windows maneja las "extensiones" de archivos, cuando se tipeaba 'node_modules \ .bin \ cucumber.js' ejecutaba el archivo' .js' a través de JScript en lugar del archivo '.cmd'. Gracias por la posdata pedante;) – jbpros

+0

Me encontré con exactamente este mismo problema. Estoy tratando de encontrar una solución que no requiera que le diga a los usuarios de Windows que escriban un comando diferente. Los archivos JavaScript que prevalecen sobre los .cmd generados por npm se ejecutan en Windows Script Host; Espero que haya una manera de aprovechar eso para proxy a la CLI con Node-powered: http: // stackoverflow.com/questions/24113091/equivalent-of-unix-exec-in-jscript-windows-script-host – ELLIOTTCABLE

+0

¿cómo puedo hacer que se ejecute por nodejs en lugar de microsoft jscript? incluso cambiarlo a 'node./index.js' no lo hace funcionar. corrección: volver a ejecutar el enlace 'npm' parece funcionar –

5

su "bin" debe ser "pepino" npm creará un archivo "pepino" o "pepino.cmd" apuntando a "nodo% SCRIPTNAME%". el primero es para entornos posix, este último para uso de Windows ... Si quiere que el "js" forme parte del nombre del ejecutable ... debe usar un hyphon en su lugar ... "cucumber-js" ... Tener un archivo .js aparecerá antes que el archivo .js.cmd en su caso, haciendo que el intérprete WScript lo ejecute como un archivo JScript, no como un script de nodo.

Sugeriría mirar coffee-script's package.json para un buen ejemplo.

{ 
    "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" 
    } 
}
Cuestiones relacionadas