2024-12-25 10:00:02

NPM清洁模块

有没有办法让npm取消构建node_modules下的所有模块?像npm rebuild这样的东西会删除所有构建构件,但不重新构建它们?


当前回答

你可以利用'npm cache'命令下载包tarball并将其解包到npm缓存目录。

然后可以复制源文件。

使用从https://groups.google.com/forum/?fromgroups=#收集的想法!我想出了下面的节点脚本。没有担保,YMMV等等。

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());

其他回答

试一试 https://github.com/voidcosmos/npkill

npx npkill

它将找到所有的node_module并允许您删除它们。

您可以删除node_module目录

rm -rf node_modules/

我在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",
  ...
}

如果你只想清理,你可以使用这个rimraf node_modules。

这项工作实际上有专门的命令

npm ci

它将删除node_modules目录,并根据您的package-lock安装包。json文件

更多信息:https://docs.npmjs.com/cli/ci.html

NPM ci适用于这种情况,但只适用于你的包。Json和包锁。Json是同步的,如果你一直在处理其中一个以快速解决冲突,或者通过删除目录/符号链接来更新目录级别,那么情况可能并不总是如此。对这个问题的全面回答是这样的。

编辑包。Json与任何你想要的和删除你不需要的。 生成包锁。这样的Json, NPM install——package-lock-only 执行npm ci。这将删除所有工件,而不应该重新构建它们。