চলমান নোড.জেএস অ্যাপ্লিকেশন থেকে প্রকল্পের মূল নির্ধারণ করুন


315

process.cwd()চলমান নোড.জেএস প্রক্রিয়াটির মূল ডিরেক্টরি নির্ধারণের চেয়ে আরও ভাল উপায় কি ? এর সমতুল্য কিছু Rails.root, তবে নোড.জেএস এর জন্য আমি এমন কিছু সন্ধান করছি যা যথাসম্ভব অনুমানযোগ্য এবং নির্ভরযোগ্য।


1
কোনও সুযোগ আপনি গ্রহণযোগ্য, ভুল, উত্তর আন-গ্রহণ করতে পারে?
ডেভ নিউটন

9
চেষ্টা process.env.PWD... নীচে আমার উত্তর দেখুন।
আলেকজান্ডার মিলস

উত্তর:


624

এগুলির কাছে যাওয়ার বিভিন্ন উপায় রয়েছে, প্রত্যেকে তাদের নিজস্ব উপকারিতা এবং বিপরীতে:

require.main.filename

Http://nodejs.org/api/modules.html থেকে :

নোড থেকে সরাসরি কোনও ফাইল চালানো হলে require.mainসেট করা থাকে module। তার মানে আপনি পরীক্ষা করে কোনও ফাইল সরাসরি চালিত হয়েছে কিনা তা আপনি নির্ধারণ করতে পারেনrequire.main === module

যেহেতু moduleএকটি filenameসম্পত্তি সরবরাহ করে (সাধারণত সমতুল্য __filename), বর্তমান অ্যাপ্লিকেশনটির এন্ট্রি পয়েন্টটি পরীক্ষা করে পাওয়া যাবে require.main.filename

সুতরাং আপনি যদি আপনার অ্যাপের জন্য বেস ডিরেক্টরি চান তবে আপনি এটি করতে পারেন:

var path = require('path');
var appDir = path.dirname(require.main.filename);

পেশাদাররা ও কনস

এটি বেশিরভাগ সময় দুর্দান্ত কাজ করবে তবে আপনি যদি আপনার অ্যাপ্লিকেশনটি লম্পচারের সাথে পিএম 2 এর মতো চালাচ্ছেন বা মোচা পরীক্ষা চালিয়ে যাচ্ছেন তবে এই পদ্ধতিটি ব্যর্থ হবে।

global.X

নোডে একটি বিশ্বব্যাপী নেমস্পেস বস্তু রয়েছে global- যা আপনি এই বস্তুর সাথে যুক্ত করেন তা আপনার অ্যাপ্লিকেশনের যে কোনও জায়গায় পাওয়া যাবে। সুতরাং, আপনার index.js(বা app.jsআপনার মূল অ্যাপ্লিকেশন ফাইলটির নাম যাই থাকুক না কেন), আপনি কেবল একটি গ্লোবাল ভেরিয়েবল সংজ্ঞায়িত করতে পারেন:

// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);

// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');

পেশাদাররা ও কনস

ধারাবাহিকভাবে কাজ করে তবে আপনাকে বিশ্বব্যাপী ভেরিয়েবলের উপর নির্ভর করতে হবে, যার অর্থ আপনি সহজেই উপাদানগুলি / ইত্যাদি পুনরায় ব্যবহার করতে পারবেন না।

process.cwd ()

এটি বর্তমান ওয়ার্কিং ডিরেক্টরিটি প্রদান করে। মোটেও নির্ভরযোগ্য নয়, কারণ প্রক্রিয়াটি কোন ডিরেক্টরি থেকে শুরু হয়েছিল তা পুরোপুরি নির্ভর করে :

$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir

অ্যাপ্লিকেশান-রুট-পাথ

এই সমস্যাটির সমাধানের জন্য, আমি অ্যাপ্লিকেশন-রুট-পাথ নামে একটি নোড মডিউল তৈরি করেছি । ব্যবহার সহজ:

var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');

অ্যাপ্লিকেশান-রুট-পাথ মডিউল বিভিন্ন কৌশল ব্যবহার করে অ্যাপের রুট পাথ নির্ধারণ করতে একাউন্টে গ্লোবালি ইনস্টল্ড মডিউল (উদাহরণস্বরূপ, যদি আপনার অ্যাপে চলছে গ্রহণ /var/www/কিন্তু মডিউলে ইনস্টল করা ~/.nvm/v0.x.x/lib/node/)। এটি সময়ের 100% কাজ করবে না, তবে এটি বেশিরভাগ সাধারণ পরিস্থিতিতে কাজ করবে।

পেশাদাররা ও কনস

বেশিরভাগ পরিস্থিতিতে কনফিগারেশন ছাড়াই কাজ করে। এছাড়াও কিছু দুর্দান্ত অতিরিক্ত সুবিধার পদ্ধতি সরবরাহ করে (প্রকল্প পৃষ্ঠা দেখুন)। সবচেয়ে বড় কন এটি কাজ করবে না যদি:

  • আপনি দুপুর ২ টার মতো লঞ্চার ব্যবহার করছেন
  • এবং , মডিউলটি আপনার অ্যাপ্লিকেশনটির node_modulesডিরেক্টরিতে ইনস্টল করা হয়নি (উদাহরণস্বরূপ, আপনি যদি এটি বিশ্বব্যাপী ইনস্টল করেন)

