การติดตั้งโมดูลโลคัลโดยใช้ npm หรือไม่?


418

ฉันมี repo โมดูลที่ดาวน์โหลดมาฉันต้องการติดตั้งในเครื่องไม่ใช่ในไดเร็กตอรี่อื่นหรือไม่?

วิธีง่ายๆในการทำเช่นนี้คืออะไร?

คำตอบ:


480

จากเอกสารคู่มือnpm-link :

ในไดเรกทอรีโมดูลท้องถิ่น:

$ cd ./package-dir
$ npm link

ในไดเรกทอรีของโครงการเพื่อใช้โมดูล:

$ cd ./project-dir
$ npm link package-name

หรือในครั้งเดียวโดยใช้เส้นทางญาติ:

$ cd ./project-dir
$ npm link ../package-dir

นี่เทียบเท่ากับการใช้สองคำสั่งด้านบนภายใต้ประทุน


14
นี่เป็นวิธีการมองที่มีเหตุผลอย่างเดียวที่ฉันเคยเห็น - ทำไม npm ถึงต้องคลุมเครือ / ป้าน w เกี่ยวกับการสร้างแพ็คเกจในพื้นที่ติดตั้งและใช้งานแล้วฉันไม่รู้ว่า ... ลิงก์ทำงานได้ดี (และยอดเยี่ยม) แต่คำศัพท์ค่อนข้างสับสน
smaudet

6
@ Rich Apodaca ขอบคุณสำหรับลิงค์ doc ไม่ได้กล่าวถึงการยกเลิกกระบวนการ ดูเหมือนว่าทั้งหมดจะเป็นการสร้าง symlink ดังนั้นฉันสามารถลบสิ่งเหล่านั้นตามปกติได้หรือไม่
Tyler Collier

1
@TylerCollier NPM ยกเลิกการเชื่อมโยงที่ดูเหมือนจะเป็นการดำเนินงานภาพกระจกสะท้อนstackoverflow.com/a/24940024/54426
รวย Apodaca

1
แค่ทราบว่าถ้าคุณใช้ Angular2 (หรืออาจเป็นแอปพลิเคชันอื่น ๆ ) มีข่าวลือรอบ ๆ การเชื่อมโยง npm ที่เป็นสาเหตุของปัญหาบางประเภท ตัวอย่างที่นี่และที่นี่
ถั่วแดง

4
อย่างไรก็ตามโปรดทราบว่าnpm linkจะสร้างอินสแตนซ์ที่สองของการอ้างอิงภายนอก ดังนั้นถ้าคุณมีแพ็กเกจ A ต้องการ B และ C, B ต้องการ C. การลิงก์ B จะทำให้แอปพลิเคชัน A มี C สองอินสแตนซ์
user2167582

421

คุณเพียงแค่ระบุ<folder>อาร์กิวเมนต์หนึ่งตัวอาร์กิวเมนต์npm installควรชี้ไปที่โฟลเดอร์ในเครื่องแทนชื่อแพ็คเกจ:

npm install /path

5
ซึ่งแตกต่างจากลิงค์นี้ใช้. npmignore
Camille Wintz

30
@bithavoc อย่างน้อยที่สุดของ npm 5 การติดตั้งโฟลเดอร์จะสร้าง symlink ไม่ใช่สำเนา ดูdocs.npmjs.com/cli/install
Frank Tan

3
ฉันพยายามที่จะใช้วิธีนี้ แต่โมดูลของฉันไม่สามารถหาได้ว่ามันเป็นแบบเพื่อนพึ่งพา
Witalo Benicio

1
มันดีrm -rf node_modulesก่อนและnpm installหลังที่คุณเรียกใช้สคริปต์ของคำตอบ
Renato Back

3
@ Frankank ใช่ แต่จะทำพฤติกรรมเก่าได้อย่างไร? ฉันต้องการสำเนา!
ไมเคิล

150

ตั้งแต่ถูกถามและตอบโดยบุคคลเดียวกันฉันจะเพิ่มลิงก์ NPMเป็นทางเลือก

จากเอกสาร:

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

cd ~/projects/node-bloggy  # go into the dir of your main project
npm link ../node-redis     # link the dir of your dependency

[แก้ไข] ตั้งแต่ NPM 2.0 คุณสามารถประกาศการขึ้นต่อกันของท้องถิ่นได้ใน package.json

"dependencies": {
    "bar": "file:../foo/bar"
  }

11
อาจไม่ใช่เจตนาดั้งเดิมของคำถาม แต่อาจเป็นสิ่งที่คนส่วนใหญ่ที่ค้นหาผ่าน Google ต้องการ
Dusty J

1
คำตอบนี้ดูเหมือนว่าไม่สมบูรณ์คุณต้องทำงานnpm linkกับโฟลเดอร์หนึ่งครั้ง (เพื่อสร้าง symlink ทั่วโลก) จากนั้นเรียกใช้npm link package-nameภายในโฟลเดอร์ของโครงการ (เพื่อใช้ symlink ทั่วโลกในโครงการของคุณ) คำตอบด้านล่างคือคำตอบที่ถูกต้อง
โทมัส Potaire

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

1
วิธีที่สอง (ใช้file:วิธีการ) อนุญาตให้แอปของฉันและโมดูลในเครื่องแบ่งปันการพึ่งพา การทดสอบของฉันnpm linkส่งผลให้มีการอ้างอิงที่ซ้ำกันซึ่งจะแบ่งสิ่งต่าง ๆ หากจำเป็นต้องใช้การพึ่งพาเป็นซิงเกิล
Daniel Waltrip

