การพึ่งพาท้องถิ่นใน package.json


453

ผมต้องการที่จะทำอะไรเช่นนี้จึงnpm installยังติดตั้งpackage.jsonของ../somelocallibหรือที่สำคัญกว่าพึ่งพา

"dependencies": {
    "express": "*",
    "../somelocallib": "*"
}

คำตอบ:


583

npm> = 2.0.0

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

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

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

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

แพคเกจท้องถิ่นจะถูกคัดลอกไปยังคำนำหน้า ( ./node-modules)

npm <2.0.0

ใส่การsomelocallibพึ่งพาของคุณpackage.jsonตามปกติ:

"dependencies": {
  "somelocallib": "0.0.x"
}

จากนั้นเรียกใช้npm link ../somelocallibและ NPM จะติดตั้งรุ่นที่คุณกำลังทำงานบนเป็นลิงก์สัญลักษณ์

app@0.0.1 /private/tmp/app
└── somelocallib@0.0.1 -> /private/tmp/somelocallib

อ้างอิง: ลิงค์ (1)


3
เราจะยกเลิกการเชื่อมโยงได้อย่างไร
AtaurRehman ซาด

13
ข้อเสียของการติดตั้งแพ็คเกจโลคัลด้วย "ลิงค์ npm" คือคุณได้รับโมดูลซ้ำซ้อนมากมาย เมื่อคุณแสดงรายการการพึ่งพาของคุณด้วย "module: version" หรือ "module: git-repo" อัลกอริทึมการติดตั้ง NPM หลีกเลี่ยงการติดตั้งแพคเกจที่ติดตั้งแล้วในแพคเกจผู้ปกครอง ดังนั้นด้วย "ลิงก์ npm" หากแอปพลิเคชันหลักของคุณขึ้นอยู่กับ "async@0.8.0" และแพคเกจท้องถิ่นทั้งหมดของคุณก็ขึ้นอยู่กับ "async@0.8.0" คุณจะจบลงด้วยแพ็คเกจท้องถิ่นทั้งหมดที่ติดตั้ง "async@0.8 0 "แทนที่จะใช้แอปพลิเคชันหลัก" async "รุ่นเดียวกัน สิ่งนี้ไม่ได้เกิดขึ้นโดยใช้ "โฟลเดอร์ติดตั้ง npm"
Pedro Ballesteros

3
@PedroBallesteros คุณสามารถใช้npm dedupเพื่อแก้ไขปัญหานี้ npmjs.org/doc/cli/npm-dedupe.html
danilopopeye

4
"แพคเกจท้องถิ่นจะถูกคัดลอก ... " ดูเหมือนจะไม่เป็นกรณีที่มีรุ่นต่อนาทีล่าสุด ตอนนี้ symlink ถูกสร้างขึ้น
tsauerwein

2
@danilopopeye ต่อdocs.npmjs.com/cli/install npm install <folder>คำอธิบายว่าติดตั้งแพคเกจในไดเรกทอรีเป็น symlink ในโครงการปัจจุบัน
Herman J. Radtke III

211

ตอนนี้คุณสามารถระบุพา ธ การติดตั้งโมดูลโหนดโลคัลในของคุณpackage.jsonโดยตรง จากเอกสาร:

เส้นทางท้องถิ่น

ตั้งแต่เวอร์ชัน 2.0.0 คุณสามารถระบุพา ธ ไปยังโลคัลไดเร็กทอรีที่มีแพ็กเกจ สามารถบันทึกเส้นทางท้องถิ่นโดยใช้npm install -Sหรือnpm install --saveใช้รูปแบบใด ๆ ต่อไปนี้:

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

package.jsonซึ่งในกรณีที่พวกเขาจะปกติกับทางญาติและเพิ่มไปยังคุณ ตัวอย่างเช่น:

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

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


23
ใน npm v.3 + การปรับสภาพให้สมบูรณ์นั้นไม่ใช่แบบสัมพัทธ์ดังนั้นคุณจะเห็นบางสิ่งบางอย่าง"bar": "file:///home/user/src/foo/bar"
Ron Wertlen

27
จะอัปเดตพา ธ ในระบบโดยไม่เพิ่มรุ่นได้อย่างไร
Bohdan Lyzanets

3
โดยวิธีการนี้จะทำให้ทุกชนิดของปัญหาเมื่อใดและ / หรือถ้าคุณพยายามที่จะ dockerize ประยุกต์ใช้โหนดของคุณเป็นมาตรฐานเฉพาะภาพที่คัดลอกไดเรกทอรีปัจจุบันและทำให้ออกจากสิ่งที่อยู่ในnode:onbuild ../foo
donmartin