আপনি APP_ROOT_PATHপরিবেশগত পরিবর্তনশীল সেট করে , বা .setPath()মডিউলটি কল করে এটি পেতে পারেন , তবে সেক্ষেত্রে আপনি সম্ভবত এটি ব্যবহার করে আরও ভালglobal পদ্ধতিটি ।

NODE_PATH পরিবেশগত পরিবর্তনশীল

আপনি যদি বর্তমান অ্যাপের মূল পাথ নির্ধারণের জন্য কোনও উপায় সন্ধান করছেন , উপরের সমাধানগুলির মধ্যে একটি আপনার পক্ষে ভাল কাজ করার সম্ভাবনা রয়েছে। অন্যদিকে, আপনি অ্যাপ্লিকেশন মডিউলগুলি নির্ভরযোগ্যভাবে লোড করার সমস্যাটি সমাধান করার চেষ্টা করছেন, আমি NODE_PATHপরিবেশগত পরিবর্তনশীলটি সন্ধানের জন্য সুপারিশ করছি ।

নোডের মডিউল সিস্টেম বিভিন্ন স্থানে মডিউলগুলির সন্ধান করে। এই অবস্থানগুলির মধ্যে একটি যেখানেই process.env.NODE_PATHপয়েন্ট রয়েছে । আপনি যদি এই পরিবেশগত পরিবর্তনশীল সেট করে থাকেন তবে আপনি requireঅন্য কোনও পরিবর্তন ছাড়াই মানক মডিউল লোডার সহ মডিউলগুলি পারেন ।

উদাহরণস্বরূপ, যদি আপনি সেট NODE_PATHকরার জন্য /var/www/libনিম্নলিখিত ঠিক সূক্ষ্ম কাজ করবে:

require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js

এটি করার একটি দুর্দান্ত উপায় হ'ল npm:

"scripts": {
    "start": "NODE_PATH=. node app.js"
}

এখন আপনি আপনার অ্যাপ্লিকেশনটি শুরু করতে পারেন npm startএবং আপনি সোনার। আমি এটিকে আমার প্রয়োগ-নোড-পাথ মডিউলটির সাথে একত্রিত করি , যা দুর্ঘটনাক্রমে কোনও NODE_PATHসেট ছাড়াই অ্যাপ লোড করা রোধ করে। পরিবেশগত পরিবর্তনশীল প্রয়োগের জন্য আরও নিয়ন্ত্রণের জন্য, চেকেনভ দেখুন

একটি গোছা: NODE_PATH অবশ্যই নোড অ্যাপের বাইরে সেট করা উচিত । আপনি যেমন কিছু করতে পারবেন নাprocess.env.NODE_PATH = path.resolve(__dirname) কারণ মডিউল লোডার আপনার অ্যাপ্লিকেশনটি চালানোর আগে ডিরেক্টরিগুলির তালিকাকে ক্যাশে করে।

[4/6/16 যোগ] আরেকটি সত্যিই প্রতিশ্রুতি মডিউল সমাধানের জন্য যে প্রচেষ্টা এই সমস্যা হয় তরঙ্গায়িত


1
@ কেভিন এই ক্ষেত্রে, মোচা হ'ল আপনার আবেদনের এন্ট্রি পয়েন্ট। এটি "প্রকল্পের মূল" খুঁজে পাওয়া কেন এতটা কঠিন তার একটি উদাহরণ - এটি পরিস্থিতি এবং "প্রকল্পের মূল" বলতে আপনি কী বোঝাতে চান তার উপর নির্ভর করে।
inxilpro

1
@ কেভিন আমি পুরোপুরি বুঝতে পেরেছি। আমার বক্তব্যটি হ'ল কম্পিউটারের চেয়ে "প্রজেক্ট রুট" ধারণাটি মানুষের পক্ষে বোঝা অনেক সহজ । আপনি যদি একটি বোকা-প্রমাণ পদ্ধতি চান তবে আপনার এটি কনফিগার করতে হবে। ব্যবহার কাজ করবে সবচেয়ে সময়, কিন্তু না সব সময়। require.main.filename
inxilpro

2
স্পর্শকাতরভাবে সম্পর্কিত: এটি আপনার নোড প্রকল্পটি সংগঠিত করার জন্য একটি অবিশ্বাস্যরকম চতুর উপায় যাতে আপনাকে এই সমস্যার বিষয়ে এত বেশি চিন্তা করতে হবে না: allanhortle.com/2015/02/04/…
inxilpro

1
আমি জানি না যে, দুপুর ২ টার মধ্যে কোনও পরিবর্তন হয়েছে বা নোড.জেএস-এর সাথে কোনও পরিবর্তন হয়েছে তবে require.main.filenameবিকাল ৪ টা নিয়ে কাজ করছে বলে মনে হচ্ছে। মোচা জানিনা।
জাস্টিন ওয়ার্কেন্টিন

8
path.parse(process.mainModule.filename).dir
Cory রবিনসন

53

__dirnameবিশ্বব্যাপী নয়; এটি বর্তমান মডিউলে স্থানীয় তাই প্রতিটি ফাইলের নিজস্ব স্থানীয়, আলাদা মান থাকে।

আপনি যদি চলমান প্রক্রিয়াটির মূল ডিরেক্টরিটি চান, আপনি সম্ভবত ব্যবহার করতে চান না process.cwd()

আপনি যদি ভবিষ্যদ্বাণী এবং নির্ভরযোগ্যতা চান, তবে সম্ভবত আপনার এটিকে আপনার অ্যাপ্লিকেশনটির প্রয়োজনীয়তা তৈরি করতে হবে যা একটি নির্দিষ্ট পরিবেশের পরিবর্তনশীল সেট করা আছে। আপনার অ্যাপটি MY_APP_HOME(বা যাই হোক না কেন) সন্ধান করে এবং যদি তা সেখানে থাকে এবং অ্যাপ্লিকেশনটি সেই ডিরেক্টরিতে উপস্থিত থাকে তবে সমস্ত কিছু ঠিক আছে। যদি এটি অপরিজ্ঞাত হয় বা ডিরেক্টরিতে আপনার অ্যাপ্লিকেশন না থাকে তবে ব্যবহারকারীটিকে ভেরিয়েবলটি তৈরি করতে অনুরোধ করে একটি ত্রুটিযুক্ত এটি দিয়ে প্রস্থান করা উচিত। এটি একটি ইনস্টল প্রক্রিয়া অংশ হিসাবে সেট করা যেতে পারে।

আপনি নোডের মতো পরিবেশের পরিবর্তনশীলগুলি পড়তে পারেন process.env.MY_ENV_VARIABLE


2
যদি সাবধানতার সাথে ব্যবহার করা হয় তবে এটি বেশ ভালভাবে কাজ করতে পারে। bin/server.jsবনাম করার সময় এটি বিভিন্ন ফলাফল দেয় cd bin && server.js। (ধরে
নিচ্ছি এই জেএস

1
ব্যবহার process.cwd()মোচা পরীক্ষা চালানোর সময়ও আমার কাছে আকর্ষণীয় কাজ করেছে। ধন্যবাদ!
ডায়োগো আইশার্ট

49

1- প্রকল্পের রুট কলে একটি ফাইল তৈরি এটা settings.js

2- এই ফাইলের অভ্যন্তরে এই কোডটি যুক্ত করুন

module.exports = {
    POST_MAX_SIZE : 40 , //MB
    UPLOAD_MAX_FILE_SIZE: 40, //MB
    PROJECT_DIR : __dirname
};

3- নোড_মডিউলগুলির ভিতরে একটি নতুন মডিউল তৈরি করে এটি "সেটিংস" এবং মডিউল সূচকের অভ্যন্তরে।

module.exports = require("../../settings");

4- এবং আপনি যে কোনও সময় আপনার প্রকল্প ডিরেক্টরিটি কেবল ব্যবহার করতে চান

var settings = require("settings");
settings.PROJECT_DIR; 

এই ভাবে আপনার কাছে এই ফাইলের সাথে সম্পর্কিত সমস্ত প্রকল্প ডিরেক্টরি থাকবে;)


33
-1: সেটিংস ফাইলটি লোড করতে আপনার একটি পাথ প্রয়োজন, তারপরে সেই ফাইলটির রেফারেন্স পাথটি পেতে? কোনও কিছুই সমাধান করা হচ্ছে না ...
গোলিয়াতোন

2
পর্যালোচনা এবং সম্পাদনা করার জন্য সময় দেওয়ার জন্য উত্সাহিত। এটি এখনও ভঙ্গুর মনে হচ্ছে, তবে এটি কেবল কারণ এটি অর্জনের পক্ষে আরও ভাল উপায় নেই
goliatone

8
ব্যবহারকারীরা এই পদ্ধতির সাথে কিছু মনে রাখতে চাইবেন তা node_modulesহ'ল প্রায়শই সংস্করণ নিয়ন্ত্রণ থেকে বাদ দেওয়া হয়। সুতরাং আপনি যদি কোনও দলের সাথে কাজ করেন বা কখনও আপনার সংগ্রহশালা ক্লোন করার প্রয়োজন হয়, সেই সেটিংস ফাইলটি সিঙ্কে রাখার জন্য আপনাকে অন্য একটি সমাধান নিয়ে আসতে হবে।
ট্র্যাভেস্টি 3

@ ট্র্যাভেস্টি 3 সেটিংস মডিউলটি আসলে একটি খালি মডিউল যা প্রকল্পের মূলের কোনও ফাইলের সামগ্রী রফতানি করে: পি
ফরিদ অ্যালামনোউটি

@ গোলিয়াটোন তার সমাধানের সাহায্যে আপনি ফাইলটির পথটি না জেনে যে কোনও জায়গা থেকে ফাইলটি পেতে পারেন, আপনাকে যা জানাতে হবে তা হ'ল "সেটিংস"। এটি না করে আপনি প্রজেক্ট ডিরেক্টরিতে পৌঁছা পর্যন্ত আপনাকে কতগুলি ফোল্ডার ব্যাকআপ করতে হবে তা স্পষ্টভাবে জানতে হবে। এটি কাজ করে কারণ নোড স্বয়ংক্রিয়ভাবে নোড_মডিউলগুলি অনুসন্ধান করে এবং এটি সর্বদা জানে where

26

গ্লোবাল রুট পাওয়ার সহজতম উপায় ( ধরে নিলে আপনি আপনার Node.js অ্যাপ্লিকেশনটি 'এনপিএম স্টার্ট' ইত্যাদি চালাতে এনপিএম ব্যবহার করেন )

var appRoot = process.env.PWD;

