วิธีระบุโมดูลโลคัลเป็นการขึ้นต่อกันของแพ็กเกจ npm


267

ฉันมีแอปพลิเคชันที่มีชุดการพึ่งพาปกติในโมดูลของบุคคลที่สาม (เช่น 'express') ที่ระบุในไฟล์ package.json ภายใต้การอ้างอิง เช่น

"express"     : "3.1.1"

ฉันต้องการจัดโครงสร้างโค้ดของตัวเองแบบโมดูลาร์และมีชุดของโลคัล (หมายถึงระบบไฟล์ที่ฉันอยู่) โมดูลจะถูกติดตั้งโดย package.json ฉันรู้ว่าฉันสามารถติดตั้งโมดูลโลคัลโดยรัน:

npm install path/to/mymodule

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

ฉันแน่ใจว่านี่เป็นวิธีบอก"dependencies": {}โครงสร้างที่ฉันต้องการให้ติดตั้งจากเส้นทางของระบบไฟล์ แต่ไม่ทราบว่าจะต้องทำอย่างไร

ใครมีปัญหานี้ ขอบคุณ


1
เป็นคำถามที่ดีจริงๆ น่าเศร้าที่จะรู้ว่าไม่มีคุณสมบัติในการเพิ่มเทียบเท่าpackage.jsonกับสิ่งที่เรามีในGemfiles
Jarl

3
ซ้ำซ้อนกับLocal Local ใน package.json
Kelly

คำตอบ:


405

npm install ตอนนี้รองรับสิ่งนี้

npm install --save ../path/to/mymodule

สำหรับการทำงานจะต้องมีการกำหนดค่าเป็นโมดูลของตัวเองmymodule package.jsonดูการสร้างโมดูล NodeJS

ตั้งแต่ npm 2.0 สามารถรองรับการพึ่งพาในท้องถิ่นได้ ดูคำตอบ danilopopeye เพื่อคำถามที่คล้ายกัน ฉันได้คัดลอกคำตอบของเขาที่นี่เนื่องจากคำถามนี้มีอันดับสูงมากในผลการค้นหาเว็บ

คุณลักษณะนี้มีการใช้งานในเวอร์ชัน 2.0.0 ของ npm ตัวอย่างเช่น:

{
  "name": "baz",
  "dependencies": {
    "bar": "file:../foo/bar"
  }
}

เส้นทางใด ๆ ต่อไปนี้จะใช้ได้เช่นกัน:

../foo/bar
~/foo/bar
./foo/bar
/foo/bar

การซิงค์อัพเดท

ตั้งแต่npm installคัดลอกmymoduleเข้าสู่node_modulesการเปลี่ยนแปลงในmymoduleที่มาของโครงการจะไม่ถูกมองเห็นโดยอัตโนมัติ

มีสองวิธีในการอัพเดตโครงการที่ต้องพึ่งพาด้วย

  • อัพเดตเวอร์ชันmymoduleและจากนั้นใช้npm update : อย่างที่คุณเห็นด้านบนรายการpackage.json"การอ้างอิง" ไม่รวมตัวระบุเวอร์ชันตามที่คุณจะเห็นสำหรับการอ้างอิงปกติ แต่สำหรับการอ้างอิงในท้องถิ่นnpm updateเพียงแค่พยายามที่จะทำให้แน่ใจว่าล่าสุดรุ่นมีการติดตั้งตามที่กำหนดโดย'smymodule package.jsonดูคำตอบของ chriskelly สำหรับปัญหาเฉพาะนี้

  • npm installติดตั้งโดยใช้ สิ่งนี้จะติดตั้งสิ่งใดก็ตามที่อยู่ในmymoduleเส้นทางของแหล่งที่มาแม้ว่าจะเก่ากว่าหรือมีสาขาอื่นที่เช็คเอาท์ก็ตาม


