programing

Node.js를 사용하여 현재 스크립트의 경로를 가져오려면 어떻게 해야 합니까?

testmans 2023. 6. 19. 21:17
반응형

Node.js를 사용하여 현재 스크립트의 경로를 가져오려면 어떻게 해야 합니까?

Node.js의 스크립트 경로를 어떻게 가져올 수 있습니까?

있는 것을 있습니다.process.cwd그러나 이는 스크립트 자체가 아닌 스크립트가 호출된 디렉토리만 나타냅니다.예를 들어, 내가 있다고 가정해 보세요./home/kyle/다음 명령을 실행합니다.

node /home/kyle/some/dir/file.js

내가 전화하면process.cwd()알겠습니다/home/kyle/,것은 아니다./home/kyle/some/dir/그 디렉토리를 가져올 수 있는 방법이 있습니까?

저는 문서를 다시 한 번 검토한 후에 그것을 발견했습니다.제가 찾고 있던 것은 및 모듈 수준 변수였습니다.

  • __filename는 현재 모듈의 파일 이름입니다.현재 모듈 파일의 확인된 절대 경로입니다.(예:/home/kyle/some/dir/file.js)
  • __dirname는 현재 모듈의 디렉터리 이름입니다.(예:/home/kyle/some/dir)

기본적으로 다음과 같은 작업을 수행할 수 있습니다.

fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);

'/' 또는 '\'과(와) 연결하지 않고 resolve()를 사용하면 교차 플랫폼 문제가 발생합니다.

참고: __dirname은 모듈 또는 포함된 스크립트의 로컬 경로입니다.메인 스크립트의 경로를 알아야 하는 플러그인을 작성하는 경우:

require.main.filename

또는 폴더 이름만 가져오려면:

require('path').dirname(require.main.filename)

__dirname 사용!!

__dirname

현재 모듈의 디렉터리 이름입니다.은 "path.dirname()"의 .__filename.

예: /Users/mjr에서 node example.js 실행

console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr

https://nodejs.org/api/modules.html#modules_dirname

의 경우 다음을합니다.import.meta.url

이 명령은 현재 디렉터리를 반환합니다.

var currentPath = process.cwd();

예를 들어 경로를 사용하여 파일을 읽는 방법:

var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
    if(err)
        console.log(err)
    else
        console.log(data.toString());
});

Node.js 10은 ECMA스크립트 모듈을 지원하며 및 를 더 이상 사용할 수 없습니다.

그런 다음 현재 ES 모듈에 대한 경로를 얻으려면 다음을 사용해야 합니다.

import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);

현재 모듈이 포함된 디렉토리의 경우:

import { dirname } from 'path';
import { fileURLToPath } from 'url';

const __dirname = dirname(fileURLToPath(import.meta.url));

기본 스크립트의 경우 다음과 같이 간단합니다.

process.argv[1]

Node.js 설명서에서 다음을 수행합니다.

process.argv

명령줄 인수를 포함하는 배열입니다.첫 번째 요소는 '노드'가 되고 두 번째 요소는 JavaScript 파일의 경로가 됩니다.다음 요소는 추가 명령줄 인수입니다.

모듈 파일의 경로를 알아야 하는 경우 __filename을 사용합니다.

var settings = 
    JSON.parse(
        require('fs').readFileSync(
            require('path').resolve(
                __dirname, 
                'settings.json'),
            'utf8'));

Node에 대한 일부 몇 글로벌 변수가 그 중 는 ""Node.js.js"입니다."라는 파일이 있습니다.__dirname.

저는 이것이 꽤 오래된 것이라는 것을 알고 있습니다. 그리고 제가 대답했던 원래 질문은 중복으로 표시되어 있고 여기에 지시되어 있습니다. 하지만 저는 자스민 기자들을 일하게 하려고 하는 문제에 부딪혔고, 그것이 작동하기 위해서는 제가 다운그레이드 되어야 한다는 생각이 마음에 들지 않았습니다.이 그 문제를 있지 것을 되었습니다.savePath보고서 폴더 출력을 제가 꿀꺽한 곳의 루트 디렉터리 대신 jasmine-reporters 디렉터리에 저장했습니다.이 작업을 올바르게 수행하기 위해 사용하게 되었습니다.process.env.INIT_CWD초기 Current Working Directory를 가져오려면 이 디렉토리가 필요합니다.이것이 누군가에게 도움이 되기를 바랍니다.