যদি আপনি উপরেরটি ক্রস-ভেরিফাই করতে চান

বলুন আপনি process.env.PWDনোড.জেএস অ্যাপ্লিকেশনটির সেটিংসের সাথে ক্রস-চেক করতে চান । আপনি যদি কিছু রানটাইম টেস্টের বৈধতা পরীক্ষা করতে চান তবে আপনি process.env.PWDএই কোডটি দিয়ে এটি ক্রস-চেক করতে পারেন (যা আমি লিখেছিলাম যা ভাল কাজ করে বলে মনে হচ্ছে)। আপনি আপনার প্যাকেজ.জসন ফাইলের এনপিএম_প্যাকেজ_নামের সাথে অ্যাপ্লিকেশনটিতে শেষ ফোল্ডারের নাম ক্রস-চেক করতে পারেন, উদাহরণস্বরূপ:

    var path = require('path');

    var globalRoot = __dirname; //(you may have to do some substring processing if the first script you run is not in the project root, since __dirname refers to the directory that the file is in for which __dirname is called in.)

    //compare the last directory in the globalRoot path to the name of the project in your package.json file
    var folders = globalRoot.split(path.sep);
    var packageName = folders[folders.length-1];
    var pwd = process.env.PWD;
    var npmPackageName = process.env.npm_package_name;
    if(packageName !== npmPackageName){
        throw new Error('Failed check for runtime string equality between globalRoot-bottommost directory and npm_package_name.');
    }
    if(globalRoot !== pwd){
        throw new Error('Failed check for runtime string equality between globalRoot and process.env.PWD.');
    }

আপনি এই এনপিএম মডিউলটিও ব্যবহার করতে পারেন: require('app-root-path')যা এই উদ্দেশ্যে খুব ভাল কাজ করে


5
এটি (সর্বাধিক) ইউনিক্স সিস্টেমে দুর্দান্ত কাজ করে। আপনার উইন্ডোজে আপনার এনপিএম মডিউল / অ্যাপটি কাজ করার সাথে সাথেই PWDএটি অপরিবর্তিত এবং এটি ব্যর্থ।
জেরেমি উইবে


@ মুহাম্মাদ উমর কেন process.cwd()সবসময় প্রকল্পের মূলের সমান হবে?
আলেকজান্ডার মিলস

আপনি যদি এটি রুট ফাইলে কল করেন তবে তা হয়ে যাবে
মুহাম্মদ উমর

14

আমি এটি আমার পক্ষে ধারাবাহিকভাবে কাজ করে দেখতে পেয়েছি, এমনকি যখন সাব-ফোল্ডার থেকে অ্যাপ্লিকেশনটি আহ্বান করা হয়েছে, যদিও এটি কিছু টেস্ট ফ্রেমওয়ার্ক যেমন মোচার মতো হতে পারে:

process.mainModule.paths[0].split('node_modules')[0].slice(0, -1);

এটি কেন কাজ করে:

রানটাইম নোডে সমস্ত লোড করা ফাইলের সম্পূর্ণ পাথের একটি রেজিস্ট্রি তৈরি করে। মডিউলগুলি প্রথমে লোড করা হয় এবং এভাবে এই রেজিস্ট্রিটির শীর্ষে। রেজিস্ট্রিটির প্রথম উপাদানটি নির্বাচন করে এবং 'নোড_মডিউলস' ডিরেক্টরিটির আগে পথটি ফিরে আসার মাধ্যমে আমরা অ্যাপ্লিকেশনটির মূল নির্ধারণ করতে সক্ষম হয়েছি।

এটি কোডের কেবল একটি লাইন, তবে সরলতার জন্য (আমার স্বার্থে), আমি এটিকে একটি এনপিএম মডিউলে ব্ল্যাক করেছি:

https://www.npmjs.com/package/node-root.pddivine

উপভোগ করুন!


1
process.mainModule অপ্রচলিত থেকে: v14.0.0 - require.main.paths[0].split('node_modules')[0].slice(0, -1);পরিবর্তে ব্যবহার করুন।
রবসি

10

এই সমস্ত "রুট ডায়ার" বেশিরভাগই একটি বাস্তব গাদা পথের কিছু ভার্চুয়াল পাথ সমাধান করা দরকার, তাই আপনার কি নজর দেওয়া উচিত path.resolve?

var path= require('path');
var filePath = path.resolve('our/virtual/path.ext');

9

রুটটিতে আপনার মডিউলটিতে এই লাইনটি যতটা সহজ, সাধারণত এটি app.js হয়

global.__basedir = __dirname;

তারপরে _ বেসডির আপনার সমস্ত মডিউলগুলিতে অ্যাক্সেসযোগ্য হবে।


8

আপনি __filenameকোনও খুঁজে না পাওয়া পর্যন্ত আপনি উপরের দিকে পাড়ি দেওয়ার চেষ্টা করতে পারেন package.jsonএবং সিদ্ধান্ত নিতে পারেন যে এটি আপনার বর্তমান ফাইলের মূল ডিরেক্টরি।


7

প্রকৃতপক্ষে, আমি খুব দৃ the়রূপেও সম্ভবত তুচ্ছ সমাধান খুঁজে পাই: আপনি কেবল নীচের ফাইলটি আপনার প্রকল্পের মূল ডিরেক্টরিতে রাখুন: root-path.js যার নিম্নলিখিত কোড রয়েছে:

import * as path from 'path'
const projectRootPath = path.resolve(__dirname)
export const rootPath = projectRootPath

4

এক্সপ্রেস ব্যবহার করার সময় যে কৌশলটি আমি দরকারী পেয়েছি তা হ'ল আপনার অন্য কোনও রুট সেট হওয়ার আগে অ্যাপ্লিকেশনগুলিতে নিম্নলিখিতটি যুক্ত করা

// set rootPath
app.use(function(req, res, next) {
  req.rootPath = __dirname;
  next();
});

app.use('/myroute', myRoute);

গ্লোবালগুলি ব্যবহার করার দরকার নেই এবং আপনার অনুরোধের সামগ্রীর সম্পত্তি হিসাবে মূল ডিরেক্টরিটির পথ রয়েছে।

আপনার অ্যাপ.জেএসটি যদি আপনার প্রকল্পের মূলের মধ্যে থাকে তবে এটি কাজ করে যা ডিফল্টরূপে এটি।


4

এটি আপনার প্রধান অ্যাপ্লিকেশন ফাইল (উদাঃ app.js) এর শুরুতে কোথাও যুক্ত করুন:

global.__basedir = __dirname;

এটি একটি বিশ্বব্যাপী পরিবর্তনশীল সেট করে যা সর্বদা আপনার অ্যাপ্লিকেশনের বেস ডিরের সমতুল্য। অন্যান্য ভেরিয়েবলের মতো এটি ব্যবহার করুন:

const yourModule = require(__basedir + '/path/to/module.js');

সরল ...


3

আমি জানি এটি ইতিমধ্যে অনেক দেরি হয়ে গেছে। তবে আমরা দুটি পদ্ধতি দ্বারা রুট ইউআরএল আনতে পারি

1 ম পদ্ধতি

var path = require('path');
path.dirname(require.main.filename);

2 য় পদ্ধতি

var path = require('path');
path.dirname(process.mainModule.filename);

রেফারেন্স লিংক: - https://gist.github.com/geekiam/e2e3e0325abd9023d3a3


3

একটি INIT_CWDসম্পত্তি আছে process.env। আমি বর্তমানে আমার প্রকল্পে এটি নিয়ে কাজ করছি।

const {INIT_CWD} = process.env; // process.env.INIT_CWD 
const paths = require(`${INIT_CWD}/config/paths`);

শুভকামনা ...


1
এমন একটি প্যাকেজটির জন্য মনোমুগ্ধের মতো কাজ করেছে যা প্রকল্পটিকে ম্যানিপুলেট করে এটি পোস্ট-ইনস্টল পদক্ষেপ হিসাবে ডেকে আনা হচ্ছে। যদিও আমি এখনও এটি নির্ভরতার অন্য স্তরে পরীক্ষা করে দেখিনি, যেখানে কোনও প্রকল্প আমার প্যাকেজ ব্যবহার করে এমন নির্ভরতা ব্যবহার করে।
জেমসদেভ

1
@ জামেসডেভ, এর INIT_CWDসমাধান করেছেন যা directoryথেকে npm-scriptআউটকেটেড করা হয়েছিল।
আকাশ

2

আপনি যদি চলমান নোড.জেএস অ্যাপ্লিকেশন থেকে প্রকল্পের মূল নির্ধারণ করতে চান তবে আপনি কেবল খুব সহজেই পারেন।

process.mainModule.path

1

মূল ফাইলের শীর্ষে অ্যাড করুন:

mainDir = __dirname;

তারপরে আপনার যে কোনও ফাইলে এটি প্রয়োজন:

console.log('mainDir ' + mainDir);
  • mainDirবিশ্বব্যাপী সংজ্ঞায়িত করা হয়, আপনার যদি কেবলমাত্র বর্তমান ফাইলটিতে এটি প্রয়োজন হয় - __dirnameপরিবর্তে ব্যবহার করুন।
  • প্রধান ফাইল প্রকল্পের রুট ফোল্ডারে সাধারণত মত নামকরণ করা হয় main.js, index.js, gulpfile.js

1

আমি এটি ব্যবহার করি

নাম দেওয়া আমার মডিউল জন্য mymodule

var BASE_DIR = __dirname.replace(/^(.*\/mymodule)(.*)$/, '$1')


1

এটি সেক্সি করুন 💃🏻।

const users = require('../../../database/users'); // 👎 what you have
// OR
const users = require('$db/users'); // 👍 no matter how deep you are
const products = require('/database/products'); // 👍 alias or pathing from root directory


কুরুচিপূর্ণ পথটির সমস্যা সমাধানের জন্য তিনটি সহজ পদক্ষেপ।

  1. প্যাকেজ ইনস্টল করুন: npm install sexy-require --save
  2. require('sexy-require')আপনার মূল অ্যাপ্লিকেশন ফাইলের শীর্ষে একবার অন্তর্ভুক্ত করুন।

    require('sexy-require');
    const routers = require('/routers');
    const api = require('$api');
    ...
  3. .চ্ছিক পদক্ষেপ। .pathsআপনার প্রকল্পের মূল ডিরেক্টরিতে ফাইলটিতে পাথ কনফিগারেশন সংজ্ঞায়িত করা যেতে পারে ।

    $db = /server/database
    $api-v1 = /server/api/legacy
    $api-v2 = /server/api/v2

