program tip

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

radiobox 2020. 8. 5. 08:06
반응형

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


노드 명령 행 인터페이스를 작성 중입니다. 전역으로 설치되며 bin 파일을 사용하여 실행합니다.

작업중 인 파일의 루트 디렉토리에서 명령 창을 열어두고 명령을 실행하려고하지만 process.cwd()노드 패키지의 디렉토리를 반환하는 것처럼 현재 작업 디렉토리를 결정할 수 없었습니다 . 처음에는 배치 파일을 래퍼로 사용하여 코드를 실행하기 때문에 (빈 파일이 처음에 노드없이 실행될 수있는 방법) 불가능하지만 커피 스크립트는 관리 할 수 ​​있다고 가정했습니다. 나는 커피 스크립트 소스를 보았지만 그것을 따를 수 없었습니다 (충분히 경험하지 못했습니다).

직접 테스트하려면이 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 스크립트의 현재 디렉토리 만 얻으려면 다음과 같이 간단한 것을 시도해보십시오. 이것은 노드 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('.') is also a reliable and clean option, because we almost always require('path'). It will give you absolute path of the directory from where it is called.

참고URL : https://stackoverflow.com/questions/12238477/determine-command-line-working-directory-when-running-node-bin-script

반응형