จะปรับใช้แอปพลิเคชัน Node.js ด้วยโครงสร้าง deep node_modules บน Windows ได้อย่างไร


91

ฉันพบปัญหาที่น่าสงสัย - เห็นได้ชัดว่าโมดูล Node.js บางโมดูลมีลำดับชั้นของโฟลเดอร์ที่ลึกมากจนคำสั่งคัดลอกของ Windows (หรือ PowerShell 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\...

ดูเหมือนว่าบ้า แต่เป็นความจริงกับโมดูลโหนด

เราจำเป็นต้องใช้การคัดลอกวางระหว่างการปรับใช้ (เราไม่ได้ใช้แพลตฟอร์มเป้าหมายที่ "ฉลาด" เช่น Heroku ซึ่งการปรับใช้ Git จะเป็นตัวเลือก) และนี่เป็นข้อ จำกัด ที่ร้ายแรงใน Windows

ไม่มีคำสั่ง npm หรือสิ่งที่จะบีบอัดnode_modulesโฟลเดอร์หรืออาจรวมเฉพาะสิ่งที่จำเป็นจริง ๆ ในรันไทม์? (โมดูลโหนดมักจะมีtestโฟลเดอร์ ฯลฯ ซึ่งเราไม่จำเป็นต้องปรับใช้) มีแนวคิดอื่น ๆ ในการแก้ไขอย่างไร การไม่ใช้ Windows ไม่ใช่ตัวเลือกที่น่าเสียดาย :)


1
โครงการของคุณมีpackage.jsonพร้อมdependenciesชุดหรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถคัดลอกโดยไม่node_modulesใช้และใช้ npm to installหรือupdateการอ้างอิงได้หรือไม่?
Jonathan Lonowski

4
@JonathanLonowski สภาพแวดล้อมการปรับใช้ของเราไม่สนับสนุนการดำเนินการnpm installในสภาพแวดล้อมเป้าหมายมันทำงานโดยการสร้าง "แพ็คเกจการปรับใช้" ในเครื่อง (โดยทั่วไปคือ ZIP บวกข้อมูลเมตาบางส่วน) ซึ่งจะถูกอัปโหลดไปยังเครื่องเป้าหมายโดยแยกออกจากที่นั่น ดังนั้นฉันต้องรวมnode_modulesโดยตรง
Borek Bernard

คำตอบ:


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

ขอบคุณ @ John-Philip อัปเดตคำตอบพร้อมลิงก์ใหม่
RameshVel

62

เพียงเพื่อเพิ่มนี้ ... npm lsเป็นอีกสิ่งหนึ่งที่ช่วยให้ฉันได้รับรายชื่อออกจากโมดูลที่ติดตั้งทั้งหมดด้วย

ซึ่งจะให้โครงสร้างโมดูลและเวอร์ชันแก่คุณ ... จากที่นั่นมันค่อนข้างง่ายที่จะระบุว่าอันไหนซ้ำกัน ... npm dedupeไม่ได้ทำอะไรให้ฉันเลย ฉันไม่แน่ใจว่านั่นคือบั๊กหรืออะไร (Node v 10.16)

ดังนั้นเมื่อคุณระบุโมดูลที่ซ้ำกันให้ติดตั้งลงในไดเร็กทอรี root node_module โดยใช้npm install dupemodule@1.2.3 --save-dev. เวอร์ชันมีความสำคัญ

หลังจากนั้นฉันล้างไดเรกทอรี node_modules ของฉันและทำไฟล์npm install.

เวอร์ชั่นสั้น

  1. npm ls เพื่อรับรายชื่อโมดูลที่ติดตั้งทั้งหมด
  2. ดูโมดูลเหล่านั้นและระบุโมดูลที่ซ้ำกัน ( เวอร์ชันมีความสำคัญ )
  3. npm install module@version --save-dev เพื่อติดตั้งโมดูลเหล่านั้นในไดเร็กทอรี root node_modules และอัพเดต package.json
  4. rmdir node_modules เพื่อลบไดเร็กทอรี node_modules
  5. npm install เพื่อดึงสำเนาการอ้างอิงของคุณใหม่

เมื่อฉันทำอย่างนั้นทุกอย่างก็สะอาดขึ้นมาก

ฉันขอแนะนำให้แสดงความคิดเห็นไฟล์ package.json ของคุณเพื่อแสดงว่าไฟล์ใดถูกนำมาลงเพื่อทำให้โครงสร้าง node_modules แบน


สิ่งนี้ได้ผลดีสำหรับฉัน ขอบคุณ! ยกโทษให้กับความไม่รู้ของฉัน แต่เหตุใดจึงไม่ติดตั้งโมดูลที่ระดับบนสุดเสมอไป?
Caleb

