Mô-đun sạch NPM


144

Có cách nào để có được npm để hủy bỏ tất cả các mô-đun dưới node_modules không? Một cái gì đó giống như npm xây dựng lại mà loại bỏ tất cả các tạo tác xây dựng nhưng không xây dựng lại chúng?


4
Nghĩ rằng bạn sẽ không bao giờ hỏi. Tôi đã kiểm tra thư mục node_modules của mình vào git như được đề xuất trong mikealrogers.com/posts/nodemodules-in-git.html . Khi tôi thêm một mô-đun mới hoặc cập nhật một mô-đun hiện tại, tôi sẽ kết thúc với các tạo phẩm xây dựng trong git không nên có và phải dọn sạch chúng. Tôi đã suy nghĩ nếu tôi có thể làm sạch chúng trước thì quá trình sẽ diễn ra suôn sẻ hơn một chút.
Dave Causey

1
Một lưu ý nhanh: bây giờ NPM hỗ trợ shrinkwrap(xem npmjs.org/doc/shrinkwrap.html ), bạn có thể khóa các phiên bản của TẤT CẢ các phụ thuộc của bạn (thay vì chỉ các phiên bản cấp cao nhất).
Michelle Tilley

2
Không có tính năng này hút để phát triển đa nền tảng là tốt. Chúng tôi phát triển trên Mac và chạy CI trên Linux và cần xóa thư mục node_modules và cài đặt lại hoàn toàn mỗi khi chúng tôi xây dựng trên Linux, gây lãng phí rất nhiều thời gian.
JBCP

4
@JBCP bạn đang làm sai. Những gì bạn nên làm là cài đặt các mô-đun vào packages.json(sử dụng npm --save) và đặt node_modulesthư mục vào .gitignore(nếu sử dụng git ). CI không nên kéo node_modules của bạn, nhưng thực thi npm install. Cuối cùng, nếu việc tải xuống từ npm registry mất quá nhiều thời gian, hãy sử dụng một cái gì đó như sinopia để lưu trữ nó.
Bojan Markovic

1
@BojanMarkovic - Bạn đã đúng, đây là cách các dự án của chúng tôi được thiết lập ngay bây giờ. Nhận xét của tôi ở trên là từ khoảng một năm trước. Có (đã) một vài dự án đề xuất cam kết node_modules vào Git, nhưng điều đó chắc chắn là không chính xác.
JBCP

Câu trả lời:


160

Bạn chỉ có thể xóa thư mục node_module

rm -rf node_modules/

14
Điều này sẽ loại bỏ nguồn của node_modules cũng như đầu ra được biên dịch, do đó không trả lời câu hỏi.
theGecko

Nếu bạn có các phụ thuộc được liên kết với liên kết npm, nó cũng có thể xóa các nguồn mô-đun này trong thư mục nguồn của nó, điều này có thể khá đau đớn ...
cschuff

12
Tôi đã thêm nó vào package.json: "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",. Có vẻ để làm việc tốt.
Lucas

5
Đối với các cửa sổ> nút node_modules / s
Ishara Samantha

2
@ Bạn nên đăng câu trả lời này vì đây là câu trả lời phù hợp nhất
Joseph

56

Tôi đã thêm cái này vào gói.json của mình:

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

Có vẻ để làm việc tốt.


2
cleanphải được định nghĩa trong gói.json!
Ciasto piekarz

20
@Ciastopiekarz? Đó là những gì câu trả lời của tôi nói ở trên?
Lucas

sử dụng 'rm -rf node_modules' trong máy trường hợp linux dựa, trong trường hợp các cửa sổ 'rmdir / s / q node_modules'
Mohamed.Abdo

8

Bạn có thể tận dụng lệnh 'npm cache' để tải tarball gói và giải nén nó vào thư mục bộ đệm npm.

Nguồn sau đó có thể được sao chép vào.

Sử dụng các ý tưởng lượm lặt được từ https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfU Tôi đã đưa ra tập lệnh nút sau. Không bảo hành, YMMV, vân vân.

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
Tôi thấy rất lạ khi một chức năng cơ bản như vậy, thực sự được npm khuyên dùng, đòi hỏi phải có hack để đạt được. Những người còn lại làm gì? Chỉ cần bỏ qua các khuyến nghị và sử dụng npm install?
VitalyB

5

Trong một từ không .

Trong hai, chưa .

Tuy nhiên, có một vấn đề mở đối với một --no-buildcờ npm installđể thực hiện cài đặt mà không cần xây dựng, có thể được sử dụng để thực hiện những gì bạn yêu cầu.

Xem vấn đề mở này .



4

Đối với môi trường windows:

"scripts": {
    "clean": "rmdir /s /q node_modules",
    ...
}

3

Tôi đã thêm một vài dòng bên trong pack.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",
  ...
}

Nếu bạn muốn cleanchỉ bạn có thể sử dụng này rimraf node_modules.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.