4
มีวิธีใดที่จะรวมสิ่งนี้กับ git + ssh ดังนั้นเราจึงสามารถมีสำเนาของพื้นที่เก็บข้อมูล git ที่พวกเขาnpm installจากหรือพื้นที่เก็บข้อมูล git อื่นบน LAN? เมื่อฉันลองข้างต้นและติดตั้ง npm จาก git + ssh ดูเหมือนจะดูในไดเรกทอรี node_modules และไม่พยายามที่จะไปมากกว่า git + ssh แม้ว่านั่นเป็นวิธีที่ฉันกำลังติดตั้งแพคเกจระดับบนสุด
Michael

1
การติดตั้งงาน แต่วิธีนี้ฉันจะได้รับ "ไม่พบ ERR" เมื่อพยายามนำเข้าโมดูลในโครงการของฉัน
C4d

87

มันใช้งานได้สำหรับฉัน

วางสิ่งต่อไปนี้ในไฟล์ package.json ของคุณ

"scripts": {
    "preinstall": "npm install ../my-own-module/"
}

4
ขอขอบคุณสำหรับข้อเสนอแนะที่ไม่จำเป็นต้องใช้ "ลิงก์ npm"
ItalyPaleAle

มันออก.gitignoreในโฟลเดอร์โมดูลที่สร้างขึ้น.npmignoreและเป็นครั้งแรกที่ฉันวิ่งมันใช้ 777 node_modulesซ้ำในโฟลเดอร์ทั้งหมดยกเว้น แต่ใช่มันติดตั้งการอ้างอิง ใช้ npm เวอร์ชั่น 1.4.14
L0LN1NJ4

ใช้สิ่งนี้ แต่แทนที่จะล้อเล่นกับ node_modules ฉันใช้ app_modules
catalint

1
ทำไม "dependencies": { "my-own-module": "file:../my-own-module" }ล่ะ
Bohdan Lyzanets

1
ฉันเห็นด้วยกับ @Bohdan ที่นี่ ผู้ที่อยู่ในท้องถิ่นจะทำสิ่งเดียวกัน ข้อดีของการใช้npm linkคือคุณไม่จำเป็นต้องทำnpm installในแต่ละครั้งเพื่อให้การอ้างอิงของคุณเป็นปัจจุบัน
froginvasion

30

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

"scripts": {
    "postinstall": "npm link ../somelocallib",
    "postupdate": "npm link ../somelocallib"
  }

สิ่งนี้ให้ความรู้สึกเกินความเป็นแฮ็ค แต่ดูเหมือนจะ "ทำงาน" รับเคล็ดลับจากปัญหา npm นี้: https://github.com/npm/npm/issues/1558#issuecomment-12444454


15
ทำไมpostinstallและpostupdateแทนที่จะเป็นpreinstallและpreupdate?
rightfold

1
คุณช่วยอธิบายเพิ่มเติมสิ่งนี้ได้อีกเล็กน้อย เช่นถ้าฉันตั้งค่าโครงการ vscode ที่มีหลายโฟลเดอร์รูท (เช่น "multi-root workspace") มันจะสามารถสะท้อนการเปลี่ยนแปลงในโฟลเดอร์โมดูลทันทีสำหรับโครงการที่กินได้หรือไม่? - นั่นคือสิ่งที่แฮ็คนี้เกี่ยวกับ?
bvdb

26

นี่คือวิธีที่คุณจะเพิ่มการพึ่งพาในท้องถิ่น:

npm install file:src/assets/js/FILE_NAME

เพิ่มไปยัง package.json จาก NPM:

npm install --save file:src/assets/js/FILE_NAME

เพิ่มไปยัง package.json โดยตรงเช่นนี้:

....
  "angular2-autosize": "1.0.1",
  "angular2-text-mask": "8.0.2", 
  "animate.css": "3.5.2",
  "LIBRARY_NAME": "file:src/assets/js/FILE_NAME"
....

6

โครงการปริญญาโท

นี่คือ package.json ที่คุณจะใช้สำหรับโครงการหลัก:

"dependencies": {
    "express": "*",
    "somelocallib": "file:./somelocallib"
}

มี./somelocallibการอ้างอิงไปยังโฟลเดอร์ห้องสมุดเป็นเทียบกับ package.json

การอ้างอิง: https://docs.npmjs.com/files/package.json#local-paths


โครงการย่อย

จัดการการอ้างอิงไลบรารีของคุณ

