Node.js සමඟ වත්මන් ස්ක්‍රිප්ටයට මාවත ලබා ගන්නේ කෙසේද?


1005

Node.js හි තිර රචනය සඳහා මාවත ලබා ගන්නේ කෙසේද?

එහි ඇති බව මම දනිමි process.cwd, නමුත් එයින් අදහස් කරන්නේ ස්ක්‍රිප්ට් හැඳින්වූ නාමාවලිය මිස ස්ක්‍රිප්ට් එක නොවේ. උදාහරණයක් ලෙස, මම ඇතුළට ගොස් /home/kyle/පහත විධානය ක්‍රියාත්මක කරන බව පවසන්න :

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

මම කතා කළොත් process.cwd(), මට ලැබෙනවා /home/kyle/, නැහැ /home/kyle/some/dir/. එම නාමාවලිය ලබා ගැනීමට ක්‍රමයක් තිබේද?


6
nodejs.org/docs/latest/api/globals.html පිළිගත් පිළිතුරේ ප්‍රලේඛන සබැඳිය.
allenhwkim

Answers:


1427

ප්‍රලේඛනය නැවත බැලීමෙන් පසුව මට එය හමු විය. මම හෙව්වා වූහ __filenameසහ __dirnameමොඩියුලය මට්ටමේ විචල්යයන්.

  • __filenameයනු වත්මන් මොඩියුලයේ ගොනු නාමයයි. වත්මන් මොඩියුල ගොනුවේ නිරපේක්ෂ නිරපේක්ෂ මාර්ගය මෙයයි. (උදා: /home/kyle/some/dir/file.js)
  • __dirnameයනු වත්මන් මොඩියුලයේ නාමාවලි නාමයයි. (උදා: /home/kyle/some/dir)

3
ඔබට අවශ්‍ය වන්නේ ඩිරෙක්ටරියේ නම පමණක් නොව සම්පූර්ණ මාර්ගය නොවේ නම්, ඔබට මෙවැනි දෙයක් කළ හැකිය: getCurrentDirectoryName () function var fullPath = __dirname; var path = fullPath.split ('/'); var cwd = මාර්ගය [path.length-1]; ආපසු cwd; }
ඇන්තනි මාටින්

59
Nt ඇන්තනි මාර්ටින් __dirname.split ("/"). පොප් ()
19

6
@Apx විසඳුම උත්සාහ කරන අයට (මා කළාක් මෙන් :), මෙම විසඳුම වින්ඩෝස් මත ක්‍රියා නොකරයි.
ලාජින්

37
නැතහොත් සරලව__dirname.split(path.sep).pop()
බර්ගි

48
නැතහොත්require('path').basename(__dirname);
Vyacheslav Cotruta

255

එබැවින් මූලික වශයෙන් ඔබට මෙය කළ හැකිය:

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

'/' හෝ '\' සමඟ සමපාත වීම වෙනුවට විසදුම () භාවිතා කරන්න, නැතිනම් ඔබ හරස් වේදිකා ගැටළු වලට මුහුණ දෙනු ඇත.

සටහන: __dirname යනු මොඩියුලයේ හෝ ඇතුළත් කළ ස්ක්‍රිප්ටයේ දේශීය මාර්ගයයි. ඔබ ප්‍රධාන පිටපතෙහි මාර්ගය දැනගත යුතු ප්ලගිනයක් ලියන්නේ නම් එය:

require.main.filename

හෝ, ෆෝල්ඩරයේ නම ලබා ගැනීමට:

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

16
ඔබේ ඉලක්කය json ගොනුව විග්‍රහ කිරීම හා අන්තර් ක්‍රියා කිරීම පමණක් නම්, ඔබට බොහෝ විට මෙය වඩාත් පහසුවෙන් කළ හැකිය var settings = require('./settings.json'). ඇත්ත වශයෙන්ම, එය සමමුහුර්ත fs IO, එබැවින් ධාවන වේලාවේදී එය නොකරන්න, නමුත් ආරම්භක වේලාවේදී එය හොඳයි, එය පටවා ගත් පසු එය හැඹිලිගත වේ.
isaacs

