ฉันควรเช็คอิน node_modules เป็น git เมื่อสร้างแอป node.js บน Heroku หรือไม่


368

ฉันทำตามคำแนะนำเบื้องต้นในการเริ่มต้นสำหรับ node.js ใน Heroku ที่นี่:

https://devcenter.heroku.com/categories/nodejs

คำสั่งเหล่านี้ไม่ได้บอกให้คุณสร้าง. gitignore node_modules ดังนั้นจึงบอกเป็นนัยว่า node_modules ควรถูกตรวจสอบใน git เมื่อฉันรวม node_modules ในคอมไพล์แอปพลิเคชันเริ่มต้นของฉันทำงานอย่างถูกต้อง

เมื่อฉันทำตามตัวอย่างขั้นสูงเพิ่มเติมได้ที่:

https://devcenter.heroku.com/articles/realtime-polyglot-app-node-ruby-mongodb-socketio https://github.com/mongolab/tractorpush-server (แหล่งที่มา)

มันสั่งให้ฉันเพิ่ม node_modules ใน. gitignore ดังนั้นฉันจึงลบ node_modules จาก git เพิ่มลงใน. gitignore จากนั้นปรับใช้ใหม่ เวลานี้การปรับใช้ล้มเหลวเช่นนี้:

-----> Heroku receiving push
-----> Node.js app detected
-----> Resolving engine versions
       Using Node.js version: 0.8.2
       Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Error: npm doesn't work with node v0.8.2
       Required: node@0.4 || 0.5 || 0.6
           at /tmp/node-npm-5iGk/bin/npm-cli.js:57:23
           at Object.<anonymous> (/tmp/node-npm-5iGk/bin/npm-cli.js:77:3)
           at Module._compile (module.js:449:26)
           at Object.Module._extensions..js (module.js:467:10)
           at Module.load (module.js:356:32)
           at Function.Module._load (module.js:312:12)
           at Module.require (module.js:362:17)
           at require (module.js:378:17)
           at Object.<anonymous> (/tmp/node-npm-5iGk/cli.js:2:1)
           at Module._compile (module.js:449:26)
       Dependencies installed
-----> Discovering process types
       Procfile declares types -> mongod, redis, web
-----> Compiled slug size is 5.0MB
-----> Launching... done, v9

การเรียกใช้ "heroku ps" เป็นการยืนยันความผิดพลาด ตกลงไม่มีปัญหาดังนั้นฉันย้อนกลับการเปลี่ยนแปลงเพิ่ม node_module กลับไปที่ที่เก็บ git และลบออกจาก. gitignore อย่างไรก็ตามแม้หลังจากคืนค่าฉันยังคงได้รับข้อความแสดงข้อผิดพลาดเดียวกันในการปรับใช้ แต่ตอนนี้แอปพลิเคชันทำงานได้อย่างถูกต้องอีกครั้ง เรียกใช้ "heroku ps" บอกแอปพลิเคชันที่กำลังทำงาน

ดังนั้นคำถามของฉันคือวิธีที่เหมาะสมในการทำเช่นนี้? รวม node_modules หรือไม่? และทำไมฉันยังคงได้รับข้อความแสดงข้อผิดพลาดเมื่อฉันย้อนกลับ ฉันเดาว่าที่เก็บ git อยู่ในสถานะไม่ดีทางฝั่ง Heroku หรือไม่?


10
ฉันเป็นเจ้าของภาษาโหนดที่ Heroku และคำตอบนั้นง่าย: ไม่อย่าเช็คอินnode_modulesแอพ Heroku
hunterloftis

@hunterloftis 'อย่าตรวจสอบ node_modules ใน ' หรือ 'อย่าตรวจสอบ node_modules เป็น '? ในการชี้แจงในฐานะเจ้าของภาษาโหนดที่ Heroku คุณต้องการให้เราอัปโหลด node_modules ทั้งหมดของเราผ่านการใช้ git push หรือไม่? ฉันไม่ชอบที่จะเสียแบนด์วิดท์และความจริงที่ว่า Heroku จะให้พวกเขาใช้แบ็กเอนด์ของคอมไพล์ของฉัน อย่างไรก็ตามฉันต้องแก้ไขไฟล์ใน node_modules ด้วยตนเองเพื่อให้ Heroku โหลดแอปของฉัน ฉันจึงต้องเพิกเฉย node_modules ลบโมดูลทั้งหมดที่รวมไฟล์ที่แก้ไขของฉันเพื่อให้มันทำงาน
ZStoneDPM

