नोड एनपीएम विंडो फ़ाइल पथ संकुल को स्थापित करने के लिए बहुत लंबा है


88

परिस्थिति

मैं विंडोज-होस्टेड विकास परिवेशों में गल्प और संबंधित फ्रंट-एंड टूल चेन का उपयोग करना चाहता हूं। मैं ब्राउज़र-सिंक की तरह gulp प्लग-इन का उपयोग करने की कोशिश कर रहा एक दीवार को मार रहा हूं, क्योंकि फाइलों को कॉपी करने के लिए विंडोज़ फ़ाइल पथ बनाने के लिए नोड_मॉडल फ़ोल्डर ग्राफ़ प्रशंसक बाहर निकलते हैं। मैं इस समस्या से निपटने के लिए विंडोज पर अभी एक व्यावहारिक दृष्टिकोण चाहता हूं, चाहे जो भी हो, नोड समुदाय में भविष्य में विंडोज पर npm प्रयोज्यता में सुधार करने के लिए क्या हो सकता है या नहीं।

2 प्रश्न

  1. क्या विंडोज के लिए एक एनपीएम वर्कफ़्लो है जो बस उस तरह से काम करता है जैसा यह इरादा था? "कमांड और फाइल्स इंस्टॉल करें" (जैसे OSX पर npm की तुलना, लिनक्स पर npm, रूबी रत्नों या यहां तक ​​कि नगेट के साथ) मैं हर बार उपयोग किए जाने वाले मैनुअल फाइल एडिट्स, सिमिलिंक आदि के गुच्छा के साथ फील नहीं करना चाहता। विंडोज पर एन.पी.एम.

  2. वहाँ एक अच्छी तरह से प्रलेखित, npm और नोड निष्पादन के लिए स्थिर Cygwin वर्कफ़्लो Windows API फ़ाइल पथ सीमाएँ हल करने के लिए है?

नीचे सूचीबद्ध Gory विवरण ...

सामान्य समस्या

  • एक मानक विंडोज कमांड प्रॉम्प्ट से एनपीएम इंस्टॉल करना डीप नेस्टेड नोड_मॉड्यूल पदानुक्रमों पर विफल होता है।
  • जॉयंट के गिथब रेपो थ्रेड के अनुसार, यह एक स्वीकार किया गया मुद्दा है, जो कि विंडोज-केंद्रित वातावरण में डेवलपर्स के लिए कोई तालमेल नहीं है। ( वास्तव में? )
  • NT कर्नेल 32,767 वर्णों तक फ़ाइल पथ लंबाई का समर्थन करता है।
  • Windows API का MAXPATH 260 वर्णों तक सीमित है।
  • विंडोज एपीआई सभी प्रमुख विंडोज शेल और व्हाट्सएप के लिए फाइल ऑपरेशंस को हैंडल करता है: एक्सप्लोरर, सीएमडी, पॉवर्सशेल, माइस्जिट बैश, इत्यादि ( एमएस वास्तव में? NTFS कितने समय के आसपास है? )
  • साइग्विन लंबी फ़ाइल पथों का समर्थन करता है, लेकिन npm.cmd समतल स्वरूपण के कारण आउट-ऑफ़-बॉक्स काम नहीं करता है। मैंने DOS2Unix को npm पर बदलने की कोशिश की, ताकि इसे Cygwin के साथ काम किया जा सके, लेकिन इसके साथ अन्य मुद्दे भी प्रतीत होते हैं।

मेरी करंट हैक

  • C: \ की जड़ पर एक स्टेजिंग क्षेत्र के रूप में एक "n" फ़ोल्डर बनाएं, क्योंकि यह मेरे फ़ोल्डर पथ को छोटा करता है।
  • जो कुछ भी मुझे चाहिए उसके लिए मॉड्यूल स्थापित करने के लिए "n" फ़ोल्डर के अंदर npm चलाएं।
  • Cygwin को आग दें और नोड_modules फ़ोल्डर को एक गंतव्य प्रोजेक्ट में कॉपी करने के लिए cp का उपयोग करें।
  • निर्भरता बदलने या जब मुझे एक नई परियोजना को स्पिन करने की आवश्यकता होती है तो कुल्ला और दोहराएं।

