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"
]
}
ועבד.
