พา ธ ไฟล์ Node npm windows ยาวเกินไปที่จะติดตั้งแพ็กเกจ


89

สถานการณ์

ฉันต้องการใช้อึกและห่วงโซ่เครื่องมือส่วนหน้าที่เกี่ยวข้องในสภาพแวดล้อมการพัฒนาที่โฮสต์บน Windows ฉันกำลังชนกำแพงพยายามใช้ปลั๊กอินอึกเช่น Browser-Sync เนื่องจากโฟลเดอร์ node_modules แฟน ๆ ทำให้เส้นทางไฟล์ windows ยาวเกินไปที่จะคัดลอกไฟล์ ฉันต้องการแนวทางปฏิบัติในการจัดการปัญหานี้ใน Windows ตอนนี้โดยไม่คำนึงถึงสิ่งที่ชุมชน Node อาจมีหรือไม่มีเพื่อปรับปรุงการใช้งาน npm บน Windows ในอนาคต

2 คำถาม

  1. มีเวิร์กโฟลว์ npm สำหรับ Windows ที่ทำงานตามที่ตั้งใจไว้หรือไม่ "เรียกใช้คำสั่งและไฟล์ติดตั้ง" (เช่นเทียบได้กับ npm บน OSX, npm บน Linux, ทับทิมหรือแม้แต่ nuget) ฉันไม่ต้องการเล่นกับการแก้ไขไฟล์ด้วยตนเองจำนวนมาก symlinks ฯลฯ ทุกครั้งที่ฉันใช้ npm บน Windows

  2. มีเวิร์กโฟลว์ Cygwin ที่ได้รับการจัดทำเป็นเอกสารอย่างดีและมีเสถียรภาพสำหรับการเรียกใช้งาน npm และโหนดเพื่อแก้ปัญหาขีด จำกัด เส้นทางไฟล์ Windows API

รายละเอียด Gory ตามรายการด้านล่าง ...

ปัญหาทั่วไป

  • การรันการติดตั้ง npm จากพรอมต์คำสั่งมาตรฐานของ Windows ล้มเหลวในลำดับชั้น node_modules ที่ซ้อนกันอย่างลึกซึ้ง
  • ตามเธรด repo github ของ Joyent นี่เป็นปัญหาที่ได้รับการยอมรับโดยไม่มีวิธีแก้ปัญหาที่น่าพอใจสำหรับนักพัฒนาในสภาพแวดล้อมที่ใช้ Windows เป็นศูนย์กลาง ( จริงเหรอ? )
  • NT Kernel รองรับพา ธ ไฟล์ที่มีความยาวสูงสุด 32,767 ตัวอักษร
  • MAXPATH ของ Windows API จำกัด ไว้ที่ 260 อักขระ
  • Windows API จัดการการทำงานของไฟล์สำหรับเชลล์ Windows ที่สำคัญทั้งหมดและสิ่งที่ไม่รวมถึง: Explorer, CMD, Powershell, MYSgit bash และอื่น ๆ ( MS จริงๆแล้ว NTFS อยู่มานานแค่ไหน? )
  • Cygwin รองรับเส้นทางไฟล์ที่ยาว แต่ npm.cmd ไม่สามารถใช้งานได้ทันทีเนื่องจากการจัดรูปแบบ crlf ฉันลองแปลง DOS2Unix บน npm เพื่อให้มันทำงานกับ Cygwin แต่ดูเหมือนจะมีปัญหาอื่น ๆ ในเรื่องนี้

การแฮ็กปัจจุบันของฉัน

  • สร้างโฟลเดอร์ "n" เป็นพื้นที่จัดเตรียมบนรูทของ C: \ เนื่องจากจะทำให้เส้นทางโฟลเดอร์ของฉันสั้นลง
  • เรียกใช้ npm ภายในโฟลเดอร์ "n" เพื่อติดตั้งโมดูลสำหรับสิ่งที่ฉันต้องการ
  • เปิด Cygwin และใช้ cp เพื่อคัดลอกโฟลเดอร์ node_modules ไปยังโปรเจ็กต์ปลายทาง
  • ล้างและทำซ้ำเมื่อการอ้างอิงเปลี่ยนไปหรือเมื่อฉันต้องการหมุนโปรเจ็กต์ใหม่

วิธีแก้ปัญหาอื่น ๆ ที่ไม่อร่อย