2
Arc මාක් ස්තූතියි! ටික කලකට පසු මම __dirname සෑම මොඩියුලයකටම දේශීය බව වටහාගෙන සිටියෙමි. මගේ පුස්තකාලයේ කූඩු ව්‍යුහයක් ඇති අතර මගේ යෙදුමේ මුල ස්ථාන කිහිපයකින් දැනගත යුතුය. සතුටුයි මම දැන් මෙය කරන්නේ කෙසේදැයි දනිමි: ඩී
තිජ්ස් කෝර්සෙල්මන්

Node V8: path.dirname (process.mainModule.filename)
wayofthefuture

කවුළු සැබෑ වේදිකාවක් ලෙස ඔබ නොසිතන්නේ නම්, අපට විසඳුම මඟ හැරිය හැකිද? බීඑස්ඩී, මැකෝස්, ලිනක්ස්, ටයිසන්, සිම්බියන්, සොලාරිස්, ඇන්ඩ්‍රොයිඩ්, ෆ්ලැටර්, වෙබ්ෝස් සියල්ලම භාවිතා කරයි / හරිද?
රේ ෆොස්


120

මෙම විධානය මඟින් වත්මන් නාමාවලිය නැවත ලබා දෙයි:

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());
});

තේරුම් නැති අය සඳහා Asynchronous හා සම මුහුර්තක , මෙම සබැඳිය ... බලන්න stackoverflow.com/a/748235/5287072
DarckBlezzer

17
OP ට අවශ්‍ය නොවන දේ මෙයයි ... ඉල්ලීම ක්‍රියාත්මක කළ හැකි ස්ක්‍රිප්ටයේ මාවතයි!
සීසර්සෝල්

3
වත්මන් නාමාවලිය ඊට වඩා වෙනස් දෙයකි. ඔබ වැනි දෙයක් ධාවනය කරන්නේ නම් cd /foo; node bar/test.js, වත්මන් නාමාවලිය වනු ඇත /foo, නමුත් ස්ක්‍රිප්ට් එක පිහිටා ඇත /foo/bar/test.js.
rjmunro

එය හොඳ පිළිතුරක් නොවේ. මෙය අවුල් සහගත තර්කනයකි, මෙය ඔබ බලාපොරොත්තු වනවාට වඩා කෙටි මාර්ගයක් විය හැකිය.
kris_IV

ඔබ කවදා හෝ මෙය කරන්නේ ඇයි; ගොනුව ඔබට කියවිය හැකි වත්මන් නාමාවලියට සාපේක්ෂව නම් text.txtසහ එය ක්‍රියාත්මක වනු ඇත, ඔබට නිරපේක්ෂ මාර්ගය තැනීමට අවශ්‍ය නොවේ
මයිකල් මොරොසෙක්

109

__Dirname භාවිතා කරන්න !!

__dirname

වත්මන් මොඩියුලයේ නාමාවලි නාමය. මෙය path.dirname () ට සමාන වේ __filename.

උදාහරණය: / පරිශීලකයන් / mjr වෙතින් node.js ධාවනය කිරීම

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

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

ESModules සඳහා ඔබට භාවිතා කිරීමට අවශ්‍ය වන්නේ: import.meta.url


1
මෙය සිම්ලින්ක් ද නොනැසී පවතී. එබැවින් ඔබ බඳුනක් සාදා ගොනුවක් සොයා ගැනීමට අවශ්‍ය නම්, උදා: path.join (__ dirname, "../example.json"); ඔබේ ද්විමය node_modules / .bin සමඟ සම්බන්ධ වූ විට එය තවමත් ක්‍රියාත්මක වේ
ජේසන්

2
මෙම පිළිතුර වසර ගණනාවකට පෙර ලබා දී ඇතිවා පමණක් නොව, එය තවදුරටත් ඊඑස් මොඩියුල සමඟ ක්‍රියා නොකරයි .
ඩෑන් ඩස්කල්ස්කු