अन्य Unpalatable Workarounds

प्रतीकात्मक लिंक का उपयोग फ़ाइल पथ को छोटा करने के लिए किया जा सकता है, लेकिन ये कुडी हैक्स हैं। जैसे ही npm पारिस्थितिकी तंत्र बढ़ता है, नेस्टेड निर्भरता श्रृंखला बहुत लंबी हो जाएगी और यह वर्कअराउंड अनुपयोगी हो जाएगा।

रूट फ़ोल्डर के Package.json फ़ाइल में सभी आश्रितों को जोड़ने से मेरे द्वारा आए एक धागे का उल्लेख किया गया था। यद्यपि यह दृष्टिकोण फ़ोल्डर संरचना को समतल कर देगा और डुप्लिकेट मॉड्यूल को लोड करने से रोकेगा, यह समाधान अप्राकृतिक लगता है। यह npm की प्रयोज्यता, स्थायित्व और उत्पादकता को भी मारता है, क्योंकि आपको फ़ाइलों और फ़ोल्डरों के साथ फिडेल करना पड़ता है या तो मैन्युअल रूप से या कुछ हैक किए गए स्क्रिप्ट के साथ। दृष्टिकोण भी उसी भाग्य के प्रति संवेदनशील है जो प्रतीकात्मक लिंक दृष्टिकोण अंततः पीड़ित हो सकता है।


मैंने लगभग सोचा कि मैंने इसे हल कर दिया है। मुझे निम्नलिखित 2 फाइलों पर dos2unix उपयोग चलाकर npm के साथ काम करने के लिए Cygwin मिला: npm.cmd और npm
Allan

Windows API पथ सीमाएँ npm को अनुपयोगी बनाती हैं, क्योंकि कुछ npm मॉड्यूल फ़ाइलों को बनाने के लिए Visual Studio का उपयोग करते हैं। जब मैं npm ब्राउज़र-सिंक: C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5) त्रुटि प्राप्त करता हूं तो यह त्रुटि है: MS B3491: "रिलीज़ \ obj \ validation.tlog \ validation.logbuilds tate" फाइल करने के लिए लाइनें न लिखें। निर्दिष्ट पथ, फ़ाइल नाम, या दोनों बहुत लंबे हैं। पूरी तरह से योग्य फ़ाइल नाम 260 से कम वर्णों का होना चाहिए, और निर्देशिका नाम 248 वर्णों से कम होना चाहिए।
एलन मैकलेमोर

मेरे पास विंडोज़ पर एनपीएम से लोड नोड मॉड्यूल प्राप्त करने के लिए "टाफ़ी-पुलिंग" दृष्टिकोण हो सकता है। इसमें निम्नलिखित के कुछ राउंड शामिल हैं: npm इंस्टाल, npm डड्यूप, npm हटना और rm -r नोड_मॉड्यूल्स। ऐसा करने से बार-बार लगता है कि लंबी फ़ाइल पथों को कुछ हद तक बाहर निकाला जा सकता है, लेकिन यह एक तरह से टाफ़ी खींचना है (उदाहरण के लिए जब तक आप काम नहीं करते)। किसी ने इसे संहिताबद्ध किया या इसे और अधिक टर्नकी बनाने के लिए एक स्वचालित उपकरण लिखा?
एलन मैकलमोर ऑक्ट