Symbolic Linksสามารถใช้เพื่อทำให้เส้นทางไฟล์สั้นลง แต่สิ่งเหล่านี้เป็นการแฮ็ก kludgy เมื่อระบบนิเวศของ npm เติบโตขึ้นห่วงโซ่การพึ่งพาที่ซ้อนกันจะยาวเกินไปและวิธีแก้ปัญหานี้จะใช้ไม่ได้

การเพิ่มการพึ่งพาทั้งหมดลงในไฟล์package.json ของโฟลเดอร์รูทถูกกล่าวถึงในเธรดเดียวที่ฉันเจอ แม้ว่าวิธีนี้จะทำให้โครงสร้างโฟลเดอร์แบนราบและป้องกันการโหลดโมดูลที่ซ้ำกัน แต่วิธีแก้ปัญหานี้ให้ความรู้สึกไม่เป็นธรรมชาติ นอกจากนี้ยังฆ่าความสามารถในการใช้งานความทนทานและประสิทธิภาพการทำงานของ npm เนื่องจากคุณต้องใช้ไฟล์และโฟลเดอร์หลังการติดตั้งด้วยตนเองหรือด้วยสคริปต์แฮ็ก แนวทางนี้ยังเสี่ยงต่อชะตากรรมเดียวกันกับที่ Symbolic Links เข้าใกล้ในที่สุด


ฉันเกือบจะคิดว่าฉันได้รับการแก้ไขแล้ว ฉันให้ Cygwin ทำงานกับ npm โดยเรียกใช้ dos2unix util ใน 2 ไฟล์ต่อไปนี้: npm.cmd และ npm
Allan McLemore

ข้อ จำกัด เส้นทาง Windows API ทำให้ npm ใช้ไม่ได้เนื่องจากโมดูล npm บางโมดูลใช้ Visual Studio เพื่อสร้างไฟล์ นี่คือข้อผิดพลาดที่ฉันได้รับเมื่อฉัน npm Browser-Sync: C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5): ข้อผิดพลาด MS B3491: ทำได้ อย่าเขียนบรรทัดลงในไฟล์ "Release \ obj \ validation \ validation.tlog \ validation.lastbuilds tate" พา ธ ชื่อไฟล์หรือทั้งสองอย่างที่ระบุยาวเกินไป ชื่อไฟล์แบบเต็มต้องมีความยาวน้อยกว่า 260 อักขระและชื่อไดเร็กทอรีต้องน้อยกว่า 248 อักขระ
Allan McLemore

ฉันอาจมีวิธี "ดึงทอฟฟี่" เพื่อรับโมดูลโหนดที่โหลดด้วย npm บน windows มันเกี่ยวข้องกับสองสามรอบต่อไปนี้: การติดตั้ง npm, npm dedupe, การหดตัวของ npm และ rm -r node_modules การทำเช่นนี้ซ้ำ ๆ ดูเหมือนจะเป็นการดึงเส้นทางไฟล์ที่ยาวออกไปในระดับหนึ่ง แต่ก็เหมือนกับการดึงทอฟฟี่ (เช่นอย่าทำจนกว่าคุณจะทำเสร็จ) ใครเขียนโค้ดนี้หรือเขียนเครื่องมืออัตโนมัติเพื่อทำให้สิ่งนี้ครบวงจรมากขึ้น?
Allan McLemore

เมื่อพูดถึง "สคริปต์แฮ็ก" ฉันได้เขียนสิ่งที่ฉันไม่คิดว่าจะแฮ็คน่ากลัว ฉันได้สร้างเครื่องมือที่เรียกว่าfenestrateซึ่งคุณสามารถใช้เพื่อทำให้โครงสร้างไดเร็กทอรีของโมดูลของคุณแบนลงโดยทางโปรแกรมหลังการติดตั้ง คุณสามารถติดตั้งเป็น global npm postinstall hook
zetlen

2
@yoneal สำหรับการใช้งานส่วนตัวและเพื่อการเริ่มต้นอย่างรวดเร็ว fenestrate ควรเดินโฟลเดอร์ node_modules ของคุณซ้ำดังนั้นคุณไม่จำเป็นต้องเรียกใช้ด้วยตนเองในการอ้างอิงแบบลึก อย่างไรก็ตามมันจะเป็นการดีที่จะแยกการอ้างอิงเหล่านั้น - ฉันคิดว่าโมดูลที่แยกส่วนจำนวนมากที่มีการกำหนดค่า fenestrate อย่างง่ายจะส่งข้อความที่ดีไปยังผู้ดูแล npm
zetlen

คำตอบ:


58

