Search code examples
node.jsnpmwindows-server-2016nvmnpm-update

npm WARN saveError EPERM: operation not permitted, rename 'C:\...\package.json.3542172463' -> 'C:\...\package.json'


Environment:

Node: 8.11.2 (installed from nvm)
npm: 5.6.0
OS: Windows Server 2016
AV: Only Windows Defender but it has been disabled

Used command:

npm install
npm install grunt

When I run the first command (npm install) all modules described in the package.json file are correctly installed.

When I run the second command (npm install grunt) I get an error:

npm WARN saveError EPERM: operation not permitted, rename 'C:\...\package.json.3542172463' -> 'C:\...\package.json'
removed 762 packages in 16.89s

and several hundred modules are removed from my node_module directory.

Does anyone have a clue what can cause such a problem?

I've already tried to disable proxy, clear the npm cache, disable AV (there is only Windows Defender) with no result.


Solution

  • Update to the latest npm version (v6.2.0) did the trick :)

    Because I've used nvm to install Node.js on Windows I had a little problems to update npm, but I found the below script, written by Adrien Pyke (based on @arfaWong's idea) and published on: https://github.com/coreybutler/nvm-windows/issues/300#issuecomment-390293097

    @echo off
    SETLOCAL EnableDelayedExpansion
    
    if [%1] == [] (
        echo Pass in the version you would like to install, or "latest" to install the latest npm version.
    ) else (
        set wanted_version=%1
    
        if "!wanted_version!" == "latest" (
            for /f %%i in ('npm show npm version') do set wanted_version=%%i
        )
    
        for /f %%i in ('npm -g -v') do set cur_version=%%i
    
        if "!cur_version!" == "!wanted_version!" (
            echo Already on npm version !wanted_version!.
        ) else (
            echo Updating to !wanted_version!...
    
            set node_path=!PROGRAMFILES!\nodejs
    
            rename "!node_path!\npm" npm2
            rename "!node_path!\npm.cmd" npm2.cmd
            rename "!node_path!\node_modules\npm" npm2
            node "!node_path!\node_modules\npm2\bin\npm-cli.js" i npm@!wanted_version! -g
    
            for /f %%i in ('npm -g -v') do set new_version=%%i
    
            echo New version installed is !new_version!
    
            if "!new_version!" == "!wanted_version!" (
                echo Successfully updated to !wanted_version!. Cleaning up backups...
                del "!node_path!\npm2"
                del "!node_path!\npm2.cmd"
                @RD /S /Q "!node_path!\node_modules\npm2"
                echo Update complete.
            ) else (
                echo Something went wrong. Rolling back.
                if exist "!node_path!\npm" (
                    del "!node_path!\npm"
                )
                if exist "!node_path!\npm.cmd" (
                    del "!node_path!\npm.cmd"
                )
                if exist "!node_path!\node_modules\npm" (
                    @RD /S /Q "!node_path!\node_modules\npm"
                )
                rename "!node_path!\npm2" npm
                rename "!node_path!\npm2.cmd" npm.cmd
                rename "!node_path!\node_modules\npm2" npm
            )
        )
    )