typescript - peerDependency กำลังเขียนทับไลบรารี NX
ฉันกำลังใช้ monorepo กับ nx โดยมีโครงสร้างดังต่อไปนี้:
apps
| - my-app
libs
| - common
| - my-client
ไลบรารีจะถูกเผยแพร่บน npm หลังการดีพลอยภายใต้ชื่อ @my-org/my-client และ @my-org/common ในขณะที่ฉันกำหนด alias ของเส้นทางดังต่อไปนี้ (บน tsconfig.conf) เพื่อใช้งานโดยตรงบนโค้ดของ my-app:
"paths": {
"@my-org/my-client": ["libs/my-client/src/index.ts"],
"@my-org/common": ["libs/common/src/index.ts"]
}
ปัญหาคือ my-app กำลังใช้แพ็กเกจภายนอก another-external-package ที่ขึ้นอยู่กับ @my-org/common (มันกำลังนำเข้าเวอร์ชันที่เผยแพร่ของมัน)
เมื่อฉันนำเข้า @my-org/common ใน my-app ดูเหมือนว่ามันกำลังดึง peer dependency @my-org/common (จาก another-external-package) แทนที่จะมาจาก alias ที่ถูกกำหนดไว้ใน tsconfig.conf สิ่งนี้เกิดขึ้นเฉพาะเมื่อเราสร้างสำหรับ production แต่ไม่เกิดขึ้นในสภาพแวดล้อมการพัฒนา
มีไอเดียไหมว่าจะบอก nx/tsc ให้เลือกไลบรารีแทนแพ็กเกจที่เผยแพร่ได้อย่างไร?
คำตอบ #1
ฉันคิดว่าคุณสามารถใช้ package overrides ได้
ลองเพิ่มสิ่งนี้ในไฟล์ package.json ของคุณ: (ไม่แน่ใจว่าฉันใส่มันถูกต้องสำหรับสถานการณ์ของคุณหรือไม่)
"overrides": {
"@my-org/my-client": {
"@my-org/common": "$@my-org/common"
}
}
มีการอธิบายไว้ที่นี่: https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides
หากคุณต้องการทำการเปลี่ยนแปลงเฉพาะกับการพึ่งพาของการพึ่งพาของคุณ เช่น การเปลี่ยนเวอร์ชันของการพึ่งพาที่มีปัญหาด้านความปลอดภัยที่ทราบแล้ว การแทนที่การพึ่งพาที่มีอยู่ด้วยฟอร์ก หรือการทำให้แน่ใจว่าใช้เวอร์ชันเดียวกันของแพ็กเกจทุกที่ คุณสามารถเพิ่มการแทนที่ได้
Overrides ให้วิธีในการแทนที่แพ็กเกจในต้นไม้การพึ่งพาของคุณด้วยเวอร์ชันอื่น หรือแพ็กเกจอื่นโดยสิ้นเชิง การเปลี่ยนแปลงเหล่านี้สามารถกำหนดขอบเขตให้เฉพาะเจาะจงหรือตามความต้องการได้ตามต้องการ
คำตอบ #2
ฉันพบวิธีแก้โดยการเพิ่ม dependencies ที่ถูกระบุใน tsconfig.conf เข้าไปโดยตรงใน package.json แบบนี้:
"dependencies": {
"@my-org/common": "file:./libs/common"
}
สิ่งนี้ทำให้ my-app ใช้เวอร์ชันท้องถิ่นของ @my-org/common แทนการใช้การพึ่งพาเพียร์ที่ถูกแก้ไขผ่าน @my-org/my-client
ตามที่ @EcksDy กล่าว:
ชื่อแทนใน tsconfig.paths เป็นเพียงสำหรับ IDE ของคุณ การแก้ไขเกิดขึ้นในเวลาสร้างผ่านแพ็กเกจ ts-loader ในกรณีที่คุณกำลังใช้ webpack ซึ่งเป็นการตั้งค่าเริ่มต้นของ nx สำหรับแอป
@johey: เรื่องนี้ไม่ใช่เกี่ยวกับการแทนที่แพ็กเกจที่ถูกเรียกใน dependencies แต่เป็นการขอให้แอปใช้เวอร์ชันในเครื่องแทนเวอร์ชันที่เผยแพร่ :)