শালীন মনে হচ্ছে, খুব খারাপ এটির একটি হাস্যকর নাম ছিল।
জেএইচএইচ

@ জেএইচএইচ ভাল ... আমাকে আরও একটি ভাল নামটি খুঁজে পেতে হয়েছিল
সুলতান

1

এটি ডিরেক্টরি ট্রি অবধি নিচে নামবে যতক্ষণ না এটিতে একটি node_modulesডিরেক্টরি থাকে যা সাধারণত আপনার প্রকল্পের মূল নির্দেশ করে:

const fs = require('fs')
const path = require('path')

function getProjectRoot(currentDir = __dirname.split(path.sep)) {
  if (!currentDir.length) {
    throw Error('Could not find project root.')
  }
  const nodeModulesPath = currentDir.concat(['node_modules']).join(path.sep)
  if (fs.existsSync(nodeModulesPath) && !currentDir.includes('node_modules')) {
    return currentDir.join(path.sep)
  }
  return this.getProjectRoot(currentDir.slice(0, -1))
}

এটি নিশ্চিত করে তোলে যে node_modulesফিরে আসা পথে কোনও নেই , কারণ এর অর্থ এটি কোনও নেস্টেড প্যাকেজ ইনস্টলটিতে রয়েছে।


1

process.mainModuleভি ১৪.০.০. এর পরে অবচিত করা হয়েছে । উত্তর উল্লেখ করার সময়, দয়া করে ব্যবহার করুন require.main , বাকী এখনও আছে।

process.mainModule.paths
  .filter(p => !p.includes('node_modules'))
  .shift()

প্রধান মডিউলগুলিতে সমস্ত পাথ পান এবং "নোড_মডিউলগুলি" রয়েছে এমনগুলি ফিল্টার করুন, তারপরে অবশিষ্ট পথের তালিকার প্রথমটি পান। অপ্রত্যাশিত আচরণ ত্রুটি ছুঁড়ে ফেলবে না, কেবলমাত্র একটি undefined

যেমন কল করার পরেও আমার পক্ষে ভাল কাজ করে $ mocha


0

App.js এ একটি ফাংশন তৈরি করুন

/*Function to get the app root folder*/

var appRootFolder = function(dir,level){
    var arr = dir.split('\\');
    arr.splice(arr.length - level,level);
    var rootFolder = arr.join('\\');
    return rootFolder;
}

// view engine setup
app.set('views', path.join(appRootFolder(__dirname,1),'views'));

0

আপনি কেবল এক্সপ্রেস অ্যাপ্লিকেশন ভেরিয়েবলের মধ্যে মূল ডিরেক্টরিটি যুক্ত করতে পারেন এবং অ্যাপ থেকে এই পাথটি পেতে পারেন। এই অ্যাড জন্য app.set('rootDirectory', __dirname);আপনার index.js বা app.js ফাইলে। এবং req.app.get('rootDirectory')আপনার কোডে মূল ডিরেক্টরি পাথ পাওয়ার জন্য ব্যবহার করুন ।


0

পুরানো প্রশ্ন, আমি জানি, তবে ব্যবহার করার জন্য কোনও প্রশ্নই উল্লেখ করা হয়নি progress.argv। আরজিভি অ্যারেতে একটি সম্পূর্ণ পথের নাম এবং ফাইলের নাম (.js এক্সটেনশন সহ বা ছাড়াই) অন্তর্ভুক্ত থাকে যা নোড দ্বারা সম্পাদন করার জন্য প্যারামিটার হিসাবে ব্যবহৃত হত। এটিতে পতাকাও থাকতে পারে বলে আপনার অবশ্যই এটি ফিল্টার করতে হবে।

এটি সরাসরি ব্যবহার করতে পারেন এমন কোনও উদাহরণ নয় (আমার নিজের কাঠামো ব্যবহারের কারণে) তবে আমি মনে করি এটি কীভাবে এটি করবেন তা আপনাকে কিছু ধারণা দেয়। এই ক্রিয়াকলাপটি সিস্টেমটিকে অত্যধিক চাপ দেয় তা এড়াতে আমি একটি ক্যাশে পদ্ধতিও ব্যবহার করি, বিশেষত যখন কোনও এক্সটেনশান নির্দিষ্ট না করা হয় (এবং একটি ফাইলের উপস্থিতি পরীক্ষা করা প্রয়োজন) উদাহরণস্বরূপ:

node myfile

অথবা

node myfile.js

এই কারণেই আমি এটি ক্যাশে করছি, নীচের কোডটিও দেখুন।


function getRootFilePath()
{
        if( !isDefined( oData.SU_ROOT_FILE_PATH ) )
        {
            var sExt = false;

            each( process.argv, function( i, v )
            {
                 // Skip invalid and provided command line options
                if( !!v && isValidString( v ) && v[0] !== '-' )
                {
                    sExt = getFileExt( v );

                    if( ( sExt === 'js' ) || ( sExt === '' && fileExists( v+'.js' )) )
                    {

                        var a = uniformPath( v ).split("/"); 

                         // Chop off last string, filename
                        a[a.length-1]='';

                         // Cache it so we don't have to do it again.
                        oData.SU_ROOT_FILE_PATH=a.join("/"); 

                         // Found, skip loop
                        return true;
                    }
                }
            }, true ); // <-- true is: each in reverse order
        }

        return oData.SU_ROOT_FILE_PATH || '';
    }
}; 

0