48

ප්‍රධාන පිටපත සම්බන්ධයෙන් ගත් කල එය එතරම්ම සරල ය:

process.argv[1]

සිට Node.js ප්රලේඛනය :

process.argv

විධාන රේඛා තර්ක අඩංගු අරාව. පළමු අංගය 'නෝඩ්' වනු ඇත, දෙවන අංගය ජාවාස්ක්‍රිප්ට් ගොනුවට යන මාර්ගය වේ . ඊළඟ අංග ඕනෑම අතිරේක විධාන රේඛා තර්ක වේ.

ඔබට මොඩියුල ගොනුවක මාර්ගය දැන ගැනීමට අවශ්‍ය නම් __filename භාවිතා කරන්න .


3
කරුණාකර මෙය නිර්දේශ නොකරන්නේ මන්දැයි ඩවුන්වොටර්ට පැහැදිලි කළ හැකිද?
ටැම්ලින්

2
Am ටැම්ලින් සමහර විට process.argv[1]ප්‍රධාන ස්ක්‍රිප්ටයට පමණක් අදාළ වන අතර __filenameඑය ක්‍රියාත්මක වන මොඩියුල ගොනුව වෙත යොමු වේ. වෙනස අවධාරණය කිරීම සඳහා මම මගේ පිළිතුර යාවත්කාලීන කරමි. තවමත්, භාවිතා කිරීමේ කිසිදු වරදක් මා දකින්නේ නැත process.argv[1]. කෙනෙකුගේ අවශ්‍යතා මත රඳා පවතී.
ලූකස් වික්ටර්

10
ප්‍රධාන ස්ක්‍රිප්ට් එක pm2 process.argv වැනි නෝඩ් ක්‍රියාවලි කළමණාකරුවෙකු සමඟ දියත් කර ඇත්නම් [1] ක්‍රියාවලි කළමණාකරු
/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js

37

ආධාරක 10 Node.js සම්මතයන් මොඩියුල , කොහෙද __dirnameසහ __filenameතවදුරටත් ලබා ගත හැකිය .

වත්මන් ඊඑස් මොඩියුලය වෙත මාවත ලබා ගැනීම සඳහා යමෙකු භාවිතා කළ යුතුය:

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));

මම ඊඑස් මොඩියුලයක් ලියන්නේද නැද්ද යන්න දැන ගන්නේ කෙසේද? එය මා ධාවනය කරන්නේ කුමන නෝඩ් අනුවාදයේද, නැතහොත් මම ආනයන / අපනයන වචන භාවිතා කරන්නේද?
එඩ් බ්‍රැනින්

2
ES මොඩියුල ලබා ගත හැක්කේ --experimental-modulesධජය සමඟ පමණි .
නිකන්සෝල්

2
--experimental-modules අවශ්‍ය වන්නේ ඔබ නෝඩ් අනුවාදය ධාවනය කරන්නේ නම් පමණි <13.2. .js වෙනුවට .mjs ගොනුව නම් කරන්න
බ්‍රෙන්ට්

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

7
සටහනක්, නෝඩ් 0.5 වන විට ඔබට JSON ගොනුවක් අවශ්‍ය විය හැකිය. ඇත්ත වශයෙන්ම එය ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත.
කෙවින් කොක්ස්


24

සෑම Node.js වැඩසටහනකටම එහි පරිසරය තුළ ගෝලීය විචල්‍යයන් කිහිපයක් ඇත, එය ඔබගේ ක්‍රියාවලිය පිළිබඳ යම් තොරතුරු නිරූපණය කරන අතර ඉන් එකක් වේ __dirname.


මෙම පිළිතුර වසර ගණනාවකට පෙර ලබා දී ඇතිවා පමණක් නොව, __dirname ඊඑස් මොඩියුල සමඟ තවදුරටත් ක්‍රියා නොකරයි .
ඩෑන් ඩස්කල්ස්කු

