Последовательность действий

Создаем приложение для ng new monorepo --createApplication=false

npx lerna init

ng g lib first

Изменим путь где lerna будет искать пакеты на путь где angular хранит свои проекты

1
2
3
4
5
6
{
  "packages": [
    "projects/*"
  ],
  ...
}

Теперь папку packages, автоматически созданную lerna, можно удалить rm -r packages

И создадим пару библиотек ng g lib first ng g lib second

Если требуется, меняем имена пакетов в библиотеках

1
2
3
4
{
  "name": "@company/first",
  ...
}
1
2
3
4
{
  "name": "@company/second",
  ...
}

npx lerna add --peer "@company/first --scope @company/second As peer dependency (recommended by angular)

Настроим параметры сборки библиотки first package.json

1
2
3
4
5
6
{
  ...
  "scripts": {
    "build": "ng build first"
  },
}

`ng-package.json’

1
2
3
4
5
6
7
{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "dist",
  "lib": {
    "entryFile": "src/public_api.ts"
  }
}

Так же надо настроить и вторую библиотеку

Запустим магию lerna

npx lerna bootstrap --contents dist

В projects/second/node_modules будет создана ссылка на projects/first/dist

tsconfig.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
  ...
  "compilerOptions": {
    ...
    "paths": {
      "first": [
        "projects/first/dist"
      ],
      "first/*": [
        "projects/first/dist/*"
      ],
      "second": [
        "projects/second/dist"
      ],
      "second/*": [
        "projects/second/dist/*"
      ]
    }
  }
}

Конфиги

package.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "name": "common",
  "version": "0.0.10",
  "scripts": {
    "start": "ng build common --watch",
    "test": "ng test common --watch false",
    "prebuild": "rm -rf dist/",
    "build": "ng build common"
  },
  "peerDependencies": {
    "@angular/common": "^7.2.0",
    "@angular/core": "^7.2.0"
  },
  "gitHead": "13011be991c8544d372a99b52f8dffc5d89dc4c3"
}

ng-package.json

1
2
3
4
5
6
7
{
  "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
  "dest": "dist",
  "lib": {
    "entryFile": "src/public_api.ts"
  }
}

lerna.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "packages": [
    "projects/*"
  ],
  "version": "independent",
  "command": {
    "publish": {
      "conventionalCommits": true,
      "message": "chore(release): release"
    },
    "version": {
      "push": false
    }
  }
}
1
2
3
lerna bootstrap --contents dist 
lerna run build
lerna publish  --contents dist

tsconfig.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "paths": {
     "first": [
       "projects/first/dist"
     ],
     "first/*": [
       "projects/first/dist/*"
     ],
     "second": [
       "projects/second/dist"
     ],
     "second/*": [
       "projects/second/dist/*"
    ]
  }
}

Осталось добавить в .gitignore **/dist и исправить /node_modules на node_modules

И можно пользоваться: ng build first ng build second

Links: