NPM clean modules

前端 未结 8 597
时光取名叫无心
时光取名叫无心 2020-12-24 00:14

Is there a way to get npm to unbuild all the modules under node_modules? Something like npm rebuild that removes all build artifacts but doesn\'t rebuild them?

相关标签:
8条回答
  • 2020-12-24 00:24

    In a word no.

    In two, not yet.

    There is, however, an open issue for a --no-build flag to npm install to perform an installation without building, which could be used to do what you're asking.

    See this open issue.

    0 讨论(0)
  • 2020-12-24 00:26

    You can take advantage of the 'npm cache' command which downloads the package tarball and unpacks it into the npm cache directory.

    The source can then be copied in.

    Using ideas gleaned from https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU I came up with the following node script. No warranties, YMMV, etcetera.

    var fs = require('fs'),
    path = require('path'),
    exec = require('child_process').exec,
    util = require('util');
    
    var packageFileName = 'package.json';
    var modulesDirName = 'node_modules';
    var cacheDirectory = process.cwd();
    var npmCacheAddMask = 'npm cache add %s@%s; echo %s';
    var sourceDirMask = '%s/%s/%s/package';
    var targetDirMask = '%s/node_modules/%s';
    
    function deleteFolder(folder) {
        if (fs.existsSync(folder)) {
            var files = fs.readdirSync(folder);
            files.forEach(function(file) {
                file = folder + "/" + file;
                if (fs.lstatSync(file).isDirectory()) {
                    deleteFolder(file);
                } else {
                    fs.unlinkSync(file);
                }
            });
            fs.rmdirSync(folder);
        }
    }
    
    function downloadSource(folder) {
        var packageFile = path.join(folder, packageFileName);
        if (fs.existsSync(packageFile)) {
            var data = fs.readFileSync(packageFile);
            var package = JSON.parse(data);
    
            function getVersion(data) {
                var version = data.match(/-([^-]+)\.tgz/);
                return version[1];
            }
    
            var callback = function(error, stdout, stderr) {
                var dependency = stdout.trim();
                var version = getVersion(stderr);
                var sourceDir = util.format(sourceDirMask, cacheDirectory, dependency, version);
                var targetDir = util.format(targetDirMask, folder, dependency);
                var modulesDir = folder + '/' + modulesDirName;
    
                if (!fs.existsSync(modulesDir)) {
                    fs.mkdirSync(modulesDir);
                }
    
                fs.renameSync(sourceDir, targetDir);
                deleteFolder(cacheDirectory + '/' + dependency);
                downloadSource(targetDir);
            };
    
            for (dependency in package.dependencies) {
                var version = package.dependencies[dependency];
                exec(util.format(npmCacheAddMask, dependency, version, dependency), callback);
            }
        }
    }
    
    if (!fs.existsSync(path.join(process.cwd(), packageFileName))) {
        console.log(util.format("Unable to find file '%s'.", packageFileName));
        process.exit();
    }
    
    deleteFolder(path.join(process.cwd(), modulesDirName));
    process.env.npm_config_cache = cacheDirectory;
    downloadSource(process.cwd());
    
    0 讨论(0)
  • 2020-12-24 00:27

    I have added few lines inside package.json:

    "scripts": {
      ...
      "clean": "rmdir /s /q node_modules",
      "reinstall": "npm run clean && npm install",
      "rebuild": "npm run clean && npm install && rmdir /s /q dist && npm run build --prod",
      ...
    }
    

    If you want to clean only you can use this rimraf node_modules.

    0 讨论(0)
  • 2020-12-24 00:30

    Try https://github.com/voidcosmos/npkill

    npx npkill
    

    it will find all node_modules and let you remove them.

    0 讨论(0)
  • 2020-12-24 00:30

    For windows environment:

    "scripts": {
        "clean": "rmdir /s /q node_modules",
        ...
    }
    
    0 讨论(0)
  • 2020-12-24 00:31

    You can just delete the node_module directory

    rm -rf node_modules/
    
    0 讨论(0)
提交回复
热议问题