노드 bin 스크립트를 실행할 때 명령 줄 작업 디렉터리 결정


120

노드 명령 줄 인터페이스를 만들고 있습니다. 전역 적으로 설치되며 실행을 위해 bin 파일을 사용합니다.

작업중인 파일의 루트 디렉터리에서 명령 창을 열고 명령을 실행하려고하지만 process.cwd()노드 패키지의 디렉터리를 반환하는 현재 작업 디렉터리를 확인할 수 없습니다 . 처음에는 코드가 배치 파일을 래퍼로 사용하여 실행되고 있기 때문에 (즉, 빈 파일이 처음에 노드없이 실행되는 방식) 불가능하지만 coffee-script가이를 수행한다고 가정했습니다. 나는 커피 스크립트 소스를 살펴 봤지만 따라갈 수 없었습니다 (충분히 경험하지 못함).

직접 테스트하려면이 package.json 파일을 사용하여 패키지를 만듭니다.

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

bin에있는이 테스트 패키지 파일 :

#!/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');

누구든지 이것에 약간의 빛을 비출 수 있습니까?

그런 다음 lib / test 내에서 명령 줄 디렉터리를 가져옵니다.

답변:


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

모듈 디렉토리에서 파일을로드해야하는 경우 상대 경로를 사용해야합니다.

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

대신에

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

require(lib + '/test');

항상 호출 한 파일과 관련이 있으며 현재 작업 디렉토리에 의존하지 않습니다.


2
이후 process.chdir()원본을 얻을 수있는 방법이 있습니까?
reergymerej

@reergymerej 아마도 chdir ()을 실행하기 전에 먼저 cwd를 저장하고 싶을 것입니다 (예를 들어, var originalCwd = process.cwd();실행 process.chdir()하고 나중에 원본으로 돌아갈 수 있습니다).
Swivel

이다 ../lib/test 휴대용?
Sebastian

아니요. Windows는 백 슬래시를 사용하기 때문에 휴대용 솔루션이 아닙니다. 따라서 Windows에서 실행하려고하면 작동하지 않습니다.
zachdyer

1
실제로 NodeJS의 경우 이것은 모두 동일합니다. Windows에서도 Unix 방식의 상대 경로를 편리하게 요구할 수 있습니다. 그래서../lib/test 윈도우 상대는 반면, 휴대용 ..\lib\test... 아니다
기독교 Ulbrich

48

현재 작업 디렉토리

현재 작업 디렉토리를 얻으려면 다음을 사용할 수 있습니다.

process.cwd()

그러나 일부 스크립트, 특히 gulp는 현재 작업 디렉토리를 process.chdir().

노드 모듈 경로

다음을 사용하여 현재 모듈의 경로를 가져올 수 있습니다.

  • __filename
  • __dirname

원래 디렉토리 (명령이 시작된 위치)

명령 줄에서 스크립트를 실행 중이고 스크립트가 현재 작동중인 디렉토리에 관계없이 스크립트가 실행 된 원래 디렉토리를 원하는 경우 다음을 사용할 수 있습니다.

process.env.INIT_CWD

NPM 스크립트 작업시 원본 디렉토리

프로젝트의 루트가 아닌 현재 디렉토리에서 NPM 스크립트를 실행하는 것이 바람직한 경우가 있습니다.

이 변수는 npm 패키지 스크립트 내에서 다음과 같이 사용할 수 있습니다.

$INIT_CWD.

최신 버전의 NPM을 실행하고 있어야합니다. 이 변수를 사용할 수없는 경우 NPM이 최신 상태인지 확인하십시오.

이렇게하면 package.json의 현재 경로에 액세스 할 수 있습니다. 예 :

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}

process.env.INIT_CWDdir을 반환합니다package.json
vaughan

2
$ INIT_CWD는 Linux에서만 작동합니다. Windows의 경우 % INIT_CWD %를 사용해야합니다. 이 문제는 npmjs.com/package/cross-env 를 사용하여 극복 할 수 있다고 생각 하지만 직접 시도한 적은 없습니다
Stephanie

3

또는 현재 NodeJS 스크립트의 현재 디렉토리 만 얻으려면 다음과 같이 간단한 방법을 시도해 볼 수 있습니다. 이것은 Node 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);

3

path.resolve('.')거의 항상 require('path'). 호출 된 디렉토리의 절대 경로를 제공합니다.


0

나를 위해 일한 것은 다음과 같습니다.

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