2012-09-02 2 views
71

노드 명령 행 인터페이스를 작성 중입니다. 전역 적으로 설치되며 실행을 위해 bin 파일을 사용합니다.노드 bin 스크립트를 실행할 때 명령 행 작업 디렉토리를 결정하십시오.

작업중인 파일의 루트 디렉토리에서 명령 창을 연 다음 명령을 실행하지만 현재 작업 디렉토리를 확인할 수 없으므로 process.cwd()은 노드 패키지의 디렉토리를 반환합니다. . 처음에는 코드가 래퍼로 배치 파일을 사용하여 실행 되었기 때문에 (처음에는 노드없이 bin 파일을 실행할 수 있음) 다음은 불가능하지만 coffee 스크립트는이를 수행 할 수 있다고 가정했습니다. 나는 커피 스크립트 소스를 살펴 봤지만 그것을 따라갈 수는 없었다. 빈에서

{ 
    "name": "test-package", 
    "version": "1.0.0", 
    "bin": { 
    "test-package": "./bin/test-package" 
    }, 
    "main": "/lib/test" 
} 

이 테스트 - 패키지 파일 :

#!/usr/bin/env node 

var path = require('path'); 
var fs = require('fs'); 
var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib'); 

require(lib + '/test'); 

사람이에 도움이 되거 수를 자신이 package.json 파일을 사용하여 패키지를 작성하기위한

그것을 테스트합니다.

그런 다음 lib/test에서 명령 줄 디렉토리를 가져 오십시오.

답변

131
  • process.cwd() 응용 프로그램 내부의 'process.chdir'에 의해 명령이 변경되지 않은 경우 (노드 패키지의 디렉토리가 아닌) 명령이 실행 된 디렉토리를 반환합니다.
  • __filename은 파일이 놓이는 파일의 절대 경로를 반환합니다.
  • __dirname은 디렉토리의 절대 경로를 __filename으로 반환합니다.

모듈 디렉토리에서 파일을로드해야하는 경우 상대 경로를 사용해야합니다. 이 호출하고 현재 작업 디렉토리에 의존하지 않는 경우 대신

var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib'); 

require(lib + '/test'); 

require('../lib/test'); 

그것은 파일에 항상 상대적이다.

+2

'process.chdir()'다음에 원본을 가져 오는 방법이 있습니까? – reergymerej

+0

@reergymerej chdir() (예 :'var originalCwd = process.cwd();'을 실행하기 전에 먼저 cwd를 저장하고'process.chdir()'을 실행하면 원래의 것으로 돌아갈 수 있습니다). – Swivel

+0

은'../ lib/test' portable입니까? – Sebastian

2

현재 NodeJS 스크립트의 현재 디렉토리 만 얻으려면 다음과 같이 간단한 방법을 시도해 볼 수 있습니다. 이것은 노드 CLI 자체에서 작동하지 않습니다 :

var fs = require('fs'), 
    path = require('path'); 

var dirString = path.dirname(fs.realpathSync(__filename)); 

// output example: "/Users/jb/workspace/abtest" 
console.log('directory to start walking...', dirString); 
관련 문제