"हैकी स्क्रिप्ट्स" के बारे में बात करते हुए, मैंने एक लिखा था कि मुझे TERRIBLY hacky नहीं लगता। मैंने मेनेस्ट्रेट नामक एक उपकरण बनाया है जिसका उपयोग आप स्थापना के बाद अपने मॉड्यूल की निर्देशिका संरचना को प्रोग्रामेटिक रूप से समतल करने के लिए कर सकते हैं। आप इसे एक वैश्विक npm पोस्ट स्थापना हुक के रूप में स्थापित कर सकते हैं।
zetlen

2
@yoneal व्यक्तिगत उपयोग के लिए, और जल्दी से शुरू करने के लिए, fenestrate को पुन: आपके नोड_मॉडल फ़ोल्डर पर चलना चाहिए, इसलिए आपको इसे गहरी निर्भरता पर मैन्युअल रूप से चलाने की आवश्यकता नहीं होनी चाहिए। हालांकि, यह उन निर्भरताओं को कांटा करने के लिए बहुत अच्छा होगा - मुझे लगता है कि सरल फ़ेनेस्ट्रेट कॉन्फ़िगरेशन वाले बहुत सारे फ़ॉक्स्ड मॉड्यूल npm अनुरक्षकों को एक शानदार संदेश भेजेंगे।
zetlen

जवाबों:


58

विंडोज पर डीप नेस्टेड फोल्डर की समस्या को ज्यादातर npm वर्जन से शुरू करके हल किया गया है 3.x

Npm के अनुसार:

.npm @ 3 शीर्ष स्तर के नोड_मॉड्यूल्स तक सब कुछ लहराकर "अधिकतम फ्लैट" स्थापित करता है। इसका मतलब है कि घोंसला केवल संघर्षों पर होता है और जैसे, पेड़ों को कभी बहुत गहरा नहीं होना चाहिए। जैसे, विंडोज़ पथ लंबाई सीमा में नहीं चलाया जाना चाहिए।

मैंने अभी-अभी npm स्थापित किया है 3.1.0और इसे एक ऐसे पैकेज पर आज़माया है जो खतरनाक The specified path, file name, or both are too longत्रुटि को फेंक रहा था ।

समस्या दूर हो गई।

आप यहाँ से नवीनतम npm बिल्ड प्राप्त कर सकते हैं: npm रिलीज़


4
मुझे विंडोज मशीन पर npm 3.x अपडेट के साथ एक सफलता भी मिली थी। बेशर्म प्लग: मैंने विंडोज triplet.fi/blog/…
Tx3

21

विंडोज 8.1 और 10 में Win32 पथ सीमा बढ़ाने का एक विकल्प है:

  • ओपन समूह नीति संपादक (प्रेस Windows+ Rऔर प्रकार gpedit.mscऔर हिट Enter)
  • निम्न निर्देशिका पर नेविगेट करें: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • Win32 लंबे पथ विकल्प को सक्षम करें और इसे सक्षम करें पर डबल क्लिक करें

यहाँ छवि विवरण दर्ज करें


विकल्प मेरे लिए उपलब्ध नहीं था, और fwiw, मैंने विन 7 प्रो से अपग्रेड किया ताकि यह एक संभावित कारण हो
इवान मॉरिसन

@EvanMorrison "फ़ाइलसिस्टम \ NTFS \ सक्षम NTFS लंबे पथ" का नाम बदलकर "FileSystem \ सक्षम Win32 लंबे पथ" के रूप में बाद में win10 बनाता है। मैंने भविष्य के संदर्भ के लिए उत्तर को अपडेट किया।
मार्सेलो मेसन

1
Win Server 2012 R2 के लिए कोई भी विचार
sairfan

12

यह समाधान के आसपास का काम है।

कुछ नोड मॉड्यूल हैं जो आपके लिए आपकी निर्भरता को समतल करते हैं।
लिंक यहाँ हैं:

ये मॉड्यूल क्या कर रहे हैं मैन्युअल रूप से भी किया जा सकता है। यह एकमात्र वास्तविक समाधान है जो अब तक मौजूद है, यानी आपके सभी मॉड्यूल एक स्तर पर हैं, एक-दूसरे की आवश्यकता होती है, बजाय इसके कि उनकी निर्भरता की निजी प्रतियां सभी को गहराई से नेस्टेड करें।


10
मैंने फ्लैटन-पैकेज को अच्छी तरह से प्रलेखित और उपयोग करने में आसान पाया।
स्ट्रिपिंगवर्यर

3

एलन -

जीथुब मुद्दे से आप जुड़े,

npm डिफ़ॉल्ट रूप से डिडअप-इन-इंस्टॉल-टाइम जोड़ देगा। यह नोड के मॉड्यूल सिस्टम को बदलने की तुलना में काफी अधिक संभव है, लेकिन यह अभी भी बिल्कुल तुच्छ नहीं है, और इसमें कुछ लंबे समय से उलझे हुए पैटर्न का बहुत अधिक समावेश है।

यह (अंत में) वर्तमान में npm पर काम करता है, नाम से जा रहा है multi-stage-install, और इसके लिए लक्षित है npm@3npmविकास का नेतृत्व फॉरेस्ट नॉरवेल नए साल में विंडोज पर चलने में कुछ समय बिताने जा रहा है, इसलिए कृपया npmमुद्दा ट्रैकर पर विंडोज से संबंधित मुद्दों को बनाएं < https://github.com/npm/npm/issues >


3

मेरे साथ भी वही दिक्कत है। निर्भरता को समतल करना एक पूर्ण समाधान नहीं है, क्योंकि आप एक ही निर्भर मॉड्यूल के विभिन्न संस्करणों पर निर्भर मॉड्यूल का उपयोग कर सकते हैं। मुझे पता चला कि गल्प-रन मॉड्यूल ने सपाट होने के बाद काम करना बंद कर दिया (बिन / .bin निर्देशिकाओं के बारे में मॉड्यूल मान्यताओं से संबंधित, मुझे संदेह है)। Drat!

समस्या के बारे में बहुत चर्चा है, लेकिन दृष्टि में कोई समाधान नहीं है: https://github.com/joyent/node/issues/6960

https://github.com/npm/npm/issues/3697

मेरे लिए काम कर रहा एक वर्कअराउंड मैन्युअल रूप से निर्भरता जोड़ने के लिए है कि मेरी परियोजना को स्पष्ट रूप से आवश्यकता नहीं है।

यदि आप यह पहचानना चाहते हैं कि कौन से पैकेज आपको समस्याएं दे रहे हैं, तो मुझे PathLengthChecker काफी उपयोगी लगा। बस EXE निकालें और GUI या कमांड लाइन ऐप चलाएं। जिस तरह से मैंने समस्या का खुलासा किया है वह विज़ुअल स्टूडियो में बनाने की कोशिश करना है, लेकिन यह बिना यह बताए असफल हो जाता है कि कौन सी निर्देशिका का नाम बहुत लंबा है।

यहां मेरे वर्कअराउंड का कमांड लाइन उदाहरण है:

mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

मुझे वापिस मिला:

26 config-चेन \ readme.markdown

[स्निप - उनमें से 12 थे]

Npm ls कमांड के अनुसार :

└─┬ grunt-bower-task@0.4.0
  ├── async@0.1.22
  ├─┬ bower@1.3.12
  │ ├─┬ update-notifier@0.2.0
  │ │ ├─┬ latest-version@0.2.0
  │ │ │ └─┬ package-json@0.2.0
  │ │ │   └─┬ registry-url@0.1.1
  │ │ │     └─┬ npmconf@2.1.1
  │ │ │       ├─┬ once@1.3.1
  │ │ │       │ └── wrappy@1.0.1

चलो npmconf के साथ चलते हैं - यह सभी ओवर-लंबाई फ़ाइलों के लिए कंटेनर है जो समस्याएं पैदा कर रहे हैं। हमें npmconf 2.1.1 की आवश्यकता है।