একটি ইলেক্ট্রন অ্যাপ্লিকেশনটির মূল পথ খুঁজে পাওয়া জটিল হয়ে উঠতে পারে। কারণ মূল প্রক্রিয়া এবং উত্পাদন, বিকাশ এবং প্যাকেজযুক্ত শর্ত হিসাবে বিভিন্ন অবস্থার অধীনে রেন্ডারারের জন্য মূল পথটি আলাদা।

আমি একটি বৈদ্যুতিন অ্যাপ্লিকেশনটির মূল পাথ ক্যাপচার করতে একটি এনএমপি প্যাকেজ ইলেক্ট্রন-রুট-পাথ লিখেছি ।

$ npm install electron-root-path

or 

$ yarn add electron-root-path


// Import ES6 way
import { rootPath } from 'electron-root-path';

// Import ES2015 way
const rootPath = require('electron-root-path').rootPath;

// e.g:
// read a file in the root
const location = path.join(rootPath, 'package.json');
const pkgInfo = fs.readFileSync(location, { encoding: 'utf8' });



0

প্রস্তাবনা

এটি একটি অতি পুরানো প্রশ্ন তবে এটি 2012 এর মতোই 2020-এ স্নায়ুতে আঘাত হানে বলে মনে হয়েছে I've পাশাপাশি প্রতিটি পরিস্থিতিতে প্রযোজ্য)।

জিআইটি + শিশু প্রক্রিয়া

আপনি যদি জিআইটিটিকে আপনার সংস্করণ নিয়ন্ত্রণ ব্যবস্থা হিসাবে ব্যবহার করেন তবে প্রকল্পের মূল নির্ধারণের সমস্যা হ্রাস করা যেতে পারে (যা আমি প্রকল্পের সঠিক মূল হিসাবে বিবেচনা করব - সর্বোপরি, আপনি চাইবেন আপনার ভিসিএসের সম্পূর্ণ দৃশ্যমানতার সুযোগ রয়েছে) :

পুনরায় সংগ্রহস্থল মূল পাথ

যেহেতু আপনাকে এটি করতে সিএলআই কমান্ড চালাতে হবে, তাই আমাদের একটি শিশু প্রক্রিয়া তৈরি করতে হবে। অতিরিক্ত হিসাবে, প্রকল্পের রুট মিড-রানটাইম পরিবর্তনের পক্ষে অত্যন্ত সম্ভাবনা রয়েছে, তাই আমরা child_processপ্রারম্ভকালে মডিউল APIs এর সিঙ্ক্রোনাস সংস্করণটি ব্যবহার করতে পারি ।

আমি spawnSync()কাজের জন্য সবচেয়ে উপযুক্ত বলে মনে করি । আসল কমান্ডটি চালানোর জন্য, git worktree( --porcelainপার্সিংয়ের স্বাচ্ছন্দ্যের বিকল্প সহ ) আমাদের নিখুঁত রুটটি পুনরুদ্ধার করতে হবে।

নমুনায় আমি পথের একটি অ্যারে ফিরে ফিরতে পছন্দ করেছি কারণ একাধিক ওয়ার্কট্রি থাকতে পারে (যদিও তাদের পক্ষে সাধারণ পাথ সম্ভবত রয়েছে) ঠিক নিশ্চিত হওয়ার জন্য to নোট করুন যেহেতু আমরা একটি সি এল এল কমান্ডটি ব্যবহার করি, shellবিকল্পটি সেট করা উচিতtrue উচিত (অবিশ্বস্ত ইনপুট না থাকায় সুরক্ষা কোনও সমস্যা হওয়া উচিত নয়)।

তুলনা এবং ফলব্যাকের দিকে এগিয়ে যাওয়া

ভিসিএস অ্যাক্সেসযোগ্য হতে পারে এমন একটি পরিস্থিতি বুঝতে পেরে, ডক্স এবং অন্যান্য উত্তর বিশ্লেষণের পরে আমি বেশ কয়েকটি ফলব্যাক অন্তর্ভুক্ত করেছি। সংক্ষেপে, প্রস্তাবিত সমাধানগুলি নীচে সিদ্ধ হওয়ার প্রস্তাব দেওয়া হয় (তৃতীয় পক্ষের মডিউলগুলি এবং প্যাকেজ-নির্দিষ্ট বাদে):