คำตอบ:


400

ปรับปรุงที่สอง

ไม่พบคำถามที่พบบ่อยอีกต่อไป

จากเอกสารของshrinkwrap:

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

แชนนอนและสตีเวนพูดถึงเรื่องนี้มาก่อน แต่ฉันคิดว่ามันควรเป็นส่วนหนึ่งของคำตอบที่ยอมรับ


ปรับปรุง

แหล่งข้อมูลที่แสดงไว้สำหรับคำแนะนำด้านล่างนี้ได้รับการอัปเดตแล้ว พวกเขาไม่แนะนำให้ใช้node_modulesโฟลเดอร์นี้อีกต่อไป

โดยปกติแล้วไม่มี อนุญาตให้ npm แก้ไขการขึ้นต่อกันของแพ็คเกจของคุณ

สำหรับแพ็คเกจที่คุณปรับใช้เช่นเว็บไซต์และแอพคุณควรใช้ npm shrinkwrap เพื่อล็อคโครงสร้างการพึ่งพาแบบเต็ม:

https://docs.npmjs.com/cli/shrinkwrap


โพสต์ต้นฉบับ

สำหรับการอ้างอิงคำถามที่พบบ่อย npm ตอบคำถามของคุณอย่างชัดเจน:

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

และสำหรับบางเหตุผลที่ดีสำหรับการนี้อ่านโพสต์ Mikeal โรเจอร์สเกี่ยวกับเรื่องนี้


ที่มา: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git


13
นี่ไม่ถูกต้อง - อันที่จริงมันเป็นความคิดที่แย่มาก หากคุณกำลังพัฒนาบน Windows จากนั้นปรับใช้บน Linux คุณจะต้องสร้าง node_modules ใหม่เมื่อคุณปรับใช้ ซึ่งหมายความว่า - ความโกลาหล ไฟล์ที่แก้ไขมากมายและไม่รู้ว่าจะต้องทำอย่างไร
3690202

8
ไม่สามารถทำได้ - devs บางตัวของเราพัฒนา windows ที่กำหนดเป้าหมาย, อื่น ๆ ที่กำหนดเป้าหมายไปที่ linux, แต่เป็นรหัสฐานเดียวกัน วิธีที่ดีที่สุดคือไม่ยอมรับโหนดโมดูล - อ๊ะ
3690202

7
@ user3690202 ดูเหมือนว่าคุณมีกรณีที่แปลกใหม่มากกว่าปกติดังนั้นการพูดว่า "นี่ไม่ถูกต้อง" น่าจะเป็นการพูดเกินจริง ต้องบอกว่าไม่แน่ใจว่ากรณีการใช้งานที่ถูกต้องของคุณคืออะไร แต่ฉันไม่สามารถคิดได้ว่าจะใช้ทั้ง windows และ linux เพื่อการพัฒนาอย่างไร ติดหนึ่งและเรียกใช้การทดสอบหรือควบคุมคุณภาพบนแพลตฟอร์มทั้งหมดที่คุณสนับสนุน
Kostia

16
@Kostia กรณีการใช้ของเราเป็นเรื่องธรรมดา เราเป็นอาสาสมัครและใช้เครื่องจักรของเราเองไม่ใช่ของ บริษัท ดูเหมือนว่าเป็นสถานการณ์ที่พบได้ทั่วไปสำหรับโอเพนซอร์ส
อดัม

4
@Adam โดยนัยคุณช่วยเพิ่มไฟล์ที่คอมไพล์แล้วได้.gitignoreไหม? ด้วยวิธีการนี้แหล่งที่มาอยู่ในคอมไพล์และส่วนประกอบที่คอมไพล์ใด ๆ จะไม่คล้ายกับวิธีการที่โฟลเดอร์distหรือoutputgitignored ในโครงการ grunt และ gulp
Kostia

160

