NPM package 'bin' script for Windows
Windows ignores the shebang line #!/usr/bin/env node
and will execute it according to the .js
file association. Be explicit about calling your script with node
node hello.js
ps. Pedantry: shebangs aren't in the POSIX standard but they are supported by most *nix system.
If you package your project for Npm, use the 'bin' field in package.json. Then on Windows, Npm will install a .cmd
wrapper along side your script so users can execute it from the command-line
hello
For npm to create the shim right, the script must have the shebang line #!/usr/bin/env node
your "bin" should be "cucumber" npm will create a "cucumber" or "cucumber.cmd" file pointing to "node %SCRIPTNAME%". the former being for posix environments, the latter being for windows use... If you want the "js" to be part of the executable name... you should use a hyphon instead... "cucumber-js" ... Having a .js file will come before the .js.cmd in your case causing the WScript interpreter to run it as a JScript file, not a node script.
I would suggest looking at coffee-script's package.json for a good example.
{ "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" }}
I managed to figure out a solution to a similar issue.
My original plan was to have only one large .js
file, for both the API and CLI (the reason is because I didn't know how to share variables between two files at the time). And when everything was built, I tried to add the #!/usr/bin/env node
shebang to my file. However that didn't stop Windows Script Host from giving an error.
What I ended up doing was coming up with an idea of a "variable bridge" that allowed variables to be read and set using getVar
and setVar
. This made me have to extract the CLI code from the API code and add some imports to the variable bridge.
In the CLI file, I added the shebang, and modified the package.json
of my project to have:
{ ... "main": "./bin/api.js", "bin": { "validator": "./bin/cli.js" } ...}
Here are a few small notes that I think might help if Windows Script Host is still giving an error (I applied all of them so I'm not sure which one helped):
Using only LF line endings seemed to help.
It seems that
./bin
is the preferred directory for compiled files. I did try./dist
but it didn't work for me.An empty line after the shebang may be needed:
// cli.js#!/usr/bin/env node// code...
Using the same name for
main
andbin
inpackage.json
seemed to be an issue for me.