নোড বিন স্ক্রিপ্ট চলাকালীন কমান্ড লাইন কার্যকারী ডিরেক্টরি নির্ধারণ করুন


120

আমি একটি নোড কমান্ড লাইন ইন্টারফেস তৈরি করছি। এটি বিশ্বব্যাপী ইনস্টল করা হয় এবং কার্যকর করার জন্য একটি বিন ফাইল ব্যবহার করে।

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

নিজের জন্য এটি পরীক্ষা করতে এই প্যাকেজ.জসন ফাইলটি দিয়ে একটি প্যাকেজ তৈরি করুন:

{
  "name": "test-package",
  "version": "1.0.0",
  "bin": {
    "test-package":  "./bin/test-package"
  },
  "main": "/lib/test"
}

এই টেস্ট-প্যাকেজ ফাইলটিতে বিন:

#!/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 / পরীক্ষার ভিতরে কমান্ড লাইন ডিরেক্টরি পান।

উত্তর:


196
  • process.cwd() ডিরেক্টরিটি প্রয়োগ করে যেখানে কমান্ড কার্যকর করা হয়েছে (নোড প্যাকেজের ডিরেক্টরি নয়) যদি এটি প্রয়োগের অভ্যন্তরে 'process.chdir' দ্বারা পরিবর্তন না করা হয়।
  • __filename যেখানে এটি স্থাপন করা হয়েছে সেখানে ফাইলের পরম পথ ফেরায়।
  • __dirnameএর ডিরেক্টরিতে পরম পথ ফেরায় __filename

আপনার যদি আপনার মডিউল ডিরেক্টরি থেকে ফাইলগুলি লোড করতে হয় তবে আপনাকে আপেক্ষিক পাথগুলি ব্যবহার করতে হবে।

require('../lib/test');

পরিবর্তে

var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');

require(lib + '/test');

এটি সর্বদা ফাইলের সাথে সম্পর্কিত যেখানে এটি ডেকেছে এবং বর্তমান কাজের দিরের উপর নির্ভর করে না।


2
এর পরে process.chdir(), আসলটি পাওয়ার কোনও উপায় আছে?
রির্জিমেজেজ

@ রিয়ারজিমেরেজ আপনি সম্ভবত chdir () চালানোর আগে প্রথমে সিডব্লিউড সংরক্ষণ করতে চান (উদাহরণস্বরূপ, var originalCwd = process.cwd();তারপরে এক্সিকিউট করুন process.chdir(), এবং আপনি মূলটিতে ফিরে যেতে পারেন)।
সুইভেল

হয় ../lib/testপোর্টেবল?
সেবাস্তিয়ান

না, এটি কোনও বহনযোগ্য সমাধান নয় কারণ উইন্ডোজগুলি ব্যাকস্ল্যাশ ব্যবহার করে। সুতরাং আপনি যদি এটি উইন্ডোতে চালানোর চেষ্টা করেন তবে এটি কাজ করবে না।
zachdyer

1
আসলে নোডজেএসের জন্য এটি সব একই। এমনকি উইন্ডোজ এ আপনি ইউনিক্স উপায়ে সুবিধাজনকভাবে আপেক্ষিক পাথ প্রয়োজন করতে পারেন। সুতরাং ../lib/testপোর্টেবল হয় যেহেতু উইন্ডোজ সহযোগীর ..\lib\testনা ...
খ্রিস্টান Ulbrich

48

বর্তমান ওয়ার্কিং ডিরেক্টরি

বর্তমান ওয়ার্কিং ডিরেক্টরি পেতে, আপনি ব্যবহার করতে পারেন:

process.cwd()

তবে, সচেতন থাকুন যে কয়েকটি স্ক্রিপ্টগুলি উল্লেখযোগ্যভাবে গাল্প বর্তমান চলমান ডিরেক্টরিটি এর সাথে পরিবর্তন করবে process.chdir()

নোড মডিউল পাথ

আপনি এটির সাথে বর্তমান মডিউলটির পাথ পেতে পারেন:

  • __filename
  • __dirname

মূল ডিরেক্টরি (যেখানে আদেশটি শুরু হয়েছিল)

আপনি যদি কমান্ড লাইন থেকে কোনও স্ক্রিপ্ট চালাচ্ছেন এবং আপনি যে ডিরেক্টরিটি স্ক্রিপ্টটি চালিত করেছিলেন তা চাই, স্ক্রিপ্ট বর্তমানে যে ডিরেক্টরিতে কাজ করছে তা নির্বিশেষে আপনি ব্যবহার করতে পারেন:

process.env.INIT_CWD

মূল ডিরেক্টরি, যখন এনপিএম স্ক্রিপ্টগুলির সাথে কাজ করে

কখনও কখনও প্রকল্পের মূলের পরিবর্তে বর্তমান ডিরেক্টরিতে এনপিএম স্ক্রিপ্ট চালানো বাঞ্ছনীয়।

এই পরিবর্তনশীলটি এনপিএম প্যাকেজ স্ক্রিপ্টগুলির ভিতরে পাওয়া যায়:

$INIT_CWD.

আপনার অবশ্যই এনপিএমের সাম্প্রতিক সংস্করণ চলছে। যদি এই ভেরিয়েবলটি উপলভ্য না থাকে তবে নিশ্চিত হন যে এনপিএম আপ টু ডেট।

এটি আপনাকে আপনার প্যাকেজ.জসনের বর্তমান পথে অ্যাক্সেস করার অনুমতি দেবে, যেমন:

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}

process.env.INIT_CWDএর Dir ফেরৎpackage.json
Vaughan

2
দেখুন, $ INIT_CWD কেবল লিনাক্সে কাজ করে। উইন্ডোজের জন্য আপনাকে% INIT_CWD% ব্যবহার করতে হবে। আমি মনে করি npmjs.com/package/cross-env ব্যবহার করে এই সমস্যাটি কাটিয়ে উঠতে পারে , তবে আমি নিজে চেষ্টা করে দেখিনি
স্টেফানি

3

বিকল্পভাবে, আপনি যদি কেবলমাত্র বর্তমান নোডজেএস স্ক্রিপ্টের বর্তমান ডিরেক্টরিটি পেতে চান তবে আপনি এর মতো সহজ কিছু চেষ্টা করতে পারেন। মনে রাখবেন যে এটি নোড সিএলআই নিজেই কাজ করবে না:

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

3

path.resolve('.')এছাড়াও একটি নির্ভরযোগ্য এবং পরিষ্কার বিকল্প, কারণ আমরা প্রায় সর্বদা require('path')। এটি আপনাকে ডিরেক্টরিটি যেখানে ডাকা হয়েছে সেখান থেকে পরম পথ দেবে।


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