ความกังวลที่ยิ่งใหญ่ที่สุดของฉันที่ไม่ได้ตรวจสอบเรื่องnode_modulesคอมไพล์คือ 10 ปีข้างหน้าเมื่อแอปพลิเคชันการผลิตของคุณยังคงใช้งานอยู่อาจไม่มีรอบต่อนาที หรือ npm อาจเสียหาย หรือผู้ดูแลอาจตัดสินใจที่จะลบห้องสมุดที่คุณพึ่งพาจากที่เก็บของพวกเขา; หรือเวอร์ชันที่คุณใช้อาจถูกตัดออก

สิ่งนี้สามารถลดลงได้ด้วยผู้จัดการ repo เช่น maven เพราะคุณสามารถใช้ Nexus หรือ Artifactory ในพื้นที่ของคุณเพื่อรักษากระจกด้วยแพ็คเกจที่คุณใช้ เท่าที่ฉันเข้าใจระบบดังกล่าวไม่มีอยู่สำหรับ npm เช่นเดียวกันสำหรับผู้จัดการห้องสมุดฝั่งไคลเอ็นต์เช่น Bower และ Jamjs

หากคุณส่งไฟล์ไปยัง repo git ของคุณเองคุณสามารถอัปเดตเมื่อคุณต้องการและคุณจะได้รับความสะดวกสบายในการสร้างซ้ำและความรู้ที่ว่าแอปของคุณจะไม่หยุดทำงานเนื่องจากการกระทำของบุคคลที่สาม


10
ตัวเลือกมากมายในวันนี้: Nexus ( issues.sonatype.org/browse/NEXUS-5852 ) Artifactory ( jfrog.com/jira/browse/RTFACT-5143 ) npm_lazy ( github.com/mixu/npm_lazy ) NPM-lazy- กระจก ( npmjs.org/package/npm-lazy-mirror ) ฯลฯ
โยฮันน์

4
อ้างจาก npmjs คำถามที่พบบ่อย: "ถ้าคุณหวาดระแวงเกี่ยวกับระบบนิเวศ npm คุณควรเรียกใช้มิร์เรอร์ npm ส่วนตัวหรือแคชส่วนตัว" ฉันคิดว่าประเด็นนี้เกี่ยวข้องกับปัญหาที่คุณอ้างถึงใช่ไหม
Taylan


2
Npm จะไม่หายไปข้ามคืนดังนั้นผลประโยชน์นั้นไม่เข้ากันได้ดีกับการสูญเสียความชัดเจนในประวัติการกระทำของคุณและชุดขนาดใหญ่ของคุณ หากใครบางคนกำลังสร้างแอปพลิเคชันที่พวกเขาคิดว่าจะยังคงใช้งานได้ใน 10 ปีก็มีเหตุผลที่จะคาดหวังว่ามันจะได้รับการบำรุงรักษาจำนวนมากไปพร้อมกัน ประเด็นเกี่ยวกับการหยุดทำงานของ NPM เป็นข้อโต้แย้งที่ดีกว่าแม้ว่าจะมีวิธีที่ดีกว่าในการลดความเสี่ยงดังกล่าว
Sam P

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

67

คุณไม่ ควรรวมnode_modulesไว้ใน.gitignore(หรือคุณควรรวม node_modulesไว้ในแหล่งข้อมูลที่ปรับใช้กับ Heroku)

ถ้าnode_modules:

  • ที่มีอยู่แล้วnpm installจะใช้ libs vendored เหล่านั้นและจะสร้างการอ้างอิงใด ๆ npm rebuildกับไบนารี
  • ไม่มีอยู่แล้วnpm installจะต้องดึงการอ้างอิงทั้งหมดซึ่งเพิ่มเวลาให้กับขั้นตอนการคอมไพล์กระสุน

ดู Node.js buildpack source สำหรับขั้นตอนที่แน่นอนเหล่านี้

แต่ข้อผิดพลาดเดิมดูเหมือนจะเป็นความไม่เข้ากันระหว่างรุ่นของและnpm nodeเป็นความคิดที่ดีที่จะกำหนดenginesหมวดของคุณpackages.jsonตามคู่มือนี้อย่างชัดเจนเพื่อหลีกเลี่ยงสถานการณ์ประเภทนี้:

