現在、Angular4には3つの異なる環境があります。
ここで、vstsビルドパイプラインで、1つの定義がアーティファクトをデバッグおよびリリース用に準備するマルチ構成をセットアップしました。
「 Replace tokens 」タスクを使用して、npm installおよびnpm run {デバッグまたはリリース)次に、デバッグまたはリリース環境用のファイルをパックするためにwebpackを実行します。
.jsonファイル(appsettings.jsonなど)の変数を置き換えることができるリリースの変数を置き換えるオプションがあることを確認しました:
しかし問題は、webpackがソースコードを1つのbundle.jsにパックするときです。環境変数を置き換えるためにreleaseを使用できないと思いますか?できますか?
したがって、私が達成したいのは、デバッグとリリースのビルドを分離することです。これは簡単です。デバッグとリリースの個別の定義を再作成するだけで、環境ごとに変数を置き換えるだけです。 2番目の段階は、ビルドパイプラインからトークンの置き換えタスクを実際に削除し、リリース変数セクションを使用して、リリースで設定された環境ごとの変数を置き換えることです。 Angular for webpack build js bundle in js?
environment.xx.ts
ファイルから構成値を取得し、angularブートストラップ時に実行時に取得するjson構成ファイルにそれらを配置できます。
リリースするときは、前述のトークン置換タスクを使用して、jsonファイルのトークンを置き換えます。
(使いやすくするために)構成オブジェクトのクライアント側で構造が同じである限り、jsonファイルの構造は重要ではありません。構造が同じでない場合は、取得したデータを変換して構成オブジェクトに割り当てる必要があります。
config.json
{
"envName": "@@envName@@",
"ApplicationInsights": { "InstrumentationKey": "@@xxx@@" }
}
次に、あなたのangularアプリに一致するクラスがあります
export class MyConfig
{
readonly envName: string;
readonly ApplicationInsights:
{
readonly InstrumentationKey: string
}
}
Jsonデータangular side(と呼ばれるjsonData
)を取得したら、それを構成オブジェクトに割り当てます
config-service.ts
export let CONFIG: MyConfig;
//Modify jsonData if needed
let t = new MyConfig();
CONFIG = Object.assign(t, jsonData);
component.ts
import {CONFIG} from '../config-service.ts';
//...
//use it
let url = CONFIG.ApplicationInsights.InstrumentationKey;
完全な実装
最も単純で最も効率的なアプローチは、Angular環境ファイルにトークンを作成し、リリースでTokenizerを使用して、メインバンドルにコンパイルされたトークンを置き換えることです。このアプローチでは、既存のコードは変更する必要があります。
つまり、プロジェクトではなく、CI/CDで環境変数を管理します。 (プロジェクトには、ローカルで実行するためのデフォルトの環境ファイルが必要です。ローカルテストでは他のファイルが必要になる場合があります)
これを行うには、最初にAngular environment.deploy.ts
などのデプロイメント環境を作成します。これは、ビルドで使用するものです(1つのビルドのみ、複数のリリース)。
environment.deploy.ts
の例を次に示します。
export const environment = {
displayLeftPanel: "__env.displayLeftPanel__".toLowerCase() === "true",
siteName: "__env.siteName__",
apiUrl: "__env.apiUrl__",
};
(名前の前にenv.
を追加して、トークン名がバンドル内の既存の名前と衝突しないようにします)
リリース変数で、環境ごとにこれらの変数を構成します。
env.displayLeftPanel
env.siteName
env.apiUrl
リリースの展開では、以下のようなタスクが必要になります(以下はIISの場合ですが、これを他のすべてのロードマップとして使用できます)
以下のタスクは次の問題に対処します:
main.20f8aa2b341c1c2f6442.bundle.js
)。 Tokenizerに渡す正確なファイル名を取得する必要があります。ここにタスクがあります:
PowerShell:メインバンドル名を取得します。次のようなもの:(パスを調整する必要があるかもしれません)
$ MainBundleFileName =(get-item $(System.DefaultWorkingDirectory)/ main。*。bundle.js).FullName; Write-Host "## vso [task.setvariable variable = MainBundleFileName;] $ MainBundleFileName"
Tokenizer:メインバンドルで変数の置換を実行> $(MainBundleFileName)