2
@Caleb อาจเป็นเพราะโมดูลที่แตกต่างกันขึ้นอยู่กับเวอร์ชันที่แตกต่างกันของโมดูลเดียวกันหรืออาจเป็นเพียงเพราะมันง่ายกว่าที่จะได้รับสิ่งที่ต้องการจากนั้นแยกมันออก ... ฉันไม่รู้
Ben Lesh

7
ขอบคุณสำหรับเคล็ดลับ ฉันเพิ่งกำจัดไฟล์ที่ซ้ำกันประมาณ 1,700 ไฟล์จากโครงการของเรา การลบสิ่งต่างๆเป็นส่วนที่ฉันชอบที่สุดในการเป็นนักพัฒนา! นอกจากนี้สำหรับใครก็ตามที่กำลังมองหาวิธีเพิ่มความคิดเห็นใน package.json นี่คือคำตอบของคุณ: stackoverflow.com/questions/14221579/…
Caleb

github.com/joyent/node/issues/6960 node guy กล่าวว่า Windows เป็นพลเมืองชั้นหนึ่ง พวกเขาพูดว่า. แต่พวกเขาปิดปัญหาและไม่มีอะไรแก้ไข ผู้ใช้ Windows ที่โชคดี
vee

38

ฉันไม่คิดว่าจะมีวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับข้อ จำกัด ของคุณ แต่นี่คือบางสิ่งที่อาจช่วยได้

  • ลองใช้npm dedupeเพื่อปรับลำดับชั้นไดเร็กทอรีของคุณให้เหมาะสมซึ่งอาจทำให้บางเส้นทางสั้นลง
  • ใช้npm install --productionติดตั้งโดยไม่ต้องใช้เครื่องมือในการพัฒนา
  • ใช้การอ้างอิงที่ซ้อนกันอย่างลึกซึ้ง (เพียงพอที่จะหลีกเลี่ยงปัญหาฉันแนะนำ) และย้ายไปที่ไดเร็กทอรี node_modules ระดับบนสุด เพียงติดตามสิ่งเหล่านี้เพื่อให้คุณรู้ว่าสิ่งใดคือการอ้างอิงที่แท้จริงของคุณและข้อใดเป็นวิธีแก้ปัญหาสำหรับปัญหานี้
  • หรือย้ายการอ้างอิงในระดับลึกบางส่วนไปยังnode_modulesไดเร็กทอรีสูงสุดyour_project/node_modules/pkg_with_deep_depsซึ่งจะทำให้มีพา ธ ที่สั้นพอ แต่ยังใช้งานได้ ก็จะเป็นyour_project/node_modules/pkg_with_deep_deps/node_modulesอย่างนี้
    • ฉันคิดว่าrequireควรจะสามารถค้นหาสิ่งเหล่านั้นได้อย่างเหมาะสมในเวลาทำงาน คุณเพียงแค่ต้องบันทึกสิ่งที่คุณเปลี่ยนแปลงด้วยตนเองอย่างชัดเจนเหตุใดคุณจึงทำและเก็บการอ้างอิงที่แท้จริงของคุณไว้อย่างถูกต้องในpackage.json

นี่คือการอภิปรายปัญหา githubที่อธิบายรายละเอียดเกี่ยวกับปัญหานี้โดยละเอียด


ขอบคุณที่ชี้แจ้งdedupe(ไม่รู้เรื่องเลย) และ--production( npm install -hไม่ได้แสดงตัวเลือกนี้)! การใช้ไฟล์ ZIP ไม่ใช่ตัวเลือกโปรดดูความคิดเห็นด้านบน
Borek Bernard

9
npm dedupe จะทำให้โมดูล "ทั่วไป" แบนลงไปยังตำแหน่งทั่วไปที่ต่ำที่สุดในลำดับชั้นเท่านั้น ไม่ดีพอ. วิธีแก้ปัญหาที่เหมาะสมจะอนุญาตให้ "บังคับแบน" ลำดับชั้นทั้งหมดและอาจอนุญาตให้ละเว้นไดเร็กทอรี test / doc อีกทางเลือกหนึ่งสำหรับโหนดที่สนับสนุนการอ่านโมดูลโดยตรงจากไฟล์ tar
MMind

3
ตกลงกันว่าการกระจายแพ็กเกจ "ไบนารี" บางประเภท (ZIP, tarball, อะไรก็ได้) จะมีประโยชน์มาก
Borek Bernard

11

ฉันเขียนโมดูลโหนดชื่อ "npm-flatten" ที่แบนการอ้างอิงของคุณที่นี่: https://www.npmjs.org/package/npm-flatten