{
  "name": "myapp",
  "version": "0.0.1",
  "engines": {
    "node": "0.8.x",
    "npm":  "1.1.x"
  }
}

นี้จะช่วยให้dev / แยงเท่าเทียมกันและลดโอกาสของสถานการณ์ดังกล่าวในอนาคต


ขอบคุณสำหรับความช่วยเหลือของไรอัน นั่นทำให้ฉันผ่านข้อผิดพลาดเวอร์ชัน npm แต่ตอนนี้มันล้มเหลวเมื่อรวบรวมแพ็คเกจ redis ข้อความแสดงข้อผิดพลาดคือ "OSError: [Errno 2] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว: '/ Users / Jason / tastemade / tastebase / node_modules / redis-url / node_modules / redis / node_modules / รับจ้าง' / สร้าง '" ดูเหมือนว่ามันใช้เส้นทางจากกล่องในพื้นที่ของฉันบนเซิร์ฟเวอร์ heroku มีไฟล์บางไฟล์ใน node_modules ที่ฉันต้องเพิ่มใน. gitignore หรือไม่?
Jason Griffin

ฉันไม่แน่ใจว่าเกิดอะไรขึ้นกับไลบรารี่นั้น แต่ฉันลองแยก node_modules ออกจาก git ในกรณีนี้และดูว่ามันช่วยได้หรือไม่ (บังคับให้ npm ดึงข้อมูลทุกอย่างออกมา
Ryan Daigle

@RyanDaigle แนวทางปฏิบัติที่ดีที่สุดในขณะนี้ (พฤศจิกายน 2013) แนะนำโดยทั้ง npm ( npmjs.org/doc/ ...... ) และ heroku ( devcenter.heroku.com/articles/ ...... ) คือการเช็คอินที่ node_modules to git คุณจะอัพเดตคำตอบของคุณ (เนื่องจากมีการเรียกเก็บเงินสูงสุด) หรือไม่
ทิม Diggins

ขณะที่กดไปที่ heroku คุณจะได้ผลลัพธ์ "-----> ไดเรกทอรีแคช node_modules สำหรับการสร้างในอนาคต" นี่คือการย่อการรวบรวมกระสุนในอนาคต
ph3nx

ฉันมีปัญหาที่ node_modules filepath ยาวเกินกว่าจะส่งมอบได้ Git จะไม่ค้นหาไฟล์
รหัสของฟาโรห์

22

ฉันกำลังจะออกจากที่นี่หลังจากความคิดเห็นนี้: ฉันควรตรวจสอบใน node_modules เพื่อคอมไพล์เมื่อสร้างแอป node.js บน Heroku?

แต่ stackoverflow จัดรูปแบบมันแปลก หากคุณไม่มีเครื่องเหมือนกันและกำลังตรวจสอบใน node_modules ให้ทำ. gitignore บนส่วนขยายเนทีฟ . gignignore ของเราดูเหมือนว่า:

# Ignore native extensions in the node_modules folder (things changed by npm rebuild)
node_modules/**/*.node
node_modules/**/*.o
node_modules/**/*.a
node_modules/**/*.mk
node_modules/**/*.gypi
node_modules/**/*.target
node_modules/**/.deps/
node_modules/**/build/Makefile
node_modules/**/**/build/Makefile

ทดสอบสิ่งนี้โดยการตรวจสอบทุกอย่างก่อนจากนั้นให้ผู้อื่นทำสิ่งต่อไปนี้:

rm -rf node_modules
git checkout -- node_modules
npm rebuild
git status

ตรวจสอบให้แน่ใจว่าไม่มีไฟล์ใดเปลี่ยนแปลง


เพิ่งเพิ่มรายการนี้ แก้ไขปัญหาของฉัน หน้าต่าง github ยังคงพังพยายามที่จะไปมากกว่า 7000+ ไฟล์ node_module: /
แบทแมน

10

ฉันเชื่อว่าnpm installไม่ควรทำงานในสภาพแวดล้อมการผลิต มีหลายสิ่งที่สามารถผิดพลาดได้ - การหยุดทำงานชั่วคราวของ NPM การดาวน์โหลดการพึ่งพาที่ใหม่กว่า

ในขณะที่node_modulesไม่ควรมุ่งมั่นกับคอมไพล์ นอกเหนือจากขนาดใหญ่ของพวกเขากระทำรวมถึงพวกเขาสามารถกลายเป็นว้าวุ่นใจ

ทางออกที่ดีที่สุดคือ: npm installควรทำงานในสภาพแวดล้อม CI ที่คล้ายกับสภาพแวดล้อมการผลิต การทดสอบทั้งหมดจะทำงานและไฟล์รุ่นซิปจะถูกสร้างขึ้นซึ่งจะรวมถึงการอ้างอิงทั้งหมด


ทำไมคุณถึงมีขั้นตอนที่ทำงานบน CI ที่จะไม่ทำงานเนื่องจากเป็นส่วนหนึ่งของการปรับใช้ของคุณ นั่นหมายความว่าคุณไม่มีความเท่าเทียมกันระหว่าง 2 ระบบ! ตามคำตอบที่กล่าวไว้ข้างต้น - กำหนดโฟลเดอร์ให้ละเว้นส่วนขยายเนทีฟวิธีที่คุณได้รับความคุ้มครองสำหรับสิ่งต่าง ๆ เช่นการหยุดทำงานของ
PMP

1
ขอบคุณสำหรับความคิดเห็นของคุณ ฉันเชื่อว่า node_modules ที่รันในเซิร์ฟเวอร์ที่ใช้งานจริงของคุณควรถูกสร้างขึ้นจากการติดตั้ง npm ไม่ใช่จากสิ่งที่ devs กระทำ โฟลเดอร์ node_modules ของ dev ไม่จำเป็นต้องตรงกับเนื้อหา package.json
user2468170

8

ฉันใช้ทั้งสองโฟลเดอร์ committing node_modules และ shrink-wrap การแก้ปัญหาทั้งสองไม่ได้ทำให้ฉันมีความสุข

กล่าวโดยย่อ: node_modules ที่ทำหน้าที่เพิ่มเสียงรบกวนไปยังที่เก็บมากเกินไป
และ shrinkwrap.json ไม่ใช่เรื่องง่ายที่จะจัดการและไม่มีการรับประกันว่าโครงการที่ถูกห่อหุ้มบางส่วนจะสร้างในไม่กี่ปี

ฉันพบว่า Mozilla ใช้ที่เก็บแยกต่างหากสำหรับหนึ่งในโครงการของพวกเขาhttps://github.com/mozilla-b2g/gaia-node-modules

ดังนั้นจึงใช้เวลาไม่นานในการนำแนวคิดนี้ไปใช้ในเครื่องมือโหนด CLI https://github.com/bestander/npm-git-lock

ก่อนการสร้างทุกครั้งเพิ่ม
npm-git-lock --repo [git@bitbucket.org: / ทุ่มเท / node_modules / git / repository.git ของคุณ

จะคำนวณแฮชของ package.json ของคุณและจะตรวจสอบเนื้อหา node_modules จาก repo ระยะไกลหรือถ้ามันเป็นงานสร้างครั้งแรกสำหรับ package.json นี้จะทำความสะอาดnpm installและผลักดันผลลัพธ์ไปยัง repo ระยะไกล


5

สิ่งที่ใช้ได้ผลสำหรับฉันคือการเพิ่มเวอร์ชัน npm ไปยัง package.json ("npm": "1.1.x") อย่างชัดเจนและไม่ได้ตรวจสอบใน node_modules ไปยังคอมไพล์ อาจจะช้ากว่าในการปรับใช้ (เนื่องจากดาวน์โหลดแพ็คเกจในแต่ละครั้ง) แต่ฉันไม่สามารถรวบรวมแพ็คเกจเมื่อเช็คอิน Heroku กำลังมองหาไฟล์ที่มีอยู่ในกล่องในเครื่องของฉันเท่านั้น


หากคุณรู้สึกว่าคำตอบของฉันเป็นคำตอบที่ถูกต้องโปรดยอมรับหรือไม่ ขอบคุณ!
Ryan Daigle

ในกรณีนี้ยังคงมีการถกเถียงกันอยู่ฉันจะดูที่โพสต์ส แต็คโอเวอร์โฟลว์ซึ่งเกือบจะซ้ำกับคำถามของคุณด้านบน: stackoverflow.com/questions/11459733/โดยทั่วไปดูเหมือนว่าการประชุมคือการตรวจสอบใน node_modules และ จัดการเวอร์ชันของโมดูลเหล่านั้นแบบโลคัล สิ่งนี้ดูสมเหตุสมผลและอาจเป็นคำอธิบายที่กระชับที่สุด: mikealrogers.com/posts/nodemodules-in-git.html ขอให้ โชคดี!
warriorpostman

3

แทนที่จะตรวจสอบใน node_modules สร้างไฟล์ package.json สำหรับแอปของคุณ

ไฟล์ package.json ระบุการขึ้นต่อกันของแอปพลิเคชันของคุณ Heroku สามารถบอก npm เพื่อติดตั้งการอ้างอิงทั้งหมด บทช่วยสอนที่คุณเชื่อมโยงมีส่วนในไฟล์ package.json


ฉันมี package.json มีดังต่อไปนี้: {"name": "node-example", "version": "0.0.1", "dependencies": {"express": "2.5.x", "redis-url": "0.1 0 "," mongodb ":"> = 0.9.9 "}," เอ็นจิ้น ": {" node ":" 0.8.x "}}
Jason Griffin

ฉันทำในกล่องโลคัลของฉันเพื่อสร้างไดเร็กทอรี node_modules นั่นคือสิ่งที่ฉันเช็คอินแล้วลบออกจากนั้นเพิ่มกลับ
Jason Griffin

หลังจากดูที่บทช่วยสอนเพิ่มเติมดูเหมือนว่าพวกเขากำลังจะทำการส่ง node_modules ในกรณีนี้ฉันไม่แน่ใจว่ามีวิธีที่จะไม่ยอมรับ node_modules หรือไม่ ขออภัย
matzahboy

3

ฉันใช้โซลูชันนี้:

  1. node_modulesสร้างพื้นที่เก็บข้อมูลที่แยกต่างหากที่ถือ หากคุณมีโมดูลเนทีฟที่ควรสร้างสำหรับแพลตฟอร์มเฉพาะให้สร้างที่เก็บแยกต่างหากสำหรับแต่ละแพลตฟอร์ม
  2. แนบที่เก็บเหล่านี้กับที่เก็บโครงการของคุณด้วยgit submodule:

git submodule add .../your_project_node_modules_windows.git node_modules_windows

git submodule add .../your_project_node_modules_linux_x86_64 node_modules_linux_x86_64

  1. สร้างการเชื่อมโยงจากแพลตฟอร์มที่เฉพาะเจาะจงnode_modulesเพื่อnode_modulesไดเรกทอรีและเพิ่มการnode_modules.gitignore
  2. npm installวิ่ง
  3. ยอมรับการเปลี่ยนแปลงที่เก็บ submodule
  4. ยอมรับการเปลี่ยนแปลงที่เก็บโครงการของคุณ

ดังนั้นคุณสามารถสลับระหว่างnode_modulesบนแพลตฟอร์มต่างๆได้อย่างง่ายดาย(ตัวอย่างเช่นหากคุณกำลังพัฒนาบน OS X และปรับใช้กับ Linux)


3

จากhttps://web.archive.org/web/20150212165006/http://www.futurealoof.com/posts/nodemodules-in-git.html :

แก้ไข: ลิงค์เดิมคือลิงค์นี้แต่ตอนนี้มันตายแล้ว ขอบคุณ @Flavio ที่ชี้ให้เห็น

เพื่อสรุป

  • ตรวจสอบเฉพาะ node_modules สำหรับแอ็พพลิเคชันที่คุณปรับใช้ไม่ใช่แพ็กเกจที่นำกลับมาใช้ใหม่ได้
  • การอ้างอิงที่คอมไพล์ใด ๆ ควรมีการตรวจสอบแหล่งที่มาไม่ใช่เป้าหมายการคอมไพล์และควรสร้าง $ npm ใหม่ในการปรับใช้

ส่วนที่ฉันชอบ:

ทุกคนที่คุณเพิ่ม node_modules ไปที่ gitignore ของคุณลบอึนั่นในวันนี้มันเป็นสิ่งประดิษฐ์ของยุคที่เราทุกคนมีความสุขเกินกว่าจะทิ้งไว้ข้างหลัง ยุคของโมดูลทั่วโลกนั้นตายแล้ว


ดูเหมือนว่าไซต์ที่คุณเชื่อมโยงนั้นหมดอายุแล้วและตอนนี้เต็มไปด้วยโฆษณาหลอกลวง ฉันหวังว่าโฆษณาเหล่านั้นจะเป็น "สิ่งประดิษฐ์ของยุคที่เราทุกคนมีความสุขเกินกว่าจะทิ้งไว้ข้างหลัง"
Flavio Copes

1
@FlavioCopes อัปเดตคำตอบของฉันพร้อมลิงก์จากเครื่อง Wayback
Benjamin Crouzier

2

http://nodejs.org/api/modules.html

[... ] โหนดเริ่มต้นที่ไดเรกทอรีหลักของโมดูลปัจจุบันและเพิ่ม/node_modulesและพยายามโหลดโมดูลจากตำแหน่งนั้น

หากไม่พบที่นั่นก็จะย้ายไปยังไดเร็กทอรีพาเรนต์และต่อไปจนกว่าจะถึงรากของทรี

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

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


1

สถานการณ์ที่ 1:

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

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

อ่านเพิ่มเติม

ดังนั้นโอกาสสำหรับเรื่องนี้จึงต่ำ แต่มีสถานการณ์ที่ 2 ...


สถานการณ์ที่ 2:

สถานการณ์อื่น ๆ ที่เป็นกรณีนี้: คุณพัฒนาซอฟต์แวร์รุ่นองค์กรหรือซอฟต์แวร์ที่สำคัญมากและเขียนใน package.json ของคุณ:

"dependencies": {
    "studpid-package": "~1.0.1"
}

คุณใช้วิธีการfunction1(x)ของแพคเกจนั้น

ขณะนี้นักพัฒนาของ studpid แพคเกจเปลี่ยนชื่อวิธีfunction1(x)การfunction2(x)และพวกเขาทำให้ความผิด ... พวกเขาเปลี่ยนรุ่นของแพคเกจของพวกเขาจากไป1.0.1 1.1.0นั่นเป็นปัญหาเพราะเมื่อคุณโทรnpm installครั้งต่อไปคุณจะยอมรับรุ่น1.1.0เพราะคุณใช้เครื่องหมายตัวหนอน ( "studpid-package": "~1.0.1")

การโทรfunction1(x)สามารถทำให้เกิดข้อผิดพลาดและปัญหาได้ในขณะนี้


การผลักดันโฟลเดอร์ node_modules ทั้งหมด (บ่อยกว่า 100 MB) ไปยังที่เก็บของคุณจะทำให้คุณใช้พื้นที่หน่วยความจำ กี่ kb (package.json เท่านั้น) เปรียบเทียบกับหลายร้อย MB (package.json & node_modules) ... ลองคิดดู

คุณสามารถทำได้ / ควรคิดถึงมันหาก:

  • ซอฟต์แวร์มีความสำคัญมาก

  • คุณต้องเสียเงินเมื่อมีบางสิ่งผิดพลาด

  • คุณไม่เชื่อถือรีจิสทรี npm npm ถูกรวมศูนย์และในทางทฤษฎีอาจถูกปิด

คุณไม่จำเป็นต้องเผยแพร่โฟลเดอร์ node_modules ใน 99.9% ของกรณีต่างๆหาก:

  • คุณพัฒนาซอฟต์แวร์เพียงเพื่อตัวคุณเอง

  • คุณได้ตั้งโปรแกรมบางอย่างแล้วและต้องการเผยแพร่ผลลัพธ์ใน GitHub เพราะอาจมีคนอื่นสนใจ


หากคุณไม่ต้องการ node_modules ที่จะอยู่ในพื้นที่เก็บข้อมูลของคุณเพียงแค่สร้างไฟล์และเพิ่มบรรทัด.gitignorenode_modules

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