npm install --save-dev npmconf@2.1.1
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s)
npm install
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

कोई परिणाम नहीं - सभी फाइलें सीमा के भीतर हैं!

यहाँ स्पष्ट चेतावनी यह है कि यह केवल एक बार पैकेज के अनुसार काम करता है - एक ही मॉड्यूल के विभिन्न संस्करणों पर निर्भरताएं मूल नोड_मॉड्यूल्स स्तर पर स्थापित नहीं की जा सकती हैं क्योंकि नोड निर्देशिका संरचना में संस्करणों के लिए खाता नहीं है।

यह समाधान सही नहीं है, लेकिन यह विंडोज पर नोड के काम करने के मेरे मुख्य लक्ष्यों को हल करता है, और चूंकि पैकेज में सही है। पैकेज, अन्य डेवलपर्स के लिए वर्कअराउंड काम करता है और बिना किसी मैनुअल या ग्लोबल फासिंग के सर्वर का निर्माण करता है।


2

यदि आप इसे विश्व स्तर पर स्थापित करने के साथ ठीक हैं तो यह एक काम के आसपास हो सकता है:

आप उस पथ को समायोजित कर सकते हैं जहां npm वैश्विक मॉड्यूल को कुछ बहुत ही कम स्थापित कर रहा है (आमतौर पर यह है:) c:\users\\{username}\AppData\Roaming\npm\npm_modulesजो पहले से ही बहुत सारे अक्षर लेता है।

इसे यहां देखने के लिए समायोजित करें: Windows में नोड.जेएस मॉड्यूल के लिए डिफ़ॉल्ट वैश्विक स्थापना निर्देशिका बदलें?

यदि आप इसे समायोजित करते हैं, उदाहरण के लिए, c:\n\कुछ मामलों में यह समस्या को हल कर सकता है।


1

यह आखिरकार मेरे लिए क्या तय किया गया है ...

Gulp को स्थापित करने और त्रुटियों को प्राप्त करने के बाद, चलाएँ ... gulp

जब आप किसी पैकेज को विफल होते हुए देखते हैं, तो इसे मैन्युअल रूप से स्थापित करें --no-bin-link

sudo npm install {package} --no-bin-link

जहाँ {पैकेज} वह पैकेज होता है जिसमें समस्याएँ होती हैं।

इस सब के बाद मुझे प्लगइन 'gulp-सूचित' संदेश में एक त्रुटि प्राप्त हो रही थी: संदेश नहीं मिला: सूचना-भेजें।

यह वैग्रंट के साथ एक प्लगइन समस्या के कारण था। आप या तो सूचनाएं बंद कर सकते हैं ..

export DISABLE_NOTIFIER=true;

या वैग्रंट के साथ प्लगइन स्थापित करें ।

बेस्ट ऑफ लक .. मैंने बहुत सारे लोगों की सिफारिशों का पालन करने के बाद भी इस पर लंबा समय बिताया।

ब्रैंडन


0

खिड़कियों में:

  1. अपने विंडोज़ एक्सप्लोरर का उपयोग करते हुए, अपने योनि साझा फ़ोल्डर में नेविगेट करें (मैं वैसे स्कॉचबॉक्स का उपयोग कर रहा हूं) जैसे C:\scotchbox/public/gulpProject
  2. फ़ोल्डर के एड्रेस बार में टाइप करें cmd और दबाएँEnter
  3. अपने gulp स्थापना करें npm install

1
उसी उत्तर को कॉपी-पेस्ट करने से बचें । आपको इसके बजाय डुप्लिकेट के रूप में फ़्लैग करना चाहिए। इसके अतिरिक्त, अपनी पोस्ट में कसम न खाएं।
तुनकी

0

npm install --no-bin-link। आपके पास पूरी तरह से चपटा होगा node_modules

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