Angular Library を Secondary Entry Points 構成にするための手順をメモ
試したリポジトリ GitHub - kasaharu/try-angular-lib-secondary-entrypoints
新規 application を作成
$ npx @angular/cli new try-angular-lib-secondary-entrypoints
Library project を作成
- ライブラリを作成する を参考に my-lib という名前で Library project を作る
$ yarn ng generate library my-lib
- projects/my-lib/ が作成される
my-lib の service を app.component で使う
Library side
- my-lib に作られた my-lib.service.ts に debug 用のメソッド実装
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class MyLibService {
constructor() {}
debug() {
console.log('MyLibService - debug');
}
}
- my-lib Library を build
$ yarn build my-lib
Application side
- app.module.ts で MyLibModule を import
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { MyLibModule } from 'my-lib';
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, MyLibModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
- app.component.ts で MyLibService の debug() を実行
import { Component, OnInit } from '@angular/core';
import { MyLibService } from 'my-lib';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(private myLibService: MyLibService) {}
title = 'try-angular-lib-secondary-entrypoints';
ngOnInit() {
this.myLibService.debug();
}
}

- ログが出ることを確認
Secondary Entry Points の作成
- Secondary Entry Points を参考にディレクトリとファイルを用意
作成するもの
- projects/my-lib/ 配下に以下のファイルを用意する
projects/my-lib/testing/
├── package.json
└── src
├── lib
│ ├── my-lib-testing.module.ts
│ └── my-lib-testing.service.ts
└── public_api.ts
package.json
{
"ngPackage": {}
}
public_api.ts
- [※ 注意] ng generate で作られる projects/my-lib/src/ 配下にあるのは public-api.ts だが、ここで作る必要があるファイル名は public_api.ts にしなければならないので注意
export * from './lib/my-lib-testing.service'; export * from './lib/my-lib-testing.module';
my-lib-testing.module.ts
import { NgModule } from '@angular/core';
@NgModule({
declarations: [],
imports: [],
exports: []
})
export class MyLibTestingModule {}
my-lib-testing.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class MyLibTestingService {
constructor() {}
debug() {
console.log('MyLibTestingService - debug');
}
}
- 作成する必要があるファイルはこれで全てなので、再度 Library を build する
application で使うために path を登録
- application で使うためには import path を tsconfig.json に登録する必要があるので、以下の diff の用に変更する
- ※ 注意 my-lib の登録は Angular CLI が自動的にセットしているが、手動で用意した Secondary Entry Points は path の設定も手動でする必要があるので注意
"my-lib": [
"dist/my-lib/my-lib",
"dist/my-lib"
+ ],
+ "my-lib/testing": [
+ "dist/my-lib/testing"
]
}
},
my-lib/testing の service を app.component で使う
- my-lib の時と同じように app.module.ts と app.component.ts に変更を加える
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { MyLibModule } from 'my-lib';
import { MyLibTestingModule } from 'my-lib/testing';
import { AppComponent } from './app.component';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, MyLibModule, MyLibTestingModule],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {}
app.component.ts
import { Component, OnInit } from '@angular/core';
import { MyLibService } from 'my-lib';
import { MyLibTestingService } from 'my-lib/testing';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(
private myLibService: MyLibService,
private myLibTestingService: MyLibTestingService
) {}
title = 'try-angular-lib-secondary-entrypoints';
ngOnInit() {
this.myLibService.debug();
this.myLibTestingService.debug();
}
}

- my-lib/testing の方のログも期待通り出力されることを確認