มี project_name/node_modules เป็น symlink หรือไม่

ที่เกี่ยวข้อง: โฟลเดอร์ node_modules เดียวสำหรับหลายโครงการ

หากไม่แนะนำ npm install -g ทุกอย่าง และฉันไม่ต้องการเชื่อมโยงแต่ละโมดูล ฉันสามารถเชื่อมโยง <some project>/node_modules ไปยังไดเร็กทอรีทั่วไปเพื่อแชร์โดยหลายโครงการได้หรือไม่


person prusswan    schedule 27.03.2016    source แหล่งที่มา


คำตอบ (1)


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

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

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

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

superproject/
|-- node_modules/
|   +-- socket.io/
|-- package.json
|-- subprojectA/
|   |-- node_modules/
|   |   +-- browserify/
|   |-- package.json
|   +-- app/
|       +-- client.js
+-- subprojectB/
    |-- node_modules/
    |   +-- express/
    |-- package.json
    +-- lib/
        +-- server.js

โครงสร้างนี้ทำงานตามที่คุณคาดหวัง ไฟล์ภายในโครงการย่อยสามารถ require() โมดูลของตนเองและโมดูลใดๆ ใน superproject/node_modules ได้ แต่จะไม่ require() โมดูลภายในโครงการย่อยพี่น้องได้อย่างง่ายดาย (ยังคงเป็นไปได้ที่จะทำเช่นนั้นผ่านเส้นทางที่ชัดเจน) กล่าวอีกนัยหนึ่ง client.js สามารถ require() browserify และ socket.io โดยไม่มีเส้นทาง แต่จะต้องใช้เส้นทางไปยัง require() express

สิ่งสำคัญคือ npm จะค้นหา package.json แบบ "ค้นหา" และจัดการกับโมดูลในไดเร็กทอรี node_modules ในฐานะพี่น้องกับไฟล์นั้นเมื่อทำการติดตั้ง ฯลฯ ซึ่งหมายความว่าไดเร็กทอรีการทำงานปัจจุบันของคุณต้องเป็น superproject เพื่อติดตั้งโมดูลต่างๆ ในนั้น เว้นแต่โครงการย่อยของคุณไม่มีไฟล์ package.json

