ทำไมเราต้องติดตั้งอึกทั่วโลกและในประเทศ?


292

คู่มือ 2 เล่มเกี่ยวกับgulpบอกว่าฉันต้องติดตั้ง gulp ก่อนทั่วโลก (ด้วยแฟล็ก -g) จากนั้นอีกครั้งในเครื่อง ทำไมฉันต้องการสิ่งนี้


12
หน้า "เริ่มต้นใช้งาน"ของโครงการพูดเหมือนกัน (ยังไม่ได้บอกว่าทำไม)
TJ Crowder

11
ฉันหวังว่า NPM สามารถใช้ทั่วโลกติดตั้งแพคเกจอ้างอิงที่เป็นรุ่นเดียวกับแพคเกจท้องถิ่น 5MB ของสิ่งที่แวววาวสำหรับแต่ละไดเรกทอรีโครงการ: /
Ciantic

@Ciantic ไม่รับประกัน แต่ ... ➪ stackoverflow.com/a/25879563/444255
Frank Nocke

คำตอบ:


238

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

npm 5.2+

npxยูทิลิตี้ที่มาพร้อมกับnpm 5.2แก้ปัญหานี้ได้ ด้วยคุณสามารถเรียกใช้ยูทิลิตี้ที่ติดตั้งในท้องถิ่นเช่นยูทิลิตี้ที่ติดตั้งทั่วโลก (แต่คุณต้องเริ่มต้นคำสั่งด้วยnpx) ตัวอย่างเช่นหากคุณต้องการเรียกใช้การติดตั้งในeslintเครื่องคุณสามารถทำได้:

npx eslint .

npm <5.2

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

ดังนั้นหากคุณพอใจ (ใน package.json ของคุณ):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

ฯลฯ และทำงานด้วยnpm run testแล้วคุณไม่จำเป็นต้องติดตั้งทั่วโลกเลย

ทั้งสองวิธีมีประโยชน์ในการทำให้ผู้คนติดตั้งโครงการของคุณเนื่องจากsudoไม่จำเป็น มันก็หมายความว่าgulpจะมีการอัปเดตเมื่อเวอร์ชันถูกชนใน package.json ดังนั้นทุกคนจะใช้เวอร์ชันเดียวกันของ gulp เมื่อพัฒนากับโครงการของคุณ

ภาคผนวก:

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


3
ใช่ แต่จะทำอย่างไรเมื่อคุณไม่มีอินเทอร์เน็ต? คุณจะใช้อึกได้อย่างไรหากไม่ได้ติดตั้งแบบกลม
IGRACH

3
@IGRACH สคริปต์ด้านบนไม่ได้ใช้การเชื่อมต่ออินเทอร์เน็ต หากคุณต้องการที่จะทำในสิ่งเดียวกันโดยไม่ต้องใช้ข้อมูลสคริปต์ใน package.json ./node_modules/.bin/gulpแล้วใช้
qubyte

1
ฉันได้กำหนดนามแฝงสำหรับgulpและcoffeeคำสั่งทำงานจากรูทโปรเจ็กต์โหนดของฉัน (เช่น. alias gulp="node_modules/.bin/gulp") วิธีนี้คำสั่งจะใช้งานง่ายหากจำเป็นและไม่เกิดข้อขัดแย้งกับเวอร์ชันสากล / โลคัล
84659

ขอบคุณ @ qubyte! ฉันคิดว่าการติดตั้งในเครื่องเป็นวิธีปฏิบัติที่ดีโดยทั่วไป ฉันมีคำถามอีกหนึ่งข้อดังนั้นหวังว่าคุณจะช่วยฉันล้างความคิดของฉัน ฉันลองติดตั้งทั่วโลกตามเอกสารแนะนำของ Gulp โดยไม่ต้องติดตั้งในเครื่อง ดังนั้นเมื่อผมพยายามที่จะเรียกมันทำให้ผมเกิดข้อผิดพลาดดังต่อไปนี้gulp Local gulp not found in ...เท่าที่ฉันเข้าใจมันควรดูที่ node_modules โลคัลก่อนและหากไม่พบควรตรวจดูโมดูลที่ติดตั้งทั่วโลกใช่มั้ย ขอบคุณ!
yeelan

1
เพิ่มภาคผนวก หวังว่าจะครอบคลุมความแปลกประหลาดของอึก
qubyte

82

TLDR; นี่คือเหตุผล :

ด้วยเหตุนี้การทำงานเป็นเพราะgulpพยายามที่จะทำงานของคุณgulpfile.jsโดยใช้รุ่นของคุณติดตั้งภายในของgulpดูที่นี่ ดังนั้นเหตุผลสำหรับการติดตั้งอึกทั่วโลกและในท้องถิ่น

เป็นหลักเมื่อคุณติดตั้งgulpภายในสคริปต์ไม่ได้อยู่ในของคุณPATHและเพื่อให้คุณไม่สามารถพิมพ์gulpและคาดว่าเชลล์เพื่อหาคำสั่ง ด้วยการติดตั้งทั่วโลกgulpสคริปต์จะเข้าสู่คุณPATHเพราะnode/bin/ไดเรกทอรีทั่วโลกมีแนวโน้มมากที่สุดในเส้นทางของคุณ

