TypeScript - ספריות Angular ותלותית חוצה


אני מחפש עזרה עם ספריות Angular7.

יש לי פרויקט A שבו פיתחתי שני ספריות - ספריה 1 ו-ספריה 2. הספריה השנייה (ספריה 2) תלויה בספריה הראשונה (ספריה 1). מאוחר יותר, בפרויקט אחר, נגיד פרויקט B, ייתכן שאשתמש ב-ספריה 2.

הבעיה שלי היא בהגדרת ש-ספרייה 2 תלויה ב-ספרייה 1. כיום, שתי הספריות נבנות בתיקייה libs/ שבשורש הפרויקט - מה שגורם לייבוא של ספרייה 2 מ-ספרייה 1 לעבוד גם עם וגם בלי הגדרת התלות ב-ספרייה 1 בקובץ package.json שלה.

ספרייה 1 package.json

{
  "name": "library-1",
  "version": "0.0.1",
  "peerDependencies": {
    "@angular/common": "^7.1.0",
    "@angular/core": "^7.1.0"
  }
}

ספרייה 2 package.json

{
  "name": "library-2",
  "version": "0.0.1",
  "peerDependencies": {
    "@angular/common": "^7.1.0",
    "@angular/core": "^7.1.0",
    "@angular/material": "7.2.0",
    "library-1": "0.0.1"
  }
}

גם, מיקום הבנייה + הפיתוח שלהם מוגדר בקובץ tsconfig.json הראשי:

{
  ...,
  "compilerOptions": {
    ...,
    "paths": {
      "library-1": ["libs/library-1", "projects/library-1/src/"],
      "library-1/*": ["libs/library-1/*", "projects/library-1/src/*"],
      "library-2": ["libs/library-2", "projects/library-2/src/"],
      "library-2/*": ["libs/library-2/*", "projects/library-2/src/*"]
    }
  }
}

האם יש דרך שבה אני יכול להבהיר שהספרייה השנייה לא מתקומפלת אם הראשונה לא מותקנת?

תשובה #1

אם מישהו אחר מריץ התקנה דומה ורוצה לדעת מה אני עשיתי.

1. נוספו הנתיבים לספריות השונות שמפנים ל-public_api.ts הספציפי ב-קובץ tsconfig.json ברמת השורש. זה מאפשר הידור בזמן אמת כשאתה משתמש בספרייה בפרויקט הראשי.

{ 
   ...options,
   "paths": { 
       "library-1": "projects/library-1/src/public_api.ts",
       "library-2": "projects/library-2/src/public_api.ts"
   }
}

2. נוסף תלות עמית ב-package.json של library-2 ל-library-1. זה יציג אזהרה אם תשתמש ב-library-2 בפרויקט מבלי להוסיף גם את library-1 כתלות.

{
    ...options, 
    "peerDependencies": {
         "library-1": "0.1"
     }
}

3. נוסף קובץ tsconfig.build.json נוסף שמרחיב את tsconfig.lib.json ומחליף את הנתיב עבור library-1 מה-tsconfig הראשי כדי להשתמש בקוד המהודר של הספרייה הזו. זה יבנה את library-2 עם המקורות המהודרים ולא פשוט ישלב אותו וייבא ישירות מ-library-1.

{
  "extends": "./tsconfig.lib.json",
  "compilerOptions": {
    "paths": {
      "library-1": ["dist/libs/library-1"]
    }
  }
}

4. השתמש בפקודה הבאה כדי לבנות את library-2 כך ש-tsconfig.build.json החדש ישמש.

ng-packagr -p projects/library-2/ng-package.json -c projects/library-2/tsconfig.build.json

תשובה #2

קיבלתי את אותה השגיאה שהייתה לנו בקובץ tsconfig.json

 "paths": {
      "dxp-lib-commons": [
        "projects/dxp-lib-commons/src/public-api.ts"
      ],
      "dxp-lib-components": [
        "projects/dxp-lib-components/src/public-api.ts"
      ],
      "dxp-lib-services": [
        "projects/dxp-lib-services/src/public-api.ts"
      ]
    },

כך שקומונס הוא הבסיס לשניים האחרים, הפניתי ל-public-api.ts ב-develop והשתמשתי בו במהירות. אך כאשר עשינו קומפילציה על זה, זה יקרוס עם 'rootDir' צפוי להכיל את כל קבצי המקור.

אז אחרי שראיתי כמה פוסטים גיליתי שבבנייה יש צורך להצביע ל-dist ול-compiled commons ולא ל-public-api.ts אז על קומפוננטות ושירות הוספתי ל-tsconfig.lib.prod.json

"paths": {
  "dxp-lib-commons": [
    "dist/dxp-lib-commons"
  ]
}

ועבד.