ปัญหากับโฟลเดอร์ที่ซ้อนกันอย่างลึกซึ้งใน Windows 3.xได้รับการแก้ไขส่วนใหญ่เริ่มต้นด้วยรุ่น

ตาม npm:

.npm @ 3 ทำให้การติดตั้ง "แบนสูงสุด" โดยยกทุกอย่างที่ทำได้ไปยัง node_modules ระดับบนสุด ซึ่งหมายความว่าการทำรังเกิดขึ้นเฉพาะในความขัดแย้งและด้วยเหตุนี้ต้นไม้จึงไม่ควรลึกมาก ดังนั้นจึงไม่ควรใช้ข้อจำกัดความยาวของ windows path

ฉันเพิ่งติดตั้ง npm 3.1.0และลองใช้กับแพ็คเกจที่ทำให้เกิดThe specified path, file name, or both are too longข้อผิดพลาดที่น่ากลัว

ปัญหาก็หมดไป

คุณสามารถรับการสร้าง npm ล่าสุดได้จากที่นี่: รุ่น npm


4
ฉันประสบความสำเร็จด้วยการอัปเดต npm 3.x บนเครื่อง Windows ปลั๊กไร้ยางอาย: ฉันเขียนบทความเกี่ยวกับ npm 3 บน Windows triplet.fi/blog/…
Tx3

22

Windows 8.1 และ 10 มีตัวเลือกในการเพิ่มขีด จำกัด เส้นทาง Win32:

  • เปิดตัวแก้ไขนโยบายกลุ่ม (กดWindows+ Rและพิมพ์gpedit.mscและกดEnter)
  • ไปที่ไดเร็กทอรีต่อไปนี้: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • ดับเบิลคลิกที่เปิดใช้งานตัวเลือกเส้นทางยาว Win32และเปิดใช้งาน

ป้อนคำอธิบายภาพที่นี่


ตัวเลือกไม่พร้อมใช้งานสำหรับฉันและ fwiw ฉันอัปเกรดจาก win 7 pro ดังนั้นนั่นจึงเป็นสาเหตุที่เป็นไปได้
Evan Morrison

@EvanMorrison "Filesystem \ NTFS \ Enable NTFS long paths" ถูกเปลี่ยนชื่อเป็น "FileSystem \ Enable Win32 long paths" ในการสร้าง win10 ในภายหลัง ฉันอัปเดตคำตอบเพื่อใช้อ้างอิงในอนาคต
Marcelo Mason

1
ความคิดใด ๆ สำหรับ Win Server 2012 R2
sairfan

12

นี่คือวิธีแก้ปัญหา

มีโมดูลโหนดบางโมดูลที่ทำให้การอ้างอิงของคุณแบนราบสำหรับคุณ
ลิงค์อยู่ที่นี่:

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


10
ฉันพบว่าแพ็กเกจแบบเรียบมีการจัดทำเอกสารอย่างดีและใช้งานง่าย
StriplingWarrior

3

อัลลัน -

จากปัญหา github ที่คุณเชื่อมโยง

npm จะเพิ่ม dedupe-at-install-time ตามค่าเริ่มต้น สิ่งนี้มีความเป็นไปได้มากกว่าระบบโมดูลของ Node ที่เปลี่ยนไปอย่างมาก แต่ก็ยังไม่สำคัญเท่าไหร่นักและเกี่ยวข้องกับการทำซ้ำรูปแบบที่ยึดติดกันเป็นเวลานาน

นี่คือ (สุดท้าย) ขณะนี้อยู่ในผลงานที่ NPM ที่ไปโดยชื่อและมีการกำหนดเป้าหมายสำหรับ multi-stage-install หัวหน้าฝ่ายพัฒนา Forrest Norvell กำลังจะใช้เวลาในการทำงานบน Windows ในช่วงปีใหม่ดังนั้นโปรดสร้างปัญหาที่เกี่ยวข้องกับ Windows ในตัวติดตามปัญหา < https://github.com/npm/npm/issues >npm@3npmnpm


3

ฉันมีปัญหาเดียวกัน การทำให้การอ้างอิงแบนราบไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์เนื่องจากคุณอาจใช้โมดูลที่ขึ้นอยู่กับโมดูลที่อ้างอิงเดียวกันในเวอร์ชันต่างๆ ฉันค้นพบว่าโมดูลการรันอึกหยุดทำงานหลังจากการแบน (เกี่ยวข้องกับข้อสันนิษฐานของโมดูลเกี่ยวกับไดเร็กทอรี bin / .bin ฉันสงสัย) ดรัท!

