私は過去1週間かけてTypeScriptモノレポを構築しました。これはBazelを使用して構築し、Kubernetesにデプロイできます。しかし、パズルの最後のピースはAngular applicationをワークフロー全体に統合することです。と苦労しています。
├── WORKSPACE
├── BUILD.bazel
├── package.json
├── packages
│ ├── package1
│ ├── package2
│ └── package3
└── services
├── service1
├── service2
├── service3
+ └── angular-app
WORKSPACE
ファイルBUILD.bazel
ファイルpackage.json
が1つだけBUILD.bazel
ファイルがあります最後に、Angularアプリのk8s_object
を次のようにルートBUILD.bazel
ファイルに追加できるようにしたいと思います。
load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")
k8s_objects(
name = "kubernetes_deployment",
objects = [
"//services/service1",
"//services/service2",
"//services/service3",
+ "//services/angular-app"
]
)
bazel run :kubernets_deployment.apply
を実行すると、AngularアプリがKubernetesにデプロイされます。すでに完全に機能している他のサービスと同じです。デプロイプロセスには次のものが含まれます。
WORKSPACE
ファイルに追加するimport { something } from '@project/package1';
package.json
に追加する必要があります私のプロジェクトに似ている何かの実用的な例を見つけて驚いた: https://github.com/bazelbuild/rules_nodejs/tree/master/examples/angular 。しかし、判明したように、それらのモノレポの構造は多少異なります。彼らはscss
も使用します。これは私ではなく、NgRxまたはAngular Universalの統合もありません。そのため、テンプレートを使用しようとしましたが、できませんでしたそれを動作させます。
もちろん、私はBazelをAngularに追加するための文書化された方法も試しました: https://angular.io/guide/bazel 、これはクリーンなプロジェクトで機能するようです。 ng build --leaveBazelFilesOnDisk
を使用すると、Bazelファイルにアクセスすることができます。しかし、NgRxとローカルパッケージが見つからないというエラーメッセージが表示されました。
私はすべてをクリーンに設定する最初のステップを実行しましたangular project: https://github.com/flolu/cents-ideas/tree/4d444240cbbe2f8b015c4b7c85746c473bc6842b/services/client しかし、私は解決できないエラーを受け取ります:
ERROR: /home/flolu/Desktop/cents-ideas/services/client/src/app/BUILD.bazel:5:1: Compiling Angular templates (Ivy - prodmode) //src/app:app failed (Exit 1)
external/npm/node_modules/@angular/router/router.d.ts:2421:22 - error NG6002: Appears in the NgModule.imports of AppRoutingModule, but could not be resolved to an NgModule class.
This likely means that the library (@angular/router) which declares RouterModule has not been processed correctly by ngcc, or is not compatible with Angular Ivy. Check if a newer version of the library is available, and update if so. Also consider checking with the library's authors to see if the library is expected to be compatible with Ivy.
2421 export declare class RouterModule {
~~~~~~~~~~~~
external/npm/node_modules/@angular/router/router.d.ts:2421:22 - error NG6003: Appears in the NgModule.exports of AppRoutingModule, but could not be resolved to an NgModule, Component, Directive, or Pipe class.
This likely means that the library (@angular/router) which declares RouterModule has not been processed correctly by ngcc, or is not compatible with Angular Ivy. Check if a newer version of the library is available, and update if so. Also consider checking with the library's authors to see if the library is expected to be compatible with Ivy.
2421 export declare class RouterModule {
~~~~~~~~~~~~
external/npm/node_modules/@angular/platform-browser/platform-browser.d.ts:44:22 - error NG6002: Appears in the NgModule.imports of AppModule, but could not be resolved to an NgModule class.
This likely means that the library (@angular/platform-browser) which declares BrowserModule has not been processed correctly by ngcc, or is not compatible with Angular Ivy. Check if a newer version of the library is available, and update if so. Also consider checking with the library's authors to see if the library is expected to be compatible with Ivy.
44 export declare class BrowserModule {
~~~~~~~~~~~~~
src/app/app-routing.module.ts:11:14 - error NG6002: Appears in the NgModule.imports of AppModule, but itself has errors
11 export class AppRoutingModule { }
フロリアン、これまでのところ大きな進歩:)
angularの例でバゼル関連のファイルを注意深く調べて、必要なすべてのルール/関数をプロジェクトにコピーすることをお勧めします。ファイルは.bazelrc
、WORKSPACE
、 BUILD.bazel
(すべてのサブフォルダー)、rules_docker.patch
(WORKSPACEのhttp_archiveに適用されます)。
また、/src
フォルダー内のいくつかの非常に重要なファイル(それらはBUILDファイルで使用されます):rollup.config.js
、rxjs_shims.js
、main.dev.ts
、main.prod.ts
。また、example
フォルダには2つのindex.html
ファイルがあります。1つは製品用で、もう1つは開発用です。
ところで、この例にはすでにngrxが含まれているので、ぴったりかもしれません。BUILDファイルのng_module
ルールとその依存関係をよく見てください。 depをそこに追加するだけです(@npm//@ngrx/store
など)。
Angular Universalについては、現在Bazelでは十分にサポートされていないようです。追跡する問題は次のとおりです。 https://github.com/bazelbuild/rules_nodejs/issues/1126
そして、scssについては、単純なcssを使用する場合はクールです。それをng_module
のassets
フィールドに挿入するだけで、rules_sass(sass_binary、sass_libraryから追加のコンパイル手順を追加する必要はありません。 )。例からルールをコピーするときは無視してください。
プロジェクト構造での、NxからBazelへの移行の例を次に示します: https://github.com/scalio/nx-bazel-starter 。少し時代遅れですので、公式のものを優先する方が良いでしょう。ただし、Nxでのフォルダの構造など、いくつかの便利な機能が見つかる場合があります。実際、アイデアはあなたのものと非常によく似ています。サービスをアプリとして呼び出し、パッケージをライブラリとして呼び出し、共通のpackage.json
を共有するだけです。