person Seth Holladay    schedule 27.03.2016
comment
การขึ้นต่อกันที่ซ้ำซ้อนถือเป็นข้อกังวลอย่างมาก เนื่องจากไฟล์ใช้พื้นที่ค่อนข้างมากแม้สำหรับโปรเจ็กต์ขนาดเล็กมาก และยังทำให้เปลืองแบนด์วิธทางอ้อมเมื่อตั้งค่าโปรเจ็กต์ใหม่ที่ใช้ (ส่วนใหญ่) การอ้างอิงเดียวกัน - person prusswan; 27.03.2016
comment
ฉันสามารถเกี่ยวข้องกับความปรารถนาเหล่านั้นได้ แต่ฉันคิดว่าคุณจะพบว่าการเชื่อมโยงโครงการต่างๆ เข้าด้วยกันในลักษณะนี้จะสร้างภาระที่แตกต่างออกไป ที่ที่คุณไม่สามารถอัปเดตการพึ่งพาได้เนื่องจากโปรเจ็กต์ x ต้องการพฤติกรรมบางอย่าง แต่คุณต้องการ/จำเป็นต้องอัปเดตจริงๆ เพราะโปรเจ็กต์ y ใช้มันแตกต่างออกไปและต้องการสิ่งใหม่ ในสมัยก่อน โมดูล npm ทั้งหมดเป็นแบบสากล แนวทางปฏิบัตินี้หยุดลงเนื่องจากชุมชนตระหนักว่ามันไม่คุ้มค่า nodejs.org/en/blog/npm /npm-1-0-global-vs-local-installation ทั้งหมดที่กล่าวมา ยังมีวิธีทำโมดูล pseudo-global - person Seth Holladay; 27.03.2016
comment
ซุปเปอร์โปรเจ็กต์เป็นทางออกที่ยอดเยี่ยม! ขอบคุณมาก. ในกรณีของฉัน ฉันกำลังทำงานกับโปรเจ็กต์ Laravel PHP หลายโปรเจ็กต์ ซึ่งใช้โหนดสำหรับงานการพัฒนาเท่านั้น (อึก) อึกและ need() ใช้งานได้เฉพาะเมื่อติดตั้งในเครื่องเท่านั้น แต่การทำซ้ำ node_modules 200MB สำหรับทุก ๆ โปรเจ็กต์ PHP ขนาด 5MB นั้นไม่สมเหตุสมผลเลย โดยเฉพาะอย่างยิ่งเมื่อฉันไม่ได้ทำการพัฒนาโหนดใด ๆ ด้วยตัวเอง ซูเปอร์โปรเจ็กต์เป็นวิธีแก้ปัญหาที่เหมาะสมเพียงอย่างเดียวที่ฉันพบ: ฉันสามารถมีโฟลเดอร์ laravel-5.2 พร้อมสำเนาเครื่องมือเดียวที่จำเป็นสำหรับ 5.2 ควบคู่ไปกับโปรเจ็กต์ 5.2 ทั้งหมด และอื่นๆ ฉลาดหลักแหลม! - person Tobia; 06.07.2016
comment
@SethHolladay ผู้คนประสบปัญหานี้แล้วและได้รับการแก้ไขอย่างประสบความสำเร็จในประวัติศาสตร์ของการพัฒนาระบบปฏิบัติการ มีไลบรารีที่ใช้ร่วมกันหลายร้อย (หรือหลายพัน) ในระบบปฏิบัติการใดๆ และไลบรารีเดียวกันหลายเวอร์ชันสามารถอยู่ร่วมกันได้อย่างมีความสุขเพียงใช้กฎง่ายๆ - รวมเวอร์ชันไว้ในชื่อของไลบรารี ดังนั้นนักพัฒนาที่ฉลาดคงจะใช้แบบแผนของ node_modules/[email protected]/library.js แล้วเราจะไม่ต้องต่อสู้กับกำแพง .... - person IVO GELOV; 11.09.2017
comment
@IVOGELOV ไลบรารีเดียวกันหลายเวอร์ชันสามารถอยู่ร่วมกันอย่างมีความสุขได้ - ถูกต้องและ npm ก็ทำสิ่งนี้ได้เช่นกัน ข้อแตกต่างเพียงอย่างเดียวคือ npm เลือกที่จะซ้อนการขึ้นต่อกันในรูปแบบต้นไม้เมื่อจำเป็น แทนที่จะใส่ข้อมูลเวอร์ชันที่เรียบและซ้ำกันลงในโมดูล ID เสมอ ซึ่งทำงานได้ดีกว่าสำหรับการขึ้นต่อกันในเครื่อง ซึ่งขอแนะนำ เพื่อให้ทำงานสำหรับการพึ่งพาที่ใช้ร่วมกันทั่วโลก ตัวโหลดโมดูลจะต้องมีข้อมูลเวอร์ชันใน ID โมดูล แต่ไม่มีใครต้องการ require('[email protected]') เพราะนั่นอยู่ในที่เดียวเท่านั้น: package.json - person Seth Holladay; 30.09.2017
comment
@SethHolladay ฉันยอมรับว่าประสบการณ์ของฉันกับ NPM และ Node ยังไม่เพียงพอ ดังนั้นโปรดยกโทษให้ฉันด้วยหากคำพูดของฉันฟังดูงี่เง่า ใน Linux เมื่อคุณ ติดตั้ง เวอร์ชันใหม่ของไลบรารี่ เวอร์ชันเก่าจะไม่ถูกลบออก แต่ลิงก์สัญลักษณ์ (ซึ่งไม่มีข้อมูลเวอร์ชันอยู่ในชื่อ) จะถูกสร้างขึ้นเพื่อชี้ไปยังเวอร์ชันล่าสุดของไลบรารี อย่างไรก็ตาม หากคุณอัปเกรดไลบรารี เวอร์ชันปัจจุบันจะไม่ถูกเก็บไว้ ดังนั้นผู้บริโภคจึงสามารถใช้เวอร์ชันล่าสุด (ไม่ว่าจะเป็นอะไรก็ตาม) ผ่านทาง symlink - หรือชี้ไปที่ไลบรารีเวอร์ชันที่ต้องการอย่างชัดเจน และเป็นหน้าที่ของตัวโหลดที่จะต้องตรวจสอบ package.json - person IVO GELOV; 01.10.2017
comment
@SethHolladay และตรวจสอบว่า require หรือ import ต้องการเวอร์ชันเฉพาะหรือเวอร์ชันใดเป็น ล่าสุด ที่ติดตั้งอยู่ในปัจจุบัน นอกจากนี้ยังดูขัดกับสัญชาตญาณสำหรับฉันที่ NPM ปฏิเสธที่จะทำงานเมื่อ node_modules ในโฟลเดอร์โครงการเป็น symlink - person IVO GELOV; 01.10.2017
comment
node_modules การเป็น symlink ควร ทำงานได้ดี ฉันไม่ได้ทดสอบสิ่งนี้โดยเฉพาะ แต่ถ้าไม่ได้ผลก็ดูเหมือนเป็นข้อบกพร่อง ฉันไม่ทราบถึงตัวเลือกการออกแบบหรือข้อจำกัดใด ๆ ที่จะกำหนดข้อจำกัดโดยที่ node_modules จะต้องไม่เป็น symlink ที่กล่าวว่าบางที npm กำลังปิดบังมันอย่างไร้เดียงสา ในส่วนของมันเป็นหน้าที่ของตัวโหลดในการตรวจสอบ package.json นั่นคงจะดี น่าเสียดายที่มันไม่ได้ ฟังดูเหมือนเป็นวิธีแก้ปัญหาที่ดีและเป็นวิธีแก้ปัญหาที่สามารถนำไปใช้ใน userland ได้ - person Seth Holladay; 02.10.2017
comment
ไม่ต้องแย่งชิงโพสต์ แต่ฉันกำลังประสบปัญหาที่คล้ายกัน ดูโพสต์ SO ของฉัน ที่นี่ และได้ลองใช้วิธีแก้ปัญหาในการสร้าง symlink จากไดเร็กทอรี node-modules ภายนอกที่วางไว้ที่รูทของไดเร็กทอรีโครงการของฉัน ประเด็นของฉันคือไม่ต้องแชร์ไดเร็กทอรี node_modules ข้ามโปรเจ็กต์ต่างๆ แต่เพื่อจัดการกับสภาพแวดล้อมที่จำกัดพื้นที่ของดิสก์ที่แบ่งพาร์ติชัน Raspberry Pi - person Brad W; 23.12.2020