โมดูลทำความสะอาด NPM


144

มีวิธีรับ npm เพื่อยกเลิกการสร้างโมดูลทั้งหมดภายใต้ node_modules หรือไม่? สิ่งที่ต้องการสร้างใหม่ npm ที่ลบส่วนสร้างออกทั้งหมด แต่ไม่สร้างใหม่


4
คิดว่าคุณไม่เคยถาม ฉันได้รับการตรวจสอบไดเรกทอรี node_modules ของฉันเป็นคอมไพล์ตามที่แนะนำในmikealrogers.com/posts/nodemodules-in-git.html เมื่อฉันเพิ่มโมดูลใหม่หรืออัปเดตปัจจุบันฉันจบด้วยการสร้างสิ่งประดิษฐ์ในคอมไพล์ที่ไม่ควรอยู่ที่นั่นและต้องทำความสะอาด ฉันคิดว่าถ้าฉันสามารถทำความสะอาดพวกเขาก่อนกระบวนการจะราบรื่นขึ้นเล็กน้อย
Dave Causey

1
หมายเหตุอย่างย่อหนึ่งข้อ: ขณะนี้ NPM รองรับshrinkwrap(ดูnpmjs.org/doc/shrinkwrap.html ) คุณสามารถล็อคเวอร์ชันของการอ้างอิงทั้งหมดของคุณได้ (แทนที่จะเป็นแค่ระดับสูงสุด)
Michelle Tilley

2
ไม่มีคุณสมบัตินี้ครับสำหรับการพัฒนาข้ามแพลตฟอร์มเช่นกัน เราพัฒนาบน Mac และรัน CI บน Linux และจำเป็นต้องลบไดเร็กทอรี node_modules และติดตั้งใหม่ทุกครั้งที่เราสร้างบิวด์บน Linux ซึ่งเสียเวลาไปมาก
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

คำตอบ:


160

คุณสามารถลบไดเร็กทอรี node_module

rm -rf node_modules/

15
สิ่งนี้จะลบแหล่งที่มาของ node_modules รวมถึงเอาต์พุตที่คอมไพล์แล้วดังนั้นจึงไม่ตอบคำถาม
theGecko

หากคุณมีการอ้างอิงการเชื่อมโยงกับการเชื่อมโยง NPM ก็เช่นกันอาจจะลบเหล่านี้แหล่งโมดูลในไดเรกทอรีแหล่งที่มาซึ่งสามารถเจ็บปวดมาก ...
cschuff

12
ฉันเพิ่มนี้เพื่อของฉัน:package.json "clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",ดูเหมือนว่าจะทำงานได้ดี
Lucas

5
สำหรับ windows> rd node_modules / s
Ishara 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? นั่นคือสิ่งที่คำตอบของฉันบอกว่าข้างต้น?
ลูคัส

ใช้ 'RM -rf node_modules ในกรณีเครื่องลินุกซ์ตามกรณีของหน้าต่าง 'node_modules rmdir / s / q'
Mohamed.Abdo

ในการใช้สิ่งเหล่านี้คุณไม่สามารถเรียกว่า "npm clean" เนื่องจาก clean ไม่ได้เป็นชื่อที่ยอมรับใน npm คุณต้องทำ "npm run clean"
PCoelho

8

คุณสามารถใช้ประโยชน์จากคำสั่ง 'npm cache' ซึ่งดาวน์โหลดแพคเกจ tarball และคลายมันลงในไดเรกทอรีแคช npm

สามารถคัดลอกแหล่งที่มาได้

การใช้แนวคิดที่รวบรวมมาจาก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

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

ถ้าคุณต้องการที่เดียวที่คุณสามารถใช้นี้cleanrimraf node_modules


0

มีคำสั่งพิเศษจริง ๆ สำหรับงานนี้

npm ci

มันจะลบnode_modulesไดเรกทอรีและจะติดตั้งแพ็คเกจที่เกี่ยวข้องกับpackage-lock.jsonไฟล์ของคุณ

ข้อมูลเพิ่มเติม: https://docs.npmjs.com/cli/ci.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.