NPM 클린 모듈


144

node_modules 아래에서 모든 모듈을 빌드 해제하기 위해 npm을 얻는 방법이 있습니까? npm rebuild와 같은 것이 모든 빌드 아티팩트를 제거하지만 다시 빌드하지는 않습니까?


4
당신은 물어 보지 않을 거라고 생각했다. mikealrogers.com/posts/nodemodules-in-git.html에서 권장하는대로 node_modules 디렉토리를 git로 확인 했습니다 . 새 모듈을 추가하거나 현재 모듈을 업데이트하면 git에 빌드 아티팩트가 없어야하며 정리해야합니다. 먼저 청소할 수 있다면 프로세스가 좀 더 순조롭게 진행될 것이라고 생각했습니다.
Dave Causey

1
간단한 참고 사항 : 이제 NPM이 지원하므로 shrinkwrap( npmjs.org/doc/shrinkwrap.html 참조 ) 최상위 수준 대신 모든 종속성 버전을 잠글 수 있습니다.
Michelle Tilley

2
이 기능이 없으면 크로스 플랫폼 개발에도 어려움이 있습니다. Mac에서 개발하고 Linux에서 CI를 실행하며 Linux에서 빌드 할 때마다 node_modules 디렉토리를 제거하고 완전히 다시 설치해야하므로 많은 시간이 낭비됩니다.
JBCP

4
@ JBCP 당신이 잘못하고 있습니다. 당신이해야 할 일은 모듈을 설치 packages.json(사용 npm --save)하고 node_modules디렉토리를 넣는 것 입니다 .gitignore( git 사용하는 경우 ). CI는 node_modules를 가져 오지 말고 실행하십시오 npm install. 마지막으로 npm 레지스트리에서 다운로드하는 데 시간이 너무 오래 걸리면 시노 피아 와 같은 것을 사용 하여 캐시하십시오.
보얀 마르코비치

1
@BojanMarkovic-당신이 맞습니다, 이것이 우리 프로젝트가 지금 설정되는 방식입니다. 위의 의견은 약 1 년 전의 것입니다. 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
cleanpackage.json에 정의되어야합니다!
Ciasto piekarz

20
@Ciastopiekarz? 그것이 내 대답이 위에서 말한 것입니까?
Lucas

리눅스 기반 머신의 경우, 'rmdir / s / q node_modules'의 경우 'rm -rf node_modules'사용
Mohamed.Abdo

clean은 npm에서 허용되는 이름 중 하나가 아니기 때문에이를 사용하려면 "npm clean"을 호출 할 수 없습니다. "npm run clean"을 수행해야합니다.
PCoelho

8

tarball 패키지를 다운로드하여 npm 캐시 디렉토리에 압축 해제하는 '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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.