2
สิ่งนี้ใช้ได้สำหรับฉัน (ฉันเพิ่งทำเส้นทางญาติในท้องถิ่นเช่น"mymodule":"file:mymoduledir"
Don Rhummy

72
npm install --save ../my-local-repo
Ivan Rave

15
และวิธีการใช้ในโครงการ? ฉันพยายามโทรหาimport { HelloWorld } from "my-test-lib";แต่ฉันได้รับข้อผิดพลาด "โมดูลค้นหา Cant" โปรดดูที่stackoverflow.com/questions/46818083/…
Vitalii Vasylenko

6
@LucioMollinedo คุณสามารถแบ่งปันไวยากรณ์ของวิธีที่คุณนำเข้าโมดูลท้องถิ่นหรือไม่ เช่นเดียวกับ Vitallii ฉันได้รับข้อผิดพลาด "Can't fine module" ด้วยimport { HelloWorld } from "my-test-lib";
Stan James

7
สิ่งนี้ไม่ทำงานเหมือนกับการอ้างอิงแพคเกจเนื่องจากการติดตั้งไม่ขึ้นกับโครงการ
Glass Cannon

44

โปรดดู: การพึ่งพาท้องถิ่นใน package.json

ดูเหมือนว่าคำตอบคือnpm link: https://docs.npmjs.com/cli/link


5
จริง ๆ แล้วลิงก์ npm จะสร้าง symlink เท่านั้นและจะไม่แก้ไข package.json เพื่อเพิ่มการพึ่งพาในพื้นที่
Sebastien H.

1
แต่ถ้าไม่ใช่symlinkโครงการแม่จะรู้ได้อย่างไรว่าจะสร้างใหม่ได้อย่างไรเมื่อการพึ่งพาสร้างเสร็จแล้ว?
Jamie Hutber

11

ฉันไม่พบวิธีที่เรียบร้อยในที่สุดดังนั้นฉันจึงไปสร้างไดเรกทอรีชื่อlocal_modulesแล้วเพิ่ม bashscript นี้ไปยัง package.json ในสคริปต์ -> ติดตั้งล่วงหน้า

#!/bin/sh
for i in $(find ./local_modules -type d -maxdepth 1) ; do
    packageJson="${i}/package.json"
    if [ -f "${packageJson}" ]; then
        echo "installing ${i}..."
        npm install "${i}"
    fi
done

5

หลังจากที่ต้องดิ้นรนมากกับnpm linkคำสั่ง (แนะนำวิธีแก้ปัญหาสำหรับการพัฒนาโมดูลท้องถิ่นโดยไม่ต้องเผยแพร่พวกเขาไปยังรีจิสทรีหรือเก็บรักษาสำเนาที่แยกต่างหากในโฟลเดอร์ node_modules) ฉันสร้างโมดูล npm ขนาดเล็กเพื่อช่วยแก้ไขปัญหานี้

การแก้ไขต้องใช้สองขั้นตอนง่าย

ครั้งแรก:

npm install lib-manager --save-dev

ประการที่สองเพิ่มสิ่งนี้ในpackage.json:

{  
  "name": "yourModuleName",  
  // ...
  "scripts": {
    "postinstall": "./node_modules/.bin/local-link"
  }
}

รายละเอียดเพิ่มเติมที่https://www.npmjs.com/package/lib-manager หวังว่าจะช่วยใครซักคน


0

หากสามารถเผยแพร่โมดูลของคุณที่ติดตั้งไว้ล่วงหน้าใน node_modules พร้อมกับไฟล์อื่น ๆ ของคุณคุณสามารถทำได้ดังนี้:

// ./node_modules/foo/package.json
{ 
  "name":"foo",
  "version":"0.0.1",
  "main":"index.js"
}

// ./package.json
...
"dependencies": {
  "foo":"0.0.1",
  "bar":"*"
}

// ./app.js
var foo = require('foo');

คุณอาจต้องการจัดเก็บโมดูลของคุณใน git และแจ้งให้ผู้ปกครองของคุณ package.json เพื่อติดตั้งการพึ่งพาจาก git: https://npmjs.org/doc/json.html#Git-URLs-as-Dependencies


5
น่าเสียดายที่ต้องเกี่ยวข้องกับ node_modules ที่มีโมดูลโลคัลของฉันและโมดูลบุคคลที่สาม / ส่วนร่วมติดตั้งจากรีจิสทรี (เช่นเชื่อมต่อ) ในไดเรกทอรีเดียวกัน นอกจากนั้นการสร้างความสับสนจากมุมมอง Git / VCS (เช่นจะต้องละเว้นทั้งหมดใน node_modules ยกเว้นที่ฉันสร้างขึ้น) ก็เป็นการปฏิบัติที่ไม่ดี (สิ่งที่ฉันเขียนและไม่ได้เผยแพร่ควรแยกต่างหากจากสิ่งอื่นที่เขียนและตีพิมพ์ )
Sam Adams

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