Cli: [BUG] npm/npx is not handling directories with spaces (on Windows) correctly

Created on 19 Nov 2019  路  5Comments  路  Source: npm/cli

When I try to install packages (specifically, this one: https://www.npmjs.com/package/ts-rws) with the latest version of npm (6.13.0) on Windows 10, I get an error and a stack trace:

error ...\node_modules\ts-rws: Command failed.
Exit code: 7
Command: npx npm-force-resolutions
Arguments:
Directory: ...\node_modules\ts-rws
Output:
Error: EPERM: operation not permitted, mkdir 'C:\Users\Kyle'
TypeError: Cannot read property 'get' of undefined
    at errorMessage (C:\Program Files\Node.js\node_modules\npm\lib\utils\error-message.js:38:39)
    at errorHandler (C:\Program Files\Node.js\node_modules\npm\lib\utils\error-handler.js:201:13)
    at C:\Program Files\Node.js\node_modules\npm\bin\npm-cli.js:78:20
    at cb (C:\Program Files\Node.js\node_modules\npm\lib\npm.js:225:22)
    at C:\Program Files\Node.js\node_modules\npm\lib\npm.js:263:24
    at C:\Program Files\Node.js\node_modules\npm\lib\config\core.js:81:7
    at Array.forEach (<anonymous>)
    at C:\Program Files\Node.js\node_modules\npm\lib\config\core.js:80:13
    at f (C:\Program Files\Node.js\node_modules\npm\node_modules\once\once.js:25:25)
    at afterExtras (C:\Program Files\Node.js\node_modules\npm\lib\config\core.js:171:20)
C:\Program Files\Node.js\node_modules\npm\lib\utils\error-handler.js:97
  var doExit = npm.config.loaded ? npm.config.get('_exit') : true
                          ^

TypeError: Cannot read property 'loaded' of undefined
    at exit (C:\Program Files\Node.js\node_modules\npm\lib\utils\error-handler.js:97:27)
    at process.errorHandler (C:\Program Files\Node.js\node_modules\npm\lib\utils\error-handler.js:216:3)

The problem is that npm/npx is not quoting some directory correctly, which results in this:

Error: EPERM: operation not permitted, mkdir 'C:\Users\Kyle' 

I've been seeing this issue for a long time now (npx commands don't work on Windows), and I've been able to ignore the problem in the past, but now I can't install packages anymore, which is a huge problem. Is there a fix for this?

Bug Windows

Most helpful comment

Try this

  1. Run npm config edit
  2. Add these lines:
cache=C:\Users\Kyle~1\AppData\Roaming\npm-cache
globalconfig=C:\Users\Kyle~1\AppData\Roaming\npm\etc\npmrc
init-module=C:\Users\Kyle~1\.npm-init.js
tmp=C:\Users\Kyle~1\AppData\Local\Temp
userconfig=C:\Users\Kyle~1\.npmrc
globalignorefile=C:\Users\Kyle~1\AppData\Roaming\npm\etc\npmignore

All 5 comments

There seem to be multiple layers of issues here and I'm still trying to figure out which package is responsible for the root issue. The stack traces about Cannot read property ... are definitely issues with npm itself. In lib/utils/error-handler.js and lib/utils/error-message.js, I see lots of code of this form:

if (npm.config.foo) // do something

There needs to be an extra check to handle a config that's missing entirely:

if (npm.config && npm.config.foo) // do something

I've made these changes locally and all those errors and stack traces have gone away (but I'm still running into the malformed directory issue).

Try this

  1. Run npm config edit
  2. Add these lines:
cache=C:\Users\Kyle~1\AppData\Roaming\npm-cache
globalconfig=C:\Users\Kyle~1\AppData\Roaming\npm\etc\npmrc
init-module=C:\Users\Kyle~1\.npm-init.js
tmp=C:\Users\Kyle~1\AppData\Local\Temp
userconfig=C:\Users\Kyle~1\.npmrc
globalignorefile=C:\Users\Kyle~1\AppData\Roaming\npm\etc\npmignore

Hey that worked! Oh wow, thanks so much. This was a million times more helpful than the support I received from npm.

you are welcome :)

Just encountered this. It still exists in npm exec and the aliased npx when a _user's_ name includes a space. This means that anyone who has a space in their Windows name will be unable to use npm exec and npx.

Was this page helpful?
0 / 5 - 0 ratings