นอกจากนี้ในการทำงานคุณจะต้องเรียกใช้npm install(cd node_modules/somelocallib && npm install)

นี่เป็นข้อผิดพลาดที่รู้จักกับ NPM

การอ้างอิง: https://github.com/npm/npm/issues/1341 (ค้นหาการอ้างอิงที่ทันสมัยมากขึ้น)


หมายเหตุสำหรับนักเทียบท่า

ตรวจสอบเจ้านายของคุณpackage.lockและsomelocallib/package.lockผู้จัดการแหล่งที่มาของคุณ

จากนั้นใน Dockerfile ของคุณใช้:

FROM node:10
WORKDIR /app
# ...
COPY ./package.json ./package-lock.json ./
COPY somelocallib somelocallib
RUN npm ci
RUN (cd node_modules/zkp-utils/ && npm ci)
# ...

ฉันใช้วงเล็บใน(cd A && B)โครงสร้างของฉันเพื่อให้การดำเนินการ idempotent


3

ฉันรู้ว่าใช้npm install ../somelocallibงานได้

แต่ผมไม่ทราบหรือไม่ว่าไวยากรณ์คุณแสดงในคำถามที่จะทำงานจากที่package.json...

น่าเสียดายที่หมอดูเหมือนจะพูดถึง URL ว่าเป็นการอ้างอิงเท่านั้น

ลองfile:///.../...tar.gzชี้ไปที่ lib ท้องถิ่นซิปแล้วบอกเราว่ามันใช้งานได้หรือไม่


1
ฉันเพิ่ม "dependencies": {"somemodule": "file: ///./internal_modules/somemodule"} ไปยัง package.json มันไม่ทำงาน รหัสข้อผิดพลาดคือ "npm ERR! code E404"
เจฟฟรีย์

2

สิ่งนี้ใช้ได้สำหรับฉัน: อันดับแรกตรวจสอบให้แน่ใจว่าไดเรกทอรี npm มีผู้ใช้ที่เหมาะสม

sudo chown -R myuser ~/.npm
sudo chown -R myuser /usr/local/lib/node_modules

จากนั้นใน package.json ของคุณลิงก์ไดเรกทอรี

"scripts": {
 "preinstall": "npm ln mylib ../../path/to/mylib"
}, 
"dependencies": {
  "mylib" : "*"
}

2
การเชื่อมโยงสัญลักษณ์บน Windows เป็นไปได้ตั้งแต่ XP en.wikipedia.org/wiki/NTFS_symbolic_link npm installเปิดบรรทัดคำสั่งในฐานะผู้ดูแลแล้วเรียกใช้
สด

2

ที่จริงแล้วในช่วง npm 2.0 มีการสนับสนุนเส้นทางท้องถิ่นแล้ว (ดูที่นี่ )


8
Michael Trouw ได้ให้คำตอบนี้เมื่อสองสามสัปดาห์ก่อนทำไมจึงเป็นคำซ้ำกัน
Dan Dascalescu

2

อยากรู้อยากเห็น ..... อย่างน้อยใน Windows (npm ของฉันคือ 3.something) ฉันต้องทำ:

"dependencies": {
 "body-parser": "^1.17.1",
 "module1": "../module1",
 "module2": "../module2",

เมื่อฉันทำnpm install ../module1 --saveมันส่งผลให้เส้นทางที่แน่นอนและไม่ได้ญาติต่อเอกสาร

ฉันทำเลอะเทอะมากขึ้นและตัดสินใจว่า../xxxเพียงพอแล้ว

โดยเฉพาะฉันมีโลคัลโหนดโมดูลที่เช็กเอาต์เพื่อบอกว่า d: \ build \ module1, d: \ build \ module2 และโปรเจ็กต์โหนดของฉัน (แอ็พพลิเคชัน) ใน d: \ build \ nodeApp

ในการ 'ติดตั้ง' ฉัน:

d:\build\module1> rmdir "./node_modules" /q /s && npm install
d:\build\module2> rmdir "./node_modules" /q /s && npm install
d:\build\nodeApp> rmdir "./node_modules" /q /s && npm install

package1's package.json มีการพึ่งพา "module2": "../module2"; module2 ไม่มีการพึ่งพาในท้องถิ่น nodeApp มีการพึ่งพา "module1": "../module1" และ "module2": "../module2"

ไม่แน่ใจว่าจะใช้งานได้กับฉันหรือไม่เนื่องจากทั้ง 3 โฟลเดอร์ (module1, module2 และ nodeApp) อยู่ในระดับเดียวกันนั้น .......


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