ฉันมีแพคเกจท้องถิ่น (พูด package1), package2 มีการพึ่งพากล่าวถึงเส้นทางญาติของ package1 npm ฉันไม่ได้ติดตั้งแพ็กเกจเมื่อพา ธ สัมพัทธ์เริ่มต้นด้วย "file: ../../ package1" ทำงานเมื่อมันคือ '' ../../package1 "การเพิ่มไฟล์ในการเริ่มต้นหมายความว่าอะไร?
Dip686

16

npm pack + package.json

นี่คือสิ่งที่ได้ผลสำหรับฉัน:

ขั้นตอนที่ 1: เข้าmodule projectดำเนินการnpm pack:

นี่จะเป็นการสร้าง<package-name>-<version>.tar.gzไฟล์

ขั้นตอนที่ 2: ย้ายไฟล์ไปที่ consumer project

เป็นการดีที่คุณสามารถวางไฟล์ดังกล่าวทั้งหมดในtmpโฟลเดอร์ในconsumer-projectรูทของคุณ:

ขั้นตอนที่ 3: อ้างอิงในpackage.json:

"dependencies": {
  "my-package": "file:/./tmp/my-package-1.3.3.tar.gz"
}

ขั้นตอนที่ 4: Installแพ็คเกจ:

npm installหรือnpm iหรือyarn

แพ็คเกจของคุณควรอยู่ในconsumer-project's node_modulesโฟลเดอร์ของคุณ

โชคดี...


9

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

ตัวอย่างเช่น:

/local/mymodule/package.json:
  "name": "mymodule",
  "peerDependencies":
  {
    "foo": "^2.5"
  }

/dev/myproject/package.json:
  "dependencies":
  {
    "mymodule": "file:/local/mymodule",
    "foo": "^2.5"
  }

ในสถานการณ์สมมตินี้ชุด NPM ขึ้นmyprojectเป็นnode_modules/เช่นนี้

/dev/myproject/node_modules/
  foo/
  mymodule -> /local/mymodule

เมื่อโหนดโหลดmymoduleและrequire('foo')ทำงานโหนดจะแก้ไขmymodulesymlink จากนั้นจะค้นหาเฉพาะใน/local/mymodule/node_modules/(และบรรพบุรุษของมัน) fooเท่านั้นซึ่งไม่พบ แต่เราต้องการให้โหนดตรวจสอบ/local/myproject/node_modules/เนื่องจากเป็นที่ที่เรียกใช้โครงการของเราและfooติดตั้งที่ไหน

ดังนั้นเราอาจต้องวิธีที่จะบอกโหนดไปยังไม่ได้แก้ไข symlink นี้เมื่อมองหาfooหรือเราต้องมีวิธีที่จะบอก NPM ในการติดตั้งเป็นสำเนาของเมื่อไวยากรณ์ไฟล์พึ่งพาจะใช้ในการmymodule package.jsonฉันไม่พบวิธีที่จะทำอย่างใดอย่างหนึ่งโชคไม่ดี :(


ฉันพบวิธีแก้ปัญหาซึ่งกำหนดNODE_PATHให้ชี้ไปnode_modules/ที่ตำแหน่งที่fooติดตั้ง ดังนั้นสำหรับกรณีข้างต้นมันจะเป็นแบบนี้: NODE_PATH=/dev/myproject/node_modules/ นั่นทำให้mymoduleสามารถค้นหาfooได้
Paul Medynski

มีทางออกสำหรับ วางโมดูลการพึ่งพาในโฟลเดอร์รูทโปรเจ็กต์ กำหนดการอ้างอิงของคุณในpackage.jsonด้วยคำนำหน้า'file:'ปกติ ทำnpm iสิ่งนี้จะสร้าง symlink ใน node_modules ของโปรเจ็กต์รวมถึงการขึ้นต่อกันของมันอาจถูกนำไปใช้กับ node_modules ระดับบนสุดเช่นเดียวกับการพึ่งพาประเภทอื่น ๆ เวอร์ชัน npm ของฉันคือ v6.14.4 หลังจากใช้เวลาสองสามชั่วโมงในการแก้ไขปัญหานี้ให้หาวิธีแก้ไขที่นี่: ( atmos.washington.edu/~nbren12/reports/journal/ ...... ) ขอบคุณ nbren12
sasebot

ฉันมีปัญหาเดียวกัน ฉันพบคำตอบนี้: stackoverflow.com/questions/50807329/ …นี่แก้ปัญหาของฉันกับการพึ่งพาเพื่อนและห้องสมุดท้องถิ่น
theawless

0

ขาดคุณสมบัติหลักหรือไม่

อย่างที่คนก่อน ๆ ได้ตอบnpm --save ../location-of-your-packages-root-directoryไว้ ../location-of-your-packages-root-directoryแต่ต้องมีสองสิ่งในเพื่อให้มันทำงาน

1) package.jsonในไดเรกทอรีนั้นชี้ไปที่

2) mainคุณสมบัติในpackage.jsonต้องถูกตั้งค่าและใช้งาน ig "main": "src/index.js",หากไฟล์รายการสำหรับ../location-of-your-packages-root-directoryคือ../location-of-your-packages-root-directory/src/index.js

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