विंडोज पर गहरे नोड_मॉडल संरचना के साथ Node.js एप्लिकेशन को कैसे तैनात करें?


91

मैंने एक जिज्ञासु मुद्दे में भाग लिया है - जाहिरा तौर पर कुछ Node.js मॉड्यूल में इतना गहरा फ़ोल्डर पदानुक्रम है कि विंडोज कॉपी कमांड (या पॉवरशेल Copy-Itemहै जो हम वास्तव में उपयोग कर रहे हैं) कुख्यात "पथ बहुत लंबा" त्रुटि को मारता है जब पथ 250 पर होता है लंबे समय तक।

उदाहरण के लिए, यह एक फ़ोल्डर पदानुक्रम है जो एक एकल नोड मॉड्यूल बना सकता है:

node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...

यह पागलपन लगता है लेकिन नोड मॉड्यूल के साथ एक वास्तविकता है।

हमें परिनियोजन के दौरान कॉपी-पेस्ट का उपयोग करने की आवश्यकता होती है (हम हेरोकू जैसे "चतुर" लक्ष्य प्लेटफ़ॉर्म का उपयोग नहीं कर रहे हैं, जहां गिट तैनाती एक विकल्प होगा) और यह विंडोज पर एक गंभीर सीमा है।

क्या कोई npm कमांड या कुछ ऐसा नहीं है जो node_modulesफ़ोल्डर को कॉम्पैक्ट करेगा या शायद केवल वही शामिल हो जो वास्तव में रनटाइम पर आवश्यक हो? (नोड मॉड्यूल्स में आमतौर पर testफोल्डर आदि होते हैं, जिन्हें हमें परिनियोजित करने की आवश्यकता नहीं होती है।) कोई अन्य विचार इसके आस-पास कैसे काम करें? विंडोज का उपयोग नहीं करना दुर्भाग्य से एक विकल्प नहीं है :)


1
क्या आपका प्रोजेक्ट सेट के package.jsonसाथ dependenciesहै? यदि हां, तो क्या आप बिना node_modulesnpm installया updateनिर्भरता के कॉपी कर सकते हैं और उपयोग कर सकते हैं ?
जोनाथन लोनोव्स्की

4
@JonathanLonowski हमारा परिनियोजन वातावरण npm installलक्ष्य वातावरण में निष्पादित करने का समर्थन नहीं करता है, यह स्थानीय रूप से एक "परिनियोजन पैकेज" (मूल रूप से एक ज़िप प्लस कुछ मेटाडेटा) बनाकर काम करता है जिसे तब लक्षित मशीन पर अपलोड किया जाता है, जिसे वहां निकाला जाता है और यह है। इसलिए मुझे node_modulesसीधे शामिल करने की आवश्यकता है ।
बोरिक बर्नार्ड

जवाबों:


24

npm v3 (हाल ही में रिलीज़ किया गया) निर्भरता को कम करके इस मुद्दे को हल करता है .. खंड के तहत https://github.com/npm/npm/releases/tag/v3.0.0 में यहां जारी नोटों की जांच करें flat flat

और इस मुद्दे पर अंतिम टिप्पणी https://github.com/npm/npm/issues/3697


5
अब जारी किए गए नोट्स flat flatदूसरे पृष्ठ में दफन किए गए हैं। यहाँ एक सीधा लिंक है: github.com/npm/npm/releases/tag/v3.0.0
John-Philip

धन्यवाद @ जॉन-फिलिप, नए लिंक के साथ उत्तर को अपडेट किया
रमेशवेल

62

बस इसे जोड़ने के लिए ... एक और चीज जिसने मेरी मदद की वह सभी स्थापित मॉड्यूल को सूचीबद्ध कर रही थी npm ls

जो आपको मॉड्यूल और संस्करणों का एक पेड़ देगा ... वहां से यह पहचानना बहुत आसान है कि कौन से डुप्लिकेट हैं ... npm dedupeमेरे लिए कुछ भी नहीं किया। मुझे यकीन नहीं है कि अगर यह एक बग या क्या है (नोड v 10.16)

तो एक बार जब आप डुप्लिकेट मॉड्यूल की पहचान कर लेते हैं तो इसे मूल नोड_मॉड्यूल डायरेक्टरी में प्रयोग करके स्थापित करते हैं npm install dupemodule@1.2.3 --save-devसंस्करण महत्वपूर्ण है।

उसके बाद, मैंने अपने नोड_मॉड्यूल निर्देशिका को मिटा दिया और एक नया काम किया npm install

लघु संस्करण

  1. npm ls सभी स्थापित मॉड्यूल की सूची प्राप्त करने के लिए।
  2. उन मॉड्यूल को देखें और डुप्लिकेट मॉड्यूल की पहचान करें ( संस्करण महत्वपूर्ण है )
  3. npm install module@version --save-dev रूट n_modules निर्देशिका में उन मॉड्यूल को स्थापित करने और package.json को अद्यतन करने के लिए।
  4. rmdir node_modules नोड_मॉड्यूल निर्देशिका को हटाने के लिए।
  5. npm install अपने आश्रितों की एक नई प्रति खींचने के लिए।

