Angularビルド出力のカスタマイズ
問題の概要
Angular 18にアップグレード後、application
ビルダーを使用する際にカスタム出力パスを指定すると、意図せずbrowser
フォルダが生成されてしまう問題が発生します。
# 出力例(意図しないbrowserフォルダ構造)
/projects/project-x-backend/
└── wwwroot
└── browser # このフォルダが不要
├── index.html
├── ...
問題の再現条件:
- Angular 18の
application
ビルダーを使用 angular.json
に"browser": ""
設定を追加している- コマンドラインで
--output-path
をカスタマイズ:bashng build --output-path=/projects/project-x-backend/wwwroot --watch
これはビルド設定とCLI引数の優先順位が原因で発生します。angular.json
設定はプロジェクト直下の出力には有効ですが、カスタムパス指定時はデフォルト動作(browser
フォルダ生成)が適用されるためです。
最適な解決方法
方法1: 新しいビルド設定を追加(推奨)
元のdevelopment
設定を変更せず、watch用の専用設定を追加します。
angular.json
に以下を追加:
"projects": {
"project-x": {
"architect": {
"build": {
"configurations": {
"development": {
// 既存のdevelopment設定
},
"dev-watch": {
// development設定を継承しつつ出力パスを上書き
"outputPath": {
"base": "/projects/project-x-backend/wwwroot",
"browser": "" // 空設定でbrowserフォルダを抑制
},
// 他のdevelopment設定をここにコピー
}
}
}
}
}
}
ビルドコマンド:
ng build --watch --configuration dev-watch
方法2: デフォルト設定を直接変更
プロジェクトの出力先を常に固定できる場合、メイン設定を更新します。
"projects": {
"project-x": {
"architect": {
"build": {
"options": {
"outputPath": {
"base": "/projects/project-x-backend/wwwroot",
"browser": ""
}
},
"configurations": {
"development": {
"outputPath": {
"base": "/projects/project-x-backend/wwwroot",
"browser": ""
}
}
}
}
}
}
}
パス指定のヒント
プロジェクトルートからの相対パスには./
を付けます:
"base": "./public"
根本原因と設計変更
Angular 18のビルドシステムには以下の変更が導入されました:
ビルダー | 出力構造 | 用途 |
---|---|---|
application | /browser と /server を生成 | SSRアプリ向け(デフォルト) |
browser | フラットな単一出力 | クライアントサイドのみ |
--output-path
はベースパスのみを変更し、内部のフォルダ構造(browser
)は保持します。"browser": ""
設定はベースパス直下に出力するよう指示しますが、これはangular.json
で定義された設定でのみ有効です。
注意点
非推奨のbrowser-esbuild
ビルダーを提案する回答がありますが、Angularチームはこのビルダーの廃止を計画しています。長期サポートの観点からapplication
ビルダーの使用を推奨します。
ASP.NETユーザー向け対応
Microsoft SPAテンプレートを使用している場合、[プロジェクト名].client.esproj
を編集:
<!-- 変更前 -->
<StaticWebAssetBasePath>$(MSBuildProjectDirectory)\dist\project-name.client\</StaticWebAssetBasePath>
<!-- 変更後 -->
<StaticWebAssetBasePath>$(MSBuildProjectDirectory)\dist\project-name.client\browser\</StaticWebAssetBasePath>
まとめ
問題解決の鍵となる設定:
"outputPath": {
"base": "カスタムパス",
"browser": "" // 空設定が重要
}
適切なアプローチ:
- 頻繁に出力先を変更する ➡
dev-watch
のような追加設定を作成 - 出力先が固定 ➡
angular.json
のメイン設定を更新 - ASP.NET環境 ➡
.esproj
ファイルでパスを調整
これにより、Angular 18の新しいビルドシステムにおいても、クリーンな出力ディレクトリ構造を維持できます。