NPM清洁模块


144

有没有办法让npm解压node_modules下的所有模块?诸如npm rebuild之类的东西会删除所有构建工件,但不重建它们吗?


4
以为你永远不会问呢。我一直在检查我的node_modules目录到混帐作为推荐mikealrogers.com/posts/nodemodules-in-git.html。当我添加一个新模块或更新当前模块时,我最终在git中生成了不应存在的构件,必须对其进行清理。我在想,如果我可以先清洗它们,则过程会更加顺利。
戴夫·凯西

1
快速说明:NPM支持shrinkwrap(请参阅npmjs.org/doc/shrinkwrap.html),您可以锁定所有依赖项的版本(而不仅仅是顶级的)。
米歇尔·提里(Michelle Tilley),2012年

2
不具有此功能也很容易跨平台开发。我们在Mac上进行开发,并在Linux上运行CI,因此每次在Linux上进行构建时,都需要删除node_modules目录并完全重新安装,这会浪费大量时间。
JBCP

4
@JBCP,您做错了。您应该做的是在中安装模块packages.json(使用npm --save),然后将node_modules目录放入.gitignore(如果使用git)。CI不应拉您的node_modules,而应执行npm install。最后,如果从npm注册表下载花费的时间太长,请使用sinopia之类的内容对其进行缓存。
Bojan Markovic

1
@BojanMarkovic-您是正确的,这就是我们现在设置项目的方式。我上面的评论来自大约一年前。有(一些)项目建议将node_modules提交到Git中,但这绝对是不正确的。
JBCP

Answers:


160

您可以只删除node_module目录

rm -rf node_modules/

14
这将删除node_modules的源以及已编译的输出,因此不会回答问题。
theGecko 2012年

如果您具有与npm link链接的依赖项,则不妨在其源目录中删除这些模块的源代码,这可能会非常痛苦...
cschuff

12
我将此添加到了我的package.json"clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",。似乎运作良好。
卢卡斯

5
对于Windows> rd node_modules / s
Samantha

2
@Lucas,您应该发布此答案,因为它是最合适的答案
Joseph

57

我将此添加到我的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",

似乎运作良好。


2
clean必须在package.json中定义!
Ciasto piekarz

20
@Ciastopiekarz吗?那就是我上面的回答?
卢卡斯

如果基于Linux的机器使用'室射频node_modules',窗口的柜面'命令rmdir / S / Q node_modules'
Mohamed.Abdo

8

您可以利用“ npm cache”命令下载包tarball并将其解压缩到npm cache目录中。

然后可以复制源。

使用从https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU收集到的想法,我想到了以下节点脚本。没有任何保证,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());

12
我觉得很奇怪,npm实际推荐的这种基本功能需要黑客来实现。其他人都在做什么?只是忽略建议并使用npm install
VitalyB 2014年

5

一句话没有

二,没有

但是,--no-build标记在npm install不进行构建的情况下执行安装存在一个未解决的问题,该问题可用于完成您所要求的操作。

看到这个未解决的问题




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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.