एक बार मैंने ऐसा किया, सब कुछ बहुत साफ था।

मैं यह दिखाने के लिए आपके पैकेज.जॉन फ़ाइल पर टिप्पणी करने की भी सिफारिश करता हूं कि कौन से नोड-डाउन नोड्स के पेड़ को समतल करने के लिए लाया गया था।


यह मेरे लिए बहुत अच्छा काम किया। धन्यवाद! मेरी अज्ञानता को क्षमा करें, लेकिन मॉड्यूल हमेशा शीर्ष स्तर पर स्थापित क्यों नहीं होते हैं?
कालेब

2
@ कालेब शायद इसलिए कि अलग-अलग मॉड्यूल एक ही मॉड्यूल के अलग-अलग संस्करणों पर निर्भर करते हैं, या शायद सिर्फ इसलिए कि जो कुछ भी आवश्यक है उसे प्राप्त करना आसान है, फिर इसे नीचे कर दें ... I dunno।
बेन लेश

7
भले ही, टिप के लिए धन्यवाद। मैंने अभी हमारे प्रोजेक्ट से लगभग 1700 डुप्लिकेट फ़ाइलों को उड़ा दिया। चीजों को हटाना एक डेवलपर होने का मेरा पसंदीदा हिस्सा है! इसके अलावा, किसी को भी पैकेज में टिप्पणियों को जोड़ने के तरीके के बारे में देखने के लिए। यहाँ, आपका जवाब है: stackoverflow.com/questions/14221579/…
कालेब

github.com/joyent/node/issues/6960 नोड व्यक्ति का कहना है कि विंडोज़ प्रथम श्रेणी का नागरिक है। उन्होंने कहा। लेकिन उन्होंने इस मुद्दे को बंद कर दिया और कुछ भी ठीक नहीं किया। भाग्यशाली विंडोज उपयोगकर्ता।
वी

38

मुझे नहीं लगता कि आपकी बाधाओं को देखते हुए कोई बढ़िया समाधान है, लेकिन यहां कुछ चीजें हैं जो मदद कर सकती हैं।

  • npm dedupeअपनी निर्देशिका पदानुक्रम को अनुकूलित करने के लिए उपयोग करने का प्रयास करें जो कुछ रास्तों को छोटा कर सकता है
  • npm install --productionविकास उपकरण के बिना स्थापित करने के लिए उपयोग करें
  • उन गहरी नेस्टेड निर्भरताओं में से कुछ ले लो (बस समस्या से बचने के लिए पर्याप्त है, मैं सुझाव देता हूं) और उन्हें शीर्ष-स्तर नोड_मॉड्यूल्स निर्देशिका में स्थानांतरित कर देता हूं। बस उन पर नज़र रखें ताकि आप जान सकें कि आपकी सच्ची निर्भरताएँ कौन सी हैं और इस समस्या के लिए कौन से समाधान हैं।
  • या उनमें से कुछ गहरी निर्भरता को उच्चतम node_modulesनिर्देशिका में ले जाएं, जिसके तहत your_project/node_modules/pkg_with_deep_depsउन्हें कम पर्याप्त पथ मिलेंगे लेकिन फिर भी काम करेंगे। तो यह होगा your_project/node_modules/pkg_with_deep_deps/node_modules
    • मुझे लगता है कि requireचलाने के समय में उन लोगों को खोजने में सक्षम होना चाहिए। आपको बस स्पष्ट रूप से दस्तावेज़ करने की आवश्यकता होगी कि आपने मैन्युअल रूप से क्या बदल दिया है, आपने इसे क्यों किया है, और अपनी स्वयं की सच्ची निर्भरता को सही ढंग से प्रस्तुत किया हैpackage.json

इस मुद्दे पर विस्तार से चर्चा करने वाले एक गितुब मुद्दे पर चर्चा की जा रही है।


इंगित करने के लिए धन्यवाद dedupe(इसके बारे में बिल्कुल नहीं पता था) और --production( npm install -hयह विकल्प नहीं दिखाया)! जिप संग्रह का उपयोग करना दुर्भाग्य से एक विकल्प नहीं है, ऊपर एक टिप्पणी देखें।
बोरक बर्नार्ड

9
एनपीएम घटा केवल "सामान्य" मॉड्यूल को पदानुक्रम में सबसे कम स्थान पर समतल करेगा। बहुत अच्छा नहीं। एक उचित समाधान पूरे पदानुक्रम को "सपाट बल" करने की अनुमति देगा और संभवतः परीक्षण / डॉक्टर निर्देशिकाओं को अनदेखा करने की अनुमति देगा। एक विकल्प टार फ़ाइल से सीधे रीडिंग मॉड्यूल का समर्थन करने के लिए नोड के लिए होगा।
MMind

3
सहमत, पैकेजों के "बाइनरी" वितरण के कुछ प्रकार (जिप, टारबॉल, जो भी हो) बहुत उपयोगी होंगे।
बोरेक बर्नार्ड

11