จะเคารพการอ้างอิงในท้องถิ่นของคุณแม้ว่าจะใช้รุ่นที่ติดตั้งไว้ในเครื่องของคุณเองในการทำงานgulpgulpfile.js


1
~ / bin เป็นแบบแผน Unix สำหรับไบนารีต่อผู้ใช้และใน PATH ตามค่าเริ่มต้นในระบบปฏิบัติการหลายระบบ อึกควรจะสามารถเชื่อมโยงไบนารีจากที่นั่น
mikemaccana

2
กล่าวอีกนัยหนึ่งgulpคือแพคเกจที่ติดตั้งทั่วโลกของคุณจำเป็นต้องใส่node_modules/.bin/gulpในเส้นทาง การจัดเก็บราคาถูก แต่ทิ้ง MB สำหรับการจำลอง symlink นั้นเป็น IMO ที่ไม่เลอะเทอะ
ntd

79

คุณสามารถเชื่อมโยงการติดตั้งทั่วโลกgulpในพื้นที่ด้วย

npm link gulp

1
ฉันรู้ว่าเป็นการดีที่สุดที่จะใช้การติดตั้งภายในเครื่อง แต่อาจมีบางกรณีที่คุณไม่สามารถติดตั้งหรือไม่ต้องการ (จินตนาการว่าเซิร์ฟเวอร์ CI เฉพาะของคุณติดตั้งทั่วโลกแล้วคุณติดตั้งใหม่ทุกครั้ง) . อย่างไรก็ตาม +1 npm linkสำหรับการกล่าวขวัญ
gion_13

1
ฉันรู้ว่าคุณทำอะไรที่นั่น. นั่นฉลาด
deepelement

สิ่งนี้ไม่ได้พยายามตอบคำถาม
mikemaccana

1
ไม่มันทำให้ใช้งานไม่ได้
Berislav Lopac

67

คำถาม " ทำไมเราต้องติดตั้งอึกทั่วโลกและในประเทศ? " สามารถแบ่งออกเป็นสองคำถามต่อไปนี้:

  1. ทำไมฉันต้องติดตั้งอึกไว้ในเครื่องหากฉันติดตั้งไว้แล้วทั่วโลก

  2. ทำไมฉันต้องติดตั้งอึกทั่วโลกหากฉันติดตั้งไว้ในเครื่องแล้ว

หลายคนให้คำตอบที่ดีกับคำถามที่แยกกัน แต่ฉันคิดว่ามันจะเป็นประโยชน์ในการรวบรวมข้อมูลในคำตอบแบบรวม

ทำไมฉันต้องติดตั้งอึกไว้ในเครื่องหากฉันติดตั้งไว้แล้วทั่วโลก

เหตุผลในการติดตั้งอึกภายในนั้นประกอบด้วยหลายสาเหตุ:

  1. การรวมการพึ่งพาของโครงการของคุณในพื้นที่ทำให้มั่นใจได้ว่าเวอร์ชันของอึก (หรือการอ้างอิงอื่น ๆ ) ที่ใช้เป็นเวอร์ชันที่ตั้งใจไว้ แต่เดิม
  2. โหนดจะไม่พิจารณาโมดูลทั่วโลกตามค่าเริ่มต้นเมื่อใช้ require () (ซึ่งคุณต้องรวมอึกไว้ในสคริปต์ของคุณ) ในที่สุดนี้เป็นเพราะเส้นทางไปยังโมดูลทั่วโลกไม่ได้ถูกเพิ่มไปยัง NODE_PATH ตามค่าเริ่มต้น
  3. ทีมพัฒนาโหนดระบุว่าโมดูลโลคัลโหลดเร็วขึ้น ฉันไม่สามารถบอกได้ว่าทำไมถึงเป็นเช่นนี้ แต่ดูเหมือนว่าจะเกี่ยวข้องกับการใช้งานของโหนดในการผลิต (เช่นการพึ่งพาเวลาทำงาน) มากกว่าในการพัฒนา (เช่นการพึ่งพา dev) ฉันคิดว่านี่เป็นเหตุผลที่ถูกต้องเพราะบางคนอาจสนใจว่าการได้เปรียบความเร็วเล็กน้อยอะไรก็ตามที่ได้รับการโหลดกับโมดูลในประเทศและทั่วโลก แต่รู้สึกอิสระที่จะยกคิ้วของคุณด้วยเหตุผลนี้

ทำไมฉันต้องติดตั้งอึกทั่วโลกหากฉันติดตั้งไว้ในเครื่องแล้ว

  1. เหตุผลในการติดตั้ง gulp ทั่วโลกเป็นเพียงความสะดวกสบายของการใช้ gulp ที่สามารถเรียกใช้งานได้โดยอัตโนมัติภายในเส้นทางของระบบของคุณ

