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

노드 명령 줄 인터페이스를 만들고 있습니다. 전역 적으로 설치되며 실행을 위해 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 내에서 명령 줄 디렉터리를 가져옵니다.



답변

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

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

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

대신에

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

require(lib + '/test');

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


답변

현재 작업 디렉토리

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

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"
}


답변

또는 현재 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);


답변

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


답변

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

console.log(process.mainModule.filename);


답변