එය NodeJs 10 ගැන ය, නමුත් මෙම පිළිතුර 2016 දී ප්‍රකාශයට පත් කරන ලදි.
Hazarapet Tunanyan

මම දන්නවා. තාක්ෂණය වෙනස් වන විට පිළිතුරු යාවත්කාලීන කළ හැකිය.
ඩෑන් ඩස්කල්ස්කු

14

මෙය තරමක් පැරණි බව මම දනිමි. මා පිළිතුරු දුන් මුල් ප්‍රශ්නය අනුපිටපතක් ලෙස සලකුණු කොට මෙහි යොමු කර ඇත, නමුත් මම ජැස්මින්-වාර්තාකරුවන් වැඩට ගැනීමට උත්සාහ කරන ගැටලුවකට මුහුණ දුන් අතර මා පහත හෙලීමට ඇති අදහසට අකමැති විය එය ක්‍රියාත්මක වීමට ඇණවුම් කරන්න. ජැස්මින්-වාර්තාකරුවන් විසින් සේව්පාත් නිවැරදිව නිරාකරණය නොකරන බවත්, ඇත්ත වශයෙන්ම මා ගොල්ප් ධාවනය කළ ස්ථානයේ මූල නාමාවලිය වෙනුවට වාර්තා ෆෝල්ඩරයේ ප්‍රතිදානය ජැස්මින්-වාර්තාකරුවන්ගේ නාමාවලියෙහි තබන බවත් මම දැන ගතිමි. මෙම කාර්යය නිවැරදිව සිදු කිරීම සඳහා මම ආරම්භක වත්මන් වැඩ නාමාවලිය ලබා ගැනීම සඳහා process.env.INIT_CWD භාවිතා කර අවසන් වූ අතර එය ඔබ ගුල්ප් ධාවනය කළ නාමාවලිය විය යුතුය. මෙය යමෙකුට උපකාරී වේ යැයි සිතමි.

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

8

වත්මන් යෙදුම් ෆෝල්ඩරයේ මාර්ගය ලබා ගැනීමට ඔබට process.env.PWD භාවිතා කළ හැකිය.


3
OP ඉල්ලා සිටින "පිටපතට මාර්ගය" ඉල්ලා සිටී. ක්‍රියාවලි ක්‍රියාකාරී නාමාවලිය වැනි දෙයක් වෙනුවෙන් පෙනී සිටින පීඩබ්ලිව්ඩී එය එසේ නොවේ. එසේම, "වත්මන් යෙදුම" වාක්‍ය ඛණ්ඩනය කිරීම නොමඟ යවන සුළුය.
dmcontador

7

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]Node ක්‍රියාත්මක කළ හැකි process.cwd()මාර්ගය ලබා ගැනීමට හෝ වත්මන් නාමාවලිය ලබා ගැනීමට භාවිතා කරන්න.


4

මොඩියුලයේ basenameක්‍රමය භාවිතා කරන්න path:

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

මෙහිඉහත උදාහරණයෙන් ලබාගත් ලියකියවිලි .

ඩෑන් පෙන්වා දුන් පරිදි, නෝඩ් "- පරීක්ෂණාත්මක-මොඩියුල" ධජය සමඟ ECMAScript මොඩියුල මත ක්‍රියා කරයි. Node එකක් මතම ඊට අදාල 12 තවමත් සහාය __dirnameසහ__filename ඉහත සඳහන් ලෙස.


ඔබ --experimental-modulesධජය භාවිතා කරන්නේ නම්, විකල්ප ප්‍රවේශයක් ඇත.

විකල්පය වන්නේ වත්මන් ඊඑස් මොඩියුලයට මාර්ගය ලබා ගැනීමයි :

const __filename = new URL(import.meta.url).pathname;

වත්මන් මොඩියුලය අඩංගු නාමාවලිය සඳහා:

import path from 'path';

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

-3

ෂෙල් ස්ක්‍රිප්ට් එකක $ 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;
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.