เพื่อหลีกเลี่ยงการติดตั้งภายในคุณสามารถใช้npm link [package]แต่คำสั่งลิงค์รวมทั้งinstall --globalคำสั่งดูเหมือนจะไม่สนับสนุน--save-devตัวเลือกซึ่งหมายความว่าดูเหมือนจะไม่เป็นวิธีที่ง่ายในการติดตั้งอึกทั่วโลกแล้วเพิ่มเวอร์ชันใดก็ได้ที่ต้องการ ไฟล์ package.json ท้องถิ่นของคุณ

ในที่สุดฉันเชื่อว่ามันมีความเหมาะสมมากกว่าที่จะมีตัวเลือกในการใช้โมดูลระดับโลกเพื่อหลีกเลี่ยงการติดตั้งเครื่องมือทั่วไปในทุกโครงการของคุณโดยเฉพาะในกรณีของเครื่องมือในการพัฒนาเช่น grunt, gulp, jshint เป็นต้น ดูเหมือนว่าคุณจะต้องต่อสู้กับเครื่องมือสักเล็กน้อยเมื่อคุณต่อสู้กับธัญพืช


7
+1 สำหรับการเป็นคนแรกในอินเทอร์เน็ตทั้งหมดเพื่อชี้ให้เห็นว่ามีคำถามสองจุด ทุกคนส่วนใหญ่ทุกที่เพียงตอบ "ทำไมฉันต้องติดตั้งอึกทั่วโลกถ้าฉันติดตั้งไว้แล้วในเครื่อง?" เมื่อสิ่งที่ฉันอยากรู้คือ "ทำไมฉันต้องติดตั้งอึกไว้ในเครื่องหากฉันติดตั้งไว้แล้วทั่วโลก"
นาธาน JB

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

4
คำตอบของคุณช่างงดงามเหลือเกิน ฉันจะมีคำสาบาน 80% เช่นนี้ดูเหมือนจะโง่มาก ******* จากมุมมองของเครื่องมือทฤษฎีการติดตั้งในท้องถิ่นอาจจะถูกต้อง แต่จากมุมมองของระบบปฏิบัติการและมุมมองของผู้จัดการแพ็กเกจนี่มันช่างบ้าเหลือเกินที่ฉันไม่สามารถหาคำศัพท์ได้ พวก NPM / อึกทำอะไรยา?!? หากใครไม่เห็นด้วยโปรดอ่านวิธีการจัดการแพ็คเกจระบบเช่น dpkg, yum, pacman และ co งาน.
JepZ

2
@ JepZ เป็นเพียงอึกที่แปลกสุด ๆ แต่ไม่มีอะไรในปมหรือ npm บังคับให้ทำสิ่งนี้ และการเก็บอึกรุ่นที่เฉพาะเจาะจงไว้ในโครงการนั้นเหมาะสมก็ต่อเมื่อคนอึก ๆ ทำเวอร์ชันปะแก้เป็นประจำหรือบางอย่างเครื่องมือสร้างอื่น ๆ มักจะเป็นการติดตั้งทั่วโลก แต่อืม เพียงแค่มาที่นี่เพื่อสาบาน
Stoffe

2
มันจริงๆไม่ใช่ปัญหาในขณะนี้เป็นชุมชนได้ย้ายไปเพียงแค่ใช้เส้นด้าย :)
ดีเร็กเกรียร์

8

ในทางเทคนิคคุณไม่จำเป็นต้องติดตั้งทั่วโลกหากnode_modulesโฟลเดอร์ในการติดตั้งในเครื่องของคุณอยู่ในPATHเครื่อง โดยทั่วไปนี่ไม่ใช่ความคิดที่ดี

อีกทางเลือกหนึ่งถ้าnpm testอ้างอิงgulpแล้วคุณสามารถพิมพ์npm testและมันจะเรียกใช้อึกท้องถิ่น

ฉันไม่เคยติดตั้งอึกทั่วโลก - ฉันคิดว่ามันเป็นฟอร์มที่ไม่ดี


3
วิธีที่ดีกว่าวางไว้ในเส้นทางของคุณคือการใช้สคริปต์ NPM
Jay

2

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

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


ใช่กรุณาดำดิ่งลงสู่ปัญหานี้
kenorb

1

เพียงเพราะฉันไม่ได้เห็นที่นี่ถ้าคุณอยู่ใน MacOS หรือ Linux ฉันขอแนะนำให้คุณเพิ่มสิ่งนี้ลงใน PATH ของคุณ (ใน bashrc ของคุณ ฯลฯ ):

node_modules/.bin

ด้วยรายการพา ธ สัมพัทธ์นี้หากคุณนั่งอยู่ในโฟลเดอร์รูทของโปรเจ็กต์โหนดคุณสามารถรันเครื่องมือบรรทัดคำสั่งใดก็ได้ (eslint, gulp, ฯลฯ ) โดยไม่ต้องกังวลกับ "global installs" หรือnpm runอื่น ๆ

เมื่อฉันทำสิ่งนี้ฉันไม่เคยติดตั้งโมดูลทั่วโลก

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