194

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

4

9 回答 9

186

您可以删除 node_module 目录

rm -rf node_modules/
于 2012-07-06T10:04:59.367 回答
98

这个工作实际上有特殊的命令

npm ci

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

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

于 2020-07-24T21:40:47.277 回答
80

我将此添加到我的 package.json 中:

"build": "npm build",
"clean": "rm -rf node_modules", 
"reinstall": "npm run clean && npm install", 
"rebuild": "npm run clean && npm install && npm run build",

似乎运作良好。

于 2018-03-31T15:22:55.637 回答
22

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

npx npkill

它会找到所有 node_modules 并让您删除它们。

npkill

于 2019-11-06T17:43:16.200 回答
8

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());
于 2012-12-19T17:00:20.247 回答
6

总之没有

在两个,还没有

然而,一个--no-build标志在npm install不构建的情况下执行安装存在一个未解决的问题,它可以用来做你所要求的。

请参阅这个未解决的问题

于 2015-04-12T20:22:25.470 回答
4

对于windows环境:

"scripts": {
    "clean": "rmdir /s /q node_modules",
    ...
}
于 2019-02-26T09:55:07.447 回答
3

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

如果你只想clean你可以使用这个rimraf node_modules

于 2019-07-08T08:44:14.983 回答
3

npm ci适用于这种情况,但仅当您的package.jsonpackage-lock.json同步时,如果您一直致力于快速解决冲突或通过删除目录/符号链接在目录级别进行更新,则情况可能并非总是如此。这个问题的综合答案将是这个..

  1. 用你想要的东西编辑package.json并删除你不需要的东西。
  2. 生成package-lock.json这样的,npm install --package-lock-only
  3. 运行npm ci。这应该删除所有工件并且不应该重建它们。
于 2021-04-08T10:13:37.927 回答