2013-12-19 2 views
0

우리 환경에서는 외부 (또는 시스템 전체) 종속성없이 많은 사용자가 사용할 빌드/유틸리티 도구를 빌드하고 있습니다. 즉, 툴 디렉토리에 node.js 바이너리를 패키징 할 때 사용자가 전 세계적으로 설치 한 node.js의 버전을 염려 할 필요가 없도록 빌드하려고합니다. (이러한 접근법의 장점에 대해 언급하지 말아주십시오.) 우리는/웹/도구/빈은 스크립트의 실행에 (첫 번째 순서로) $ PATH 변수에 추가되거나하는 작업을 grunt.js 한Node.js, Bash 스크립트 및 디렉토리 - 로컬 노드 바이너리

/web/tool/ 
/web/tool/bin/ (where the node binary lives) 
/web/tool/node_modules 

: 같은

우리의 도구의 구조는 국지 바이너리 경로가 다른 경로보다 우선해야합니다.

bash 스크립트 또는 grunt.js 태스크를 실행할 때, 초기 태스크는 적절한 노드 2 진을 찾습니다. 이것은 노드가 전 세계적으로 설치되지 않은 환경에서 테스트되었으므로 디렉토리 - 로컬 노드 바이너리를 찾는 것으로 나타났습니다. 그러나 이러한 스크립트/grunt-tasks 내에서 생성 된 모든 후속 프로세스는 노드 바이너리를 전역 적으로 찾습니다.

우리의 특정 사용자 케이스는 툴툴 거리는 작업을 통해 카르마와 팬텀을 실행합니다. 배쉬 스크립트/카르마 쓰레기통, 꿀꿀 - CLI (꿀꿀)는 모두가

#!/usr/bin/env node 

의 익숙한 헤더 지시문을 phantomjs 어떻게 우리의 도구는 항상 디렉토리 지역을 찾고되도록 우리는 설정에 대한 가야한다 노드 이진, 이후의 자식 프로세스에서도? (/ 당신이 쓰는이 하나의 실행)

node ./wrapper.js

#!/usr/bin/env node 

console.log(process.env.NODE); // "/usr/local/bin/node" 

process.env.NODE = "/web/tool/bin/node"; 

require('child_process').exec('node ./child.js', { 
    'cwd': __dirname, 
    'env': process.env 
}, function(err, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    if (err !== null) { 
     console.log('exec error: ' + error); 
    } 
}); 

child.js (또는 무엇이든 당신이 다른 스크립트를 :

+0

'node' 바이너리를 찾고 환경 변수를 로컬 NodeJS 바이너리로 설정하기 전에'export NODE =/web/tool/bin/node'와 같은 작업을 수행 할 수 있습니까? 스크립트? –

+0

첫 번째 프로세스를 실행하려는 노드 바이너리의 경로 이름이있는 경우 후속 프로세스가 노드를 전역 적으로 검색해야하는 이유는 무엇입니까? 또한 nodejs의 virtualenv처럼 들리므로 http://stackoverflow.com/questions/3653495/is-there-an-virtual-environment-for-node-js를 시도해 보셨습니까? – leorex

+0

@MichaelTang 그것이 문제의 핵심입니다. 우리는 명령을 위해 임시로 envars를 바꿀 수 있지만, 이후의 자식 프로세스는 그것을 받아들이지 않습니다. – shellscape

답변

0

는 확실히 자식 클래스에 전달하는 환경 변수를 설정하는 래퍼 스크립트를 만들어보십시오 가) 수정 될 필요하지 않습니다

#!/usr/bin/env node 

console.log(process.env.NODE); 

출력 :

$ node env.js 
/usr/local/bin/node 
stdout: /web/tool/bin/node (from child.js) 

stderr: 
+0

원본 질문을 다루었 기 때문에 이것을 답으로 표시하십시오.우리는 다른 해결책을 생각해 냈습니다. 그리고 nodeenv ekalinin.github.io/nodeenv/를 구현했습니다.이 모든 것이 우리의 모든 관심사를 해결했습니다. – shellscape

관련 문제