user949300 user949300 - 5 months ago 7x
Node.js Question

Configure node npm package.json so that "npm test" works on both unix and windows

I have developed a node.js npm module, developing under Windows. Today I wrote some Mocha tests. After many struggles, it seemed that for

npm test
to work,
had to look like this: (there may be other options???)

"scripts": { "test": "node node_modules/mocha/bin/mocha" }

instead of what's in all the Unix based books,

"scripts": { "test": "./node_modules/.bin/mocha" }

How can I set package.json up to work on both Windows and Unix? I'm assuming that Travis-CI runs Unix, so, should I link the build to that, it will blow up with the Windows version.

I found a two year old thread where somebody requested a feature for exactly this. That thread seemed to die out. This SO question seems to be close, but it isn't exactly what I want and, frankly, I can't understand the answer. :-( Can anybody clarify?

For the time being, I am going

"scripts": {
"test": "node node_modules/mocha/bin/mocha",
"testOnUnixUseThis" : "./node_modules/.bin/mocha (I think)",
"testOnWindowsUseThis" : "node node_modules/mocha/bin/mocha"

Unfortunately, you cant go
npm test testOnWindowsUseThis
npm testOnWindowsUseThis
. And it doesn't fix the Travis-CI issue. But at least a person who downloads the module can (hopefully) see what is going on.

Any better ideas? Am I the only person still developing under Windows??? :-)


I've always been able to npm install -g mocha and then just add

"scripts": {
    "test": "mocha spec"

to package.json. That may or may not work in EVERY environment. I know, for instance, with lineman, you have to use bin/mocha. Also, if you don't find a way around this, set your test script up for Unix and then add a second script called "wintest" or something that does whatever you need it to do in Windows. It's a little known fact of npm/package.json, but you can name your scripts whatever you want. The default ones (test, start, etc.) can be used with npm [command]; any non-standard ones (like wintest) can be used with npm run-script [command], and they will still work.


Not sure at what point in npm history this changed, but npm run <script-name> now works (don't need to do npm run-script <script-name> anymore). Possibly run-script still works as well. I'd expect it to, but I haven't tried it.