كيف يمكنني الحصول على المسار إلى البرنامج النصي الحالي مع Node.js؟




(9)

أعلم أن هذا أمر قديم جدًا ، وتم وضع علامة على السؤال الأصلي الذي كنت أستجوبه على أنه مكرر وتوجيهي هنا ، لكنني واجهت مشكلة في محاولة تشغيل صحفيين من الياسمين ولم تعجبني فكرة أنه يجب علي خفض مستوى أجل أن تعمل. لقد اكتشفت أن مراسلي الياسمين لم يحلوا عملية savePath بشكل صحيح وكانوا يضعون في الواقع مجلد تقارير التقارير في دليل الياسمين ، بدلاً من الدليل الجذري حيث ركضت الجولب. لجعل هذا العمل بشكل صحيح انتهى بي الأمر باستخدام 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
});

كيف يمكنني الحصول على المسار إلى البرنامج النصي في Node.js؟

أعرف أن هناك process.cwd ، ولكن هذا يشير فقط إلى الدليل الذي تم استدعاء البرنامج النصي به ، وليس للبرنامج النصي نفسه. على سبيل المثال ، لنفرض أنني في /home/kyle/ وأعمل الأمر التالي:

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

إذا اتصلت process.cwd() ، أحصل على /home/kyle/ ، لا /home/kyle/some/dir/ . هل هناك طريقة للحصول على هذا الدليل؟


إذا كنت ترغب في شيء أكثر مثل $ 0 في برنامج نصي shell ، فحاول القيام بذلك:

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

عندما يتعلق الأمر بالسيناريو الرئيسي ، فإن الأمر بسيط مثل:

process.argv[1]

من وثائق Node.js :

process.argv

مصفوفة تحتوي على وسائط سطر الأوامر. سيكون العنصر الأول هو "العقدة" ، وسيكون العنصر الثاني هو المسار إلى ملف جافا سكريبت . ستكون العناصر التالية أي حجج سطر أوامر إضافية.

إذا كنت بحاجة إلى معرفة مسار ملف الوحدة النمطية ، فاستخدم __filename .


في الأساس يمكنك القيام بذلك:

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

استخدم حل () بدلاً من وصله مع '/' أو '\' آخر سوف يتم تشغيله في مشكلات مشتركة بين الأنظمة الأساسية.

ملاحظة: __dirname هو المسار المحلي للوحدة أو النص البرمجي المتضمن. إذا كنت تقوم بكتابة ملحق يحتاج إلى معرفة مسار البرنامج النصي الرئيسي فهو:

require.main.filename

أو الحصول على اسم المجلد فقط:

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

هذا الأمر يعيد الدليل الحالي:

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

هناك طريقة أخرى ، إذا كنت تستخدم وحدات نمطية وترغب في العثور على اسم الملف الخاص بالوحدة الرئيسية التي تسمى هذه الوحدة الفرعية أو أي وحدة تقوم بتشغيلها ،

var fnArr = (process.mainModule.filename).split('/');
var filename = fnArr[fnArr.length -1];

يدعم Node.js 10 الوحدات النمطية ECMAScript ، حيث لا يتوفر __dirname و __filename خارج المربع.

ثم للحصول على المسار إلى وحدة ES الحالية ، يجب على المستخدم استخدام ما يلي:

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

وللحصول على الدليل الذي يحتوي على الوحدة الحالية:

import path from 'path';

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

يمكنك استخدام process.env.PWD للحصول على مسار مجلد التطبيق الحالي.


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






node.js