मैंने "npm-flatten" नाम का एक नोड मॉड्यूल लिखा है जो यहां आपके लिए आपकी निर्भरता को समतल करता है: https://www.npmjs.org/package/npm-flatten

यदि आप एक व्याकुलता की तलाश कर रहे हैं, तो मैंने एक NuGet पैकेज भी लिखा है जो आपके .NET प्रोजेक्ट के साथ एक पूर्ण नोड.js वातावरण को यहां एकीकृत करेगा: http://www.nuget.org/packages/NodeEnv/

प्रतिक्रिया का स्वागत किया जाएगा।


यह हमारे लिए काम किया। जब हम सबसे पहले nmp dedup चलाते थे तो हमारे पास और भी बेहतर परिणाम होते थे।
शॉन रोवन

1

कुछ ऐसा जिससे मुझे अपने Node.js फ़ोल्डर में एक स्थानीय ड्राइव को मैप करने में मदद मिली:

शुद्ध उपयोग n: \ computername \ c $ \ users \ myname \ दस्तावेज \ नोड। js / लगातार: हाँ

पहले: c: \ users \ myname \ दस्तावेज \ नोड .js \ projectname (45 वर्ण) के बाद: n: \ projectname (14 वर्ण जो 31 वर्ण कम है)

कई मामलों में यह कुछ मॉड्यूल स्थापित करने की अनुमति देता है।

मैं कहूंगा कि मैंने आज ही इस समस्या का फिर से पता लगाया जब मैं अपने सभी कोड को USB ड्राइव पर बैकअप देने का प्रयास कर रहा था।

"C: \ Users \ myname \ दस्तावेज़ \ Node.js \ कोणीय phonecat \ node_modules \ कर्म \ node_modules \ वार्डर \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-कैश \ node_modules \ बेंचमार्क \ node_modules \ फ़ाइल-रीडर \ नोड_मॉडल \ विस्तार-उथले \ बेंचमार्क \ जुड़नार बहुत लंबा है। "

यहां तक ​​कि जब मैंने उन्हें N: ड्राइव लेटर का उपयोग करके उन्हें वापस करने की कोशिश की, तो यह अभी भी पथ की लंबाई के कारण कुछ मामलों में विफल रहा, लेकिन यह ऊपर वाले को ठीक करने के लिए पर्याप्त था।


1

1) रिलीज़ बिल्ड के दौरान, आप इन फ़ाइलों / फ़ोल्डर को एक छिपे हुए फ़ोल्डर के रूप में फ़ोल्डर गुणों को सेट करके दृश्य स्टूडियो को रोक सकते हैं (बस इसे नोड_मॉड्यूल्स पर सेट करें)। संदर्भ: http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) आप CsProject फ़ाइल में XML नोड का पालन करके पैकेजिंग के दौरान प्रकाशित फ़ाइलों या फ़ोल्डर को बाहर कर सकते हैं।

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <OutputPath>bin\</OutputPath>
   <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
  <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>

1

मुझे Microsoft Node.js दिशानिर्देशों से एक समाधान मिला ।

  • एक छोटे पथ में प्रारंभ करें (जैसे c: \ src)
  • > npm install -g rimraf इससे अधिक की फ़ाइलें हटाएं max_path
  • > npm dedupe डुप्लिकेट पैकेज को शीर्ष-स्तर पर ले जाता है
  • > npm install -g flatten-packages सभी पैकेजों को शीर्ष-स्तर पर ले जाता है, लेकिन संस्करण समस्याओं का कारण बन सकता है
  • अपग्रेड करें npm@3जिससे node_modulesफ़ोल्डर को हाइरार्की अधिकतम रूप से सपाट बनाने का प्रयास किया जाता है ।
    • नोड्स v5 के साथ जहाजों
    • या ... > npm install –g npm-windows-upgrade

0

यह एक उचित समाधान नहीं है, बल्कि जब आप जल्दी में होते हैं, तो एक काम करते हैं, लेकिन आप अपने फ़ोल्डर को ज़िप करने के लिए 7-ज़िप का उपयोग कर सकते हैं , ज़िपित फ़ाइल को स्थानांतरित कर सकते हैं और इसे बिना किसी समस्या के खोल सकते हैं।

हमने Node.js एप्लिकेशन को परिनियोजित करने के लिए उस समाधान का उपयोग किया, जहां एक साफ npm इंस्टॉल करना संभव नहीं था।


हां। यह वही है जो मुझे हर बार मुझे मानस स्थापित करने की आवश्यकता होती है। इसमें मूल कोड मिला है और मुझे Visual Studio के कई / नए संस्करण = असफल मिले हैं। मैं सिर्फ वी.एस. खोल सकता था, प्रत्येक असफल .sln फ़ाइल में ला सकता था और उसका पुनर्निर्माण कर सकता था। लेकिन यह सिर्फ XCOPY के लिए आवश्यक (कोर्स के संस्करणों को देखने) के रूप में मेरे पूरे node_modules \ mongoose फ़ोल्डरसेट पर आसान है।
माइकल ब्लेंकशिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.