एनपीएम स्वच्छ मॉड्यूल


144

वहाँ एक तरीका है npm प्राप्त करने के लिए सभी मॉड्यूल नोड के तहत नोड_मॉड्यूल्स? एनपीएम पुनर्निर्माण जैसा कुछ है जो सभी निर्माण कलाकृतियों को हटाता है लेकिन उन्हें पुनर्निर्माण नहीं करता है?


4
सोचा था, तुम कभी भी नहीं पूछोगे। मैं gik में अपने नोड_मॉड्यूल निर्देशिका की जाँच कर रहा हूँ जैसा कि mikealrogers.com/posts/nodemodules-in-git.html में सुझाया गया है । जब मैं एक नया मॉड्यूल जोड़ता हूं या वर्तमान को अपडेट करता हूं, तो मैं जीआईटी में कलाकृतियों का निर्माण करता हूं जो कि नहीं होनी चाहिए और उन्हें साफ करना होगा। मैं सोच रहा था कि क्या मैं उन्हें पहले साफ कर सकता हूं, प्रक्रिया थोड़ी और सुचारू रूप से चलेगी।
डेव कॉसे

1
एक त्वरित टिप्पणी: अब जब एनपीएम समर्थन करता है shrinkwrap( npmjs.org/doc/shrinkwrap.html देखें ), आप अपने सभी निर्भरता के संस्करणों (केवल शीर्ष स्तर के बजाय) को लॉक कर सकते हैं।
मिशेल टायली

2
इस फीचर के न होने से क्रॉस प्लेटफॉर्म डेवलपमेंट के लिए भी बेकार है। हम मैक पर विकसित होते हैं और लिनक्स पर सीआई चलाते हैं, और नोड_मॉडल निर्देशिका को हटाने और हर बार जब हम लिनक्स पर एक निर्माण करते हैं, तो पूरी तरह से पुनः स्थापित करने की आवश्यकता होती है, जो एक टन समय बर्बाद करता है।
JBCP

4
@JBCP आप इसे गलत कर रहे हैं। आप जो कर रहे हैं वह packages.json(उपयोग करना npm --save) में मॉड्यूल स्थापित कर रहा है और node_modulesनिर्देशिका को डाल रहा है .gitignore(यदि गिट का उपयोग कर रहा है )। CI को आपका node_modules नहीं खींचना चाहिए, लेकिन निष्पादित करें npm install। अंत में, यदि npm रजिस्ट्री से डाउनलोड करने में बहुत अधिक समय लगता है, तो इसे कैश करने के लिए साइनोपिया जैसी किसी चीज़ का उपयोग करें ।
बोजान मार्कोविक

1
@BojanMarkovic - आप सही हैं, इस तरह से हमारी परियोजनाएँ अभी सेटअप हैं। ऊपर मेरी टिप्पणी लगभग एक साल पहले की थी। ऐसी कुछ परियोजनाएँ हैं, जो नीतिवचन में नोड_मॉडल बनाने की सिफारिश करती हैं, लेकिन यह निश्चित रूप से सही नहीं है।
JBCP

जवाबों:


160

आप केवल node_module निर्देशिका को हटा सकते हैं

rm -rf node_modules/

14
यह नोड_मॉडल्स के स्रोत के साथ-साथ संकलित आउटपुट को हटा देगा, इसलिए इस सवाल का जवाब नहीं है।
जीको

यदि आपके पास 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",। अच्छा काम करने लगता है।
लुकास

5
खिड़कियों के लिए> rd नोड_modules / s
इशारा सामंथा

2
@ लुकास आपको इसका उत्तर पोस्ट करना चाहिए क्योंकि यह सबसे उपयुक्त है
जोसफ

57

मैंने इसे अपने पैकेज में जोड़ा। 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
cleanpackage.json में परिभाषित किया जाना है!
Ciasto piekarz

20
@Ciastopiekarz? यही मेरा उत्तर ऊपर कहता है?
लुकास

मामले linux आधारित मशीन में 'rm- आरएफ node_modules' का उपयोग करें, खिड़कियों के बैठाना 'rmdir / एस / q node_modules'
Mohamed.Abdo

इन्हें इस्तेमाल करने के लिए आप "npm क्लीन" नहीं कह सकते हैं क्योंकि क्लीन npm पर स्वीकृत नामों में से एक नहीं है। आपको "npm रन क्लीन" करने की आवश्यकता है।
पीसीलोहो

8

आप 'npm कैश' कमांड का लाभ उठा सकते हैं जो पैकेज टारबॉल डाउनलोड करता है और इसे 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 install?
विटालिबी

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


0

इस काम के लिए वास्तव में विशेष कमांड है

npm ci

यह node_modulesनिर्देशिका को हटा देगा और आपकी package-lock.jsonफ़ाइल के संबंध में पैकेज स्थापित करेगा

अधिक जानकारी: https://docs.npmjs.com/cli/ci.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.