ค้นหาเว็บไซต์

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 แต่เป็นการขอให้แอปใช้เวอร์ชันในเครื่องแทนเวอร์ชันที่เผยแพร่ :)