| সমাধান | সুবিধা | মূল সমস্যা |
| ------------------------ | ----------------------- | -------------------------------- |
| `__Filename` | মডিউল ফাইল | মডিউল সম্পর্কিত |
| `__নির্দেশ` | মডিউল dir পয়েন্টস `__ ফাইলনেমile এর মতো
| `নোড_মডিউলস` গাছের পদচারণা প্রায় গ্যারান্টেড রুট | বাসা বাঁধলে জটিল গাছের হাঁটা |
| `path.resolve ("। ")` | রুট যদি সিডাব্লুডি রুট হয় | `process.cwd ()` | হিসাবে একই
| `প্রক্রিয়া.আরজিভি [1]` | `__ ফাইলনেমile এর মতো `__ ফাইলনেমile এর মতো
| `process.env.INIT_CWD` | পয়েন্টগুলি `n pm রান` দির | `npm` এবং&& CLI লঞ্চ প্রয়োজন
| `process.env.PWD` | বর্তমান দির পয়েন্ট | এর সাথে সম্পর্কিত (এটি) লঞ্চ ডির |
| `process.cwd ()` | `env.PWD` | এর মতো time process.chdir (পথ) run রানটাইম |
| `need.main.filename` | রুট যদি `=== মডিউল` | প্রয়োজনীয় মডিউল | ব্যর্থ

উপরের তুলনা টেবিল থেকে, সর্বজনীন দুটি পদ্ধতির:

  • require.main.filenamerequire.main === moduleপূরণ করা হলে রুট পাওয়ার সহজ উপায় হিসাবে
  • node_modulesপ্রস্তাবিত ট্রি ওয়াক আরেকটি অনুমান ব্যবহার করেছে :

যদি মডিউলটির node_modulesডিরেক্টরিটি ভিতরে থাকে তবে এটির মূল হতে পারে

মূল অ্যাপ্লিকেশনের জন্য এটি অ্যাপ্লিকেশন রুটটি এবং মডিউলটির জন্য এটি পেতে পারে - এর প্রকল্পের মূল।

ফলব্যাক 1. গাছের হাঁটা

কোনও টার্গেট ডিরেক্টরি কোনও প্রদত্ত মডিউল হিসাবে পাওয়া গেলে এটির মূল এটির প্রকল্পের মূল stop অনুসন্ধানের গভীরতা কনফিগারযোগ্য করতে কেউ কলগুলিকে শৃঙ্খলাবদ্ধ করতে বা প্রসারিত করতে পারে:

/**
 * @summary gets root by walking up node_modules
 * @param {import("fs")} fs
 * @param {import("path")} pt
 */
const getRootFromNodeModules = (fs, pt) =>

    /**
     * @param {string} [startPath]
     * @returns {string[]}
     */
    (startPath = __dirname) => {

        //avoid loop if reached root path
        if (startPath === pt.parse(startPath).root) {
            return [startPath];
        }

        const isRoot = fs.existsSync(pt.join(startPath, "node_modules"));

        if (isRoot) {
            return [startPath];
        }

        return getRootFromNodeModules(fs, pt)(pt.dirname(startPath));
    };

ফলব্যাক 2. প্রধান মডিউল

দ্বিতীয় বাস্তবায়ন তুচ্ছ

/**
 * @summary gets app entry point if run directly
 * @param {import("path")} pt
 */
const getAppEntryPoint = (pt) =>

    /**
     * @returns {string[]}
     */
    () => {

        const { main } = require;

        const { filename } = main;

        return main === module ?
            [pt.parse(filename).dir] :
            [];
    };

বাস্তবায়ন

আমি ফলেরব্যাক হিসাবে ট্রি ওয়াকার ব্যবহার করার পরামর্শ দেব কারণ এটি আরও বহুমুখী:

const { spawnSync } = require("child_process");
const pt = require('path');
const fs = require("fs");

/**
 * @summary returns worktree root path(s)
 * @param {function : string[] } [fallback]
 * @returns {string[]}
 */
const getProjectRoot = (fallback) => {

    const { error, stdout } = spawnSync(
        `git worktree list --porcelain`,
        {
            encoding: "utf8",
            shell: true
        }
    );

    if (!stdout) {
        console.warn(`Could not use GIT to find root:\n\n${error}`);
        return fallback ? fallback() : [];
    }

    return stdout
        .split("\n")
        .map(line => {
            const [key, value] = line.split(/\s+/) || [];
            return key === "worktree" ? value : "";
        })
        .filter(Boolean);
};

অসুবিধেও

সর্বাধিক সুস্পষ্টরূপে জিআইটি ইনস্টল করা এবং প্রারম্ভিক হওয়া যা অনাকাঙ্ক্ষিত / অনর্থক হতে পারে (পার্শ্ব নোট: প্রোডাকশন সার্ভারে জিআইটি ইনস্টল করা অস্বাভাবিক নয় বা এটি অনিরাপদও নয়) , যদিও নয়)। উপরে বর্ণিত হিসাবে ফ্যালব্যাকগুলির মাধ্যমে মধ্যস্থতা করা যায়।

মন্তব্য

  1. পদ্ধতির আরও প্রসারিত করার জন্য একাধিক ধারণা 1:
    • ফাংশন প্যারামিটার হিসাবে কনফিগার পরিচয় করিয়ে দিন
    • export এটি একটি মডিউল করতে ফাংশন
    • জিআইটি ইনস্টল এবং / অথবা আরম্ভ করা আছে কিনা তা পরীক্ষা করে দেখুন

তথ্যসূত্র

  1. git worktree উল্লেখ
  2. spawnSync উল্লেখ
  3. require.main উল্লেখ
  4. path.dirname() উল্লেখ


-1

চেষ্টা path._makeLong('some_filename_on_root.js');

উদাহরণ:

cons path = require('path');
console.log(path._makeLong('some_filename_on_root.js');

এটি আপনার নোড অ্যাপ্লিকেশনটির মূল থেকে পুরো পথ ফিরে আসবে (প্যাকেজ.জসনের একই অবস্থান)


-1

শুধু ব্যবহার করুন:

 path.resolve("./") ... output is your project root directory

এটি দুর্দান্ত কাজ করে! path.resolve ("।") পাশাপাশি কাজ করে
নওল শেঙ্ক

এটি কেবলমাত্র বর্তমান ডিরেক্টরি দেয় যা মূল ডিরেক্টরি হতে পারে না।
অরেড

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.