หากคุณกำลังมองหา distrubtion ฉันยังเขียนแพ็คเกจ NuGet ที่จะรวมสภาพแวดล้อม node.js ที่สมบูรณ์เข้ากับโปรเจ็กต์. NET ของคุณที่นี่: http://www.nuget.org/packages/NodeEnv/

ข้อเสนอแนะจะยินดีต้อนรับ


สิ่งนี้ได้ผลสำหรับเรา เรามีผลลัพธ์ที่ดียิ่งขึ้นเมื่อเรารัน nmp dedup ก่อน
Shaun Rowan

1

สิ่งที่ช่วยฉันคือการแมปไดรฟ์ในเครื่องกับโฟลเดอร์ Node.js ของฉัน:

net use n: \ computername \ c $ \ users \ myname \ documents \ node.js / persistent: ใช่

ก่อนหน้า: c: \ users \ myname \ documents \ node.js \ projectname (45 ตัวอักษร) หลัง: n: \ projectname (14 ตัวอักษรซึ่งน้อยกว่า 31 ตัวอักษร)

ในหลายกรณีสิ่งนี้อนุญาตให้ติดตั้งโมดูลบางโมดูลได้

ฉันจะบอกว่าฉันเพิ่งค้นพบปัญหานี้อีกครั้งในวันนี้เมื่อฉันพยายามสำรองรหัสทั้งหมดของฉันไปยังไดรฟ์ USB

"C: \ Users \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ กรรม \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node_modules \ file-reader \ node_modules \ expand-ตื้น \ benchmark \ fixtures ยาวเกินไป "

แม้ว่าฉันจะพยายามสำรองข้อมูลโดยใช้อักษรระบุไดรฟ์ N: แต่ก็ยังล้มเหลวในบางกรณีเนื่องจากความยาวเส้นทาง แต่ก็เพียงพอที่จะแก้ไขปัญหาด้านบน


1

1) ในระหว่างการสร้างรุ่นคุณสามารถป้องกัน Visual studio สแกนไฟล์ / โฟลเดอร์เหล่านี้ได้โดยตั้งค่าคุณสมบัติของโฟลเดอร์เป็นโฟลเดอร์ที่ซ่อนอยู่ (เพียงแค่ตั้งค่าเป็น node_modules) อ้างอิง: http://issues.umbraco.org/issue/U4-6219#comment=67-19103

2) คุณสามารถแยกไฟล์หรือโฟลเดอร์ที่เผยแพร่ระหว่างแพ็กเกจได้โดยรวมโหนด XML ต่อไปนี้ในไฟล์ CsProject

<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

ผมพบว่าวิธีการแก้ปัญหาจากหลักเกณฑ์ของไมโครซอฟท์ Node.js

  • เริ่มต้นในเส้นทางสั้น ๆ (เช่น c: \ src)
  • > npm install -g rimraf ลบไฟล์ที่เกิน max_path
  • > npm dedupe ย้ายแพ็กเกจที่ซ้ำกันไปยังระดับบนสุด
  • > npm install -g flatten-packages ย้ายแพ็คเกจทั้งหมดไปที่ระดับบนสุด แต่อาจทำให้เกิดปัญหาการกำหนดเวอร์ชัน
  • อัปเกรดnpm@3ซึ่งพยายามทำให้node_modulesโฟลเดอร์ heirarchy แบนสูงสุด
    • จัดส่งพร้อมโหนด v5.0
    • หรือ… > npm install –g npm-windows-upgrade

0

นี่ไม่ใช่วิธีแก้ปัญหาที่เหมาะสมแทนที่จะเป็นวิธีแก้ปัญหาเมื่อคุณรีบร้อน แต่คุณสามารถใช้7-Zipเพื่อ zip โฟลเดอร์ของคุณย้ายไฟล์ซิปและคลายซิปโดยไม่มีปัญหาใด ๆ

เราใช้โซลูชันดังกล่าวเพื่อปรับใช้แอปพลิเคชัน Node.js ซึ่งไม่สามารถทำการติดตั้ง npm ทั้งหมดได้


ใช่. นี่คือสิ่งที่ทำทุกครั้งที่ต้องติดตั้งพังพอน มีโค้ดเนทีฟอยู่ในนั้นและฉันมี Visual Studio = fail หลายเวอร์ชัน / ใหม่กว่า ฉันสามารถเปิด VS นำไฟล์. sln ที่ล้มเหลวแต่ละไฟล์มาสร้างใหม่ แต่มันง่ายกว่าที่จะเพียงแค่ XCOPY บนชุดโฟลเดอร์ node_modules \ mongoose ทั้งหมดของฉันเท่าที่จำเป็น (ดูเวอร์ชันแน่นอน)
Michael Blankenship
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.