มีการอภิปรายเกี่ยวกับปัญหามากมาย แต่ไม่มีทางแก้ไข: https://github.com/joyent/node/issues/6960

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

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

หากคุณต้องการระบุว่าแพ็คเกจใดที่ทำให้คุณมีปัญหาฉันพบว่าPathLengthCheckerมีประโยชน์มาก เพียงแค่แยก EXE และเรียกใช้ GUI หรือแอพบรรทัดคำสั่ง อีกวิธีหนึ่งที่ฉันพบปัญหาคือพยายามสร้างใน Visual Studio แต่ล้มเหลวโดยไม่บอกคุณว่าชื่อไดเรกทอรีใดยาวเกินไป

นี่คือตัวอย่างบรรทัดคำสั่งของวิธีแก้ปัญหาของฉัน:

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

ฉันกลับมา:

261: C: \ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ Registry-url \ node_modules \ npmconf config-chain \ readme.markdown

[snip - มี 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

ไม่มีผลลัพธ์ - ไฟล์ทั้งหมดอยู่ในขีด จำกัด !

ข้อแม้ที่ชัดเจนในที่นี้คือใช้งานได้เพียงครั้งเดียวต่อแพ็กเกจ - ไม่สามารถติดตั้งการพึ่งพาเวอร์ชันต่างๆของโมดูลเดียวกันที่ระดับ root node_modules เนื่องจากโหนดไม่ได้ระบุเวอร์ชันในโครงสร้างไดเร็กทอรี

วิธีแก้ปัญหานี้ไม่สมบูรณ์แบบ แต่ช่วยแก้เป้าหมายหลักของฉันในการให้โหนดทำงานบน Windows และเนื่องจากความละเอียดอยู่ใน package.json วิธีแก้ปัญหานี้จึงใช้ได้กับนักพัฒนารายอื่นและสร้างเซิร์ฟเวอร์โดยไม่ต้องใช้งานด้วยตนเองหรือทั่วโลก


2

หากคุณพอใจกับการติดตั้งทั่วโลกนี่อาจเป็นวิธีแก้ปัญหา:

คุณสามารถปรับเส้นทางที่ npm กำลังติดตั้งโมดูลส่วนกลางให้เป็นสิ่งที่สั้นมาก (โดยปกติคือ :) c:\users\\{username}\AppData\Roaming\npm\npm_modulesซึ่งใช้อักขระจำนวนมากอยู่แล้ว

หากต้องการปรับให้ดูที่นี่: เปลี่ยนไดเรกทอรีการติดตั้งส่วนกลางเริ่มต้นสำหรับโมดูล node.js ใน Windows?

หากคุณปรับเป็นเช่นc:\n\ในบางกรณีอาจช่วยแก้ปัญหาได้


1

นี่คือสิ่งที่แก้ไขให้ฉันได้ในที่สุด ...

หลังจากติดตั้งอึกและได้รับข้อผิดพลาดให้เรียกใช้ ... อึก

--no-bin-linkเมื่อคุณเห็นความล้มเหลวแพคเกจติดตั้งด้วยตนเองด้วย

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

โดยที่ {package} คือแพ็กเกจที่มีปัญหา

หลังจากทั้งหมดนี้ฉันได้รับข้อความ Error in plugin 'gulp-alert': not found: alert-send

นี่เป็นเพราะปัญหาปลั๊กอินกับ Vagrant คุณสามารถปิดการแจ้งเตือน ..

export DISABLE_NOTIFIER=true;

หรือติดตั้งปลั๊กอินที่มีคนจรจัด

โชคดี.. ฉันใช้เวลากับเรื่องนี้นานมากแม้ว่าจะทำตามคำแนะนำของผู้คนมากมายก็ตาม

แบรนดอน


0

ใน windows:

  1. ใช้ windows explorer ของคุณนำทางไปยังโฟลเดอร์ที่แชร์คนจรจัดของคุณ (ฉันใช้ scotchbox อยู่) เช่น C:\scotchbox/public/gulpProject
  2. ในแถบที่อยู่ของโฟลเดอร์พิมพ์cmdและกดEnter
  3. ทำการติดตั้งอึกของคุณ npm install

1
หลีกเลี่ยงการคัดลอกวางคำตอบเดียวกัน คุณควรตั้งค่าสถานะว่าซ้ำกันแทน นอกจากนี้อย่าสาบานในโพสต์ของคุณ
Tunaki

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.