2012-07-05 2 views
77

npm이 node_modules 아래의 모든 모듈을 풀어 버릴 수있는 방법이 있습니까? npm 재 구축과 같은 것이 모든 빌드 아티팩트를 제거하지만 다시 빌드하지는 않습니까?NPM 클린 모듈

+0

왜 이렇게해야하는지 자세히 설명해 주시겠습니까? –

+3

묻지 않을 줄 알았는데. 나는 http://www.mikealrogers.com/posts/nodemodules-in-git.html에서 권장하는대로 git으로 node_modules 디렉토리를 검사 해왔다. 새 모듈을 추가하거나 현재 모듈을 업데이트하면 git에 빌드 아티팩트가 존재하지 않아야하고 결국 정리해야합니다. 나는 공정을 좀 더 부드럽게 진행할 수 있다고 생각했다. –

+1

한 가지주의 할 점 : NPM이'shrinkwrap'을 지원하기 때문에 (http://npmjs.org/doc/shrinkwrap.html 참조), 상위 레벨의 것들이 아닌 모든 의존성의 버전을 잠글 수 있습니다. –

답변

103

당신은 당신은 패키지 타르볼을 다운로드하고 NPM 캐시 디렉토리로 압축을 풉니 다 'NPM 캐시'명령을 활용할 수있는 node_module 디렉토리를

rm -rf node_modules/ 
+12

이렇게하면 node_module과 컴파일 된 출력의 소스가 제거되므로 질문에 답할 수 없습니다. – theGecko

+0

의존성이 npm 링크와 연결되어 있다면, 소스 디렉토리에서이 모듈 소스를 지우는 것이 꽤 고통스러워 질 수도 있습니다 ... – cschuff

+0

나는 실제로 이것을 좋아합니다. 때로는 node_modules를 제거하고 다시 설치해야합니다. –

7

을 삭제할 수 있습니다.

소스

다음에 복사 할 수 있습니다. 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 %[email protected]%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()); 
+11

실제로 npm에서 권장하는 이러한 기본 기능을 달성하려면 해킹이 필요하다는 사실을 알게되었습니다. 다른 사람들은 무엇을합니까? 그냥 추천을 무시하고'npm install'을 사용 하시겠습니까? – VitalyB

5

단어 아니요.

2 가지로, 은 아직입니다.

npm install--no-build 플래그로 공개되지 않아서 건물을 설치하지 않고 설치할 수 있습니다. 요청한 작업을 수행하는 데 사용할 수 있습니다.

this open issue을 참조하십시오.