var reporters = require('jasmine-reporters');
var junitReporter = new reporters.JUnitXmlReporter({
  savePath: process.env.INIT_CWD + '/report/e2e/',
  consolidateAll: true,
  captureStdout: true
 });

NodeJS는 이라고 하는 전역 변수를 노출합니다.

__dirnameJavaScript 파일이 있는 폴더의 전체 경로를 반환합니다.

예를 들어 윈도우즈의 경우 다음 행으로 스크립트 파일을 만들면 다음과 같습니다.

console.log(__dirname);

다음을 사용하여 해당 스크립트를 실행합니다.

node ./innerFolder1/innerFolder2/innerFolder3/index.js

출력은 다음과 같습니다. C:\사용자...<project-directory>\innerFolder1\innerFolder2\innerFolder3

사용basename의 방법path모듈:

var path = require('path');
var filename = path.basename(__filename);
console.log(filename);

다음은 위의 예를 참조한 문서입니다.

Dan이 지적했듯이, Node는 "--experimental-modules" 플래그를 사용하여 ECMA스크립트 모듈에서 작업하고 있습니다.노드 12는 여전히 위와 같이 지원합니다.


사용 중인 경우--experimental-modules플래그, 대안적인 접근법이 있습니다.

다른 방법은 현재 ES 모듈에 대한 경로를 가져오는 것입니다.

import { fileURLToPath } from 'url';
const __filename = fileURLToPath(new URL(import.meta.url));

현재 모듈이 포함된 디렉토리의 경우:

import { fileURLToPath } from 'url';
import path from 'path';

const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url)));

process.env를 사용할 수 있습니다.현재 앱 폴더 경로를 가져오는 PWD입니다.

사용 중인 경우pkg앱을 패키지화할 때 유용한 표현은 다음과 같습니다.

appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
  • process.pkg에 의해 앱이 패키징되었는지 여부를 나타냅니다.pkg.

  • process.execPath실행 파일의 전체 경로를 유지합니다. 즉,/usr/bin/node스크립트의 직접 호출의 경우 또는 유사함(node test.js) 또는 패키지 앱입니다.

  • require.main.filename기본 스크립트의 전체 경로를 유지하지만 노드가 대화형 모드로 실행될 때는 비어 있습니다.

  • __dirname현재 스크립트의 전체 경로를 보유하고 있기 때문에 사용하지 않습니다(OP가 요청하는 것일 수 있지만; 그렇다면 더 잘 사용합니다).appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));대화형 모드에서는__dirname비어 있습니다.

  • 대화형 모드의 경우 다음 중 하나를 사용합니다.process.argv[0]노드 실행 파일의 경로를 가져오거나process.cwd()현재 디렉터리를 가져옵니다.

내보낼 모듈이 포함된 폴더 내의 index.js

const entries = {};
for (const aFile of require('fs').readdirSync(__dirname, { withFileTypes: true }).filter(ent => ent.isFile() && ent.name !== 'index.js')) {
  const [ name, suffix ] = aFile.name.split('.');
  entries[name] = require(`./${aFile.name}`);
}

module.exports = entries;

이렇게 하면 현재 디렉터리의 루트에 있는 모든 파일이 검색되고 파일 이름 스템과 동일한 내보내기 이름을 가진 모든 파일이 필요합니다.

셸 스크립트에서 $0과 같은 것을 원한다면 다음을 시도해 보십시오.

var path = require('path');

var command = getCurrentScriptPath();

console.log(`Usage: ${command} <foo> <bar>`);

function getCurrentScriptPath () {
    // Relative path from current working directory to the location of this script
    var pathToScript = path.relative(process.cwd(), __filename);

    // Check if current working dir is the same as the script
    if (process.cwd() === __dirname) {
        // E.g. "./foobar.js"
        return '.' + path.sep + pathToScript;
    } else {
        // E.g. "foo/bar/baz.js"
        return pathToScript;
    }
}

언급URL : https://stackoverflow.com/questions/3133243/how-do-i-get-the-path-to-the-current-script-with-node-js

반응형