नोड बिन स्क्रिप्ट चलाते समय कमांड लाइन वर्किंग डायरेक्टरी निर्धारित करें


120

मैं एक नोड कमांड लाइन इंटरफ़ेस बना रहा हूं। यह विश्व स्तर पर स्थापित है और निष्पादित करने के लिए एक बिन फ़ाइल का उपयोग करता है।

मेरी योजना है कि मैं जिस फाइल पर काम कर रहा हूं उसकी रूट डायरेक्टरी में एक विंडो खुली हो और फिर केवल कमांड को चलाऊं लेकिन मैं वर्तमान वर्किंग डायरेक्टरी को निर्धारित करने में असमर्थ रहा हूं process.cwd()क्योंकि नोड पैकेज की डायरेक्टरी वापस आ रही है। मैंने शुरू में यह मान लिया था कि चूंकि कोड एक बैच फ़ाइल का उपयोग करके एक रैपर के रूप में निष्पादित किया जा रहा है (यही कारण है कि बिन फाइलें शुरुआत में नोड के बिना निष्पादित कर सकती हैं) तो यह असंभव है लेकिन कॉफी-स्क्रिप्ट इसे करने का प्रबंधन करती है। मैंने कॉफी-स्क्रिप्ट स्रोत पर एक नज़र डाली, लेकिन इसका पालन नहीं कर सका (पर्याप्त अनुभव नहीं)।

खुद के लिए इसे जांचने के लिए इस package.json फ़ाइल के साथ एक पैकेज बनाएँ:

{
  "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');

क्या कोई इस पर कुछ प्रकाश डाल सकता है।

और फिर कोशिश करें और लिब / टेस्ट के अंदर कमांड लाइन निर्देशिका प्राप्त करें।

जवाबों:


196
  • process.cwd() रिटर्न निर्देशिका जहां कमांड को निष्पादित किया गया है (नोड पैकेज की निर्देशिका नहीं) यदि इसे एप्लिकेशन के अंदर 'प्रोसेस.चर्ड' द्वारा नहीं बदला गया है।
  • __filename यह कहाँ रखा है फ़ाइल करने के लिए पूर्ण पथ देता है।
  • __dirnameकी निर्देशिका के लिए पूर्ण पथ देता है __filename

यदि आपको अपने मॉड्यूल निर्देशिका से फ़ाइलों को लोड करने की आवश्यकता है, तो आपको सापेक्ष रास्तों का उपयोग करने की आवश्यकता है।

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

के बजाय

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

require(lib + '/test');

यह हमेशा फ़ाइल के सापेक्ष होता है जहां से इसे कॉल किया जाता है और वर्तमान कार्य dir पर निर्भर नहीं होता है।


2
इसके बाद process.chdir(), क्या मूल पाने का कोई तरीका है?
15

@reergymerej आप शायद chdir () (उदाहरण के लिए, var originalCwd = process.cwd();फिर अपने पर अमल process.chdir(), और आप मूल बाद में लौट सकते हैं ) निष्पादित करने से पहले cwd को स्टोर करना चाहते हैं ।
कुंडा

है ../lib/testपोर्टेबल?
सेबेस्टियन

नहीं, यह एक पोर्टेबल समाधान नहीं है क्योंकि विंडोज़ बैकस्लैश का उपयोग करती है। इसलिए अगर आप इसे विंडोज़ में चलाने की कोशिश करेंगे तो यह काम नहीं करेगा।
zachdyer

1
वास्तव में NodeJS के लिए यह सब समान है। यहां तक ​​कि विंडोज पर भी आप आसानी से यूनिक्स रास्ते में रिश्तेदार पथ की आवश्यकता कर सकते हैं। तो ../lib/testपोर्टेबल है, जबकि विंडोज समकक्ष ..\lib\testनहीं है ...
क्रिश्चियन Ulbrich

48

वर्तमान कार्य निर्देशिका

वर्तमान कार्य निर्देशिका प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं:

process.cwd()

हालांकि, इस बात से अवगत रहें कि कुछ स्क्रिप्ट, विशेष रूप से गल्प, वर्तमान वर्किंग डायरेक्टरी को बदल देगी process.chdir()

नोड मॉड्यूल पथ

आप वर्तमान मॉड्यूल का पथ प्राप्त कर सकते हैं:

  • __filename
  • __dirname

मूल निर्देशिका (जहां कमांड शुरू की गई थी)

यदि आप कमांड लाइन से एक स्क्रिप्ट चला रहे हैं, और आप उस मूल निर्देशिका को चाहते हैं जिसमें से स्क्रिप्ट को चलाया गया था, भले ही स्क्रिप्ट वर्तमान में किस निर्देशिका में चल रही हो, आप इसका उपयोग कर सकते हैं:

process.env.INIT_CWD

एनपीएम लिपियों के साथ काम करते समय मूल निर्देशिका

कभी-कभी परियोजना की जड़ के बजाय वर्तमान निर्देशिका में एनपीएम स्क्रिप्ट को चलाने के लिए यह वांछनीय है।

यह चर npm पैकेज स्क्रिप्ट के अंदर उपलब्ध है:

$INIT_CWD.

आपको एनपीएम का हालिया संस्करण चलाना होगा। यदि यह चर उपलब्ध नहीं है, तो सुनिश्चित करें कि NPM अद्यतित है।

यह आपको अपने पैकेज में वर्तमान पथ का उपयोग करने की अनुमति देगा।

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

process.env.INIT_CWDकी निर्देशिका रिटर्नpackage.json
वॉन

2
देखो, $ INIT_CWD केवल लिनक्स पर काम करता है। विंडोज के लिए, आपको% INIT_CWD% का उपयोग करना होगा। मुझे लगता है कि npmjs.com/package/cross-env का उपयोग करके इस मुद्दे को दूर किया जा सकता है , लेकिन मैंने इसे स्वयं करने की कोशिश नहीं की है
स्टेफ़नी

3

वैकल्पिक रूप से, यदि आप पूरी तरह से वर्तमान NodeJS स्क्रिप्ट की वर्तमान निर्देशिका प्राप्त करना चाहते हैं, तो आप इस तरह से कुछ सरल कोशिश कर सकते हैं। ध्यान दें कि यह नोड CLI में ही काम नहीं करेगा:

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')। यह आपको उस निर्देशिका का पूर्ण पथ देगा जहाँ से इसे कहा जाता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.