.Netコアアプリケーションに3つの環境固有のappsettings
ファイルがあります
project.json
このようなセットアップpublishOptions
があります。 (提案に基づいて ここ )
"publishOptions": {
"include": [
"wwwroot",
"appsettings.development.json",
"appsettings.staging.json",
"appsettings.production.json",
"web.config"
]
},
環境に基づいて適切なappsettings
を使用する3つの対応するスタートアップクラスがあります
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true);
ただし、アプリケーションを公開すると、3つのappsettingsファイルすべてがすべての環境で終了します。環境固有のappsettingファイルを公開するにはどうすればよいですか?
他の誰かが複数の環境で異なるappsettingsを使用する方法を考えている場合、ここで解決策があります。
dotnet publish --configuration [Debug|Release]
は、適切なappsettings.jsonファイルを公開フォルダーにコピーします*.csproj
には、これらのファイルの条件ロジックがあります。
.pubxml
プロファイルファイルの発行(Visual StudioのProperties
-> PublishProfiles
にあります)すべてのコンテンツファイルがデフォルトで含まれることを無効にします<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<EnableDefaultContentItems>false</EnableDefaultContentItems>
</PropertyGroup>
<Choose>
<When Condition="'$(Configuration)' == 'Debug'">
<ItemGroup>
<None Include="appsettings.json" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
<None Include="appsettings.prod.json" CopyToOutputDirectory="Never" CopyToPublishDirectory="Never" />
</ItemGroup>
</When>
<When Condition="'$(Configuration)' == 'Release'">
<ItemGroup>
<None Include="appsettings.json" CopyToOutputDirectory="Never" CopyToPublishDirectory="Never" />
<None Include="appsettings.prod.json" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
</ItemGroup>
</When>
</Choose>
Startup.cs
両方のファイルをロードしようpublic Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.prod.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
このソリューションがお役に立てば幸いです。
可能な方法の1つは、たとえばdotnet publish-iis
(またはprepublish
のscripts
セクションのタスクを使用してgulpタスクを実行することにより、公開前または公開後のスクリプト/コマンドを実行することです。ファイルを公開前に。
これをproject.jsonに追加します。
"scripts": {
"postpublish": [ "gulp cleanconfig", "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
ここでcmdまたはシェルコマンドを実行することもできます。しかし実際には、最初にこれを行う理由はないはずです。3つのappconfigファイルをすべて出荷するだけです。つまり、Azure App Serviceでは、環境変数に応じてモードを切り替えることができるためですAzure Portalおよび発行時に、ステージングスロットと本番スロットは交換されますが、環境変数はそのままです。
ただし、appsettings.json内にシークレットを保存するべきではありません(ファイルを削除する理由とその理由を説明します)。代わりに、開発および環境変数に「ユーザーシークレット」を使用して、本番用の接続文字列などを設定します。特にAzure App Servicesとdockerコンテナーでは、魅力のように機能します。
最近、これに対する解決策も見つけなければなりませんでしたが、.csproj
ファイルにいくつかの設定を追加し、Program.cs
に小さな変更を加えることでそれを達成しました。
<Project Sdk="Microsoft.NET.Sdk.Web">
<!-- ... -->
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<EnvironmentName>Production</EnvironmentName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Stage|AnyCPU'">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<EnvironmentName>Staging</EnvironmentName>
</PropertyGroup>
<ItemGroup>
<Content Remove="appsettings.json" />
<Content Remove="appsettings.*.json" />
</ItemGroup>
<ItemGroup>
<Content Include="appsettings.json" CopyToOutputDirectory="PreserveNewest" />
<Content Include="appsettings.*.json" Exclude="appsettings.$(EnvironmentName).json" DependentUpon="appsettings.json" CopyToOutputDirectory="Never" />
<Content Include="appsettings.$(EnvironmentName).json" DependentUpon="appsettings.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<Target Name="RenameAppsettings" AfterTargets="Publish">
<Move SourceFiles="$(PublishDir)\appsettings.$(EnvironmentName).json" DestinationFiles="$(PublishDir)\appsettings.overrides.json" />
</Target>
</Project>
少し説明するために、構成ごとに<EnvironmentName>
要素を追加して、ビルドプロセス中に使用できるようにしました。 appsettings.{EnvironmentName}.json
(つまりappsettings.Staging.json
)を「オーバーライド」ファイルとして使用しているため、ビルドプロセス中に必要なJSONファイルの名前を変更するだけです。たとえば、dotnet publish -c Stage
を実行すると、appsettings.Staging.json
ファイルが公開フォルダーに公開され、名前がappsettings.overrides.json
に変更されます。 Program.cs
には、appsettings.overrides.json
ファイルも含める必要があります。
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.overrides.json", optional: true, reloadOnChange: true)
私はそれが役立つことを願っています!
サイドノート:
appsettings.*.json
をインクルードし、CopyToOutputDirectory="Never"
に設定して、開発時にVisual Studioに表示されるようにします。それ以外の場合、現在の環境のappsettings
ファイルだけをVSに表示する場合は、csproj
ファイルからその行を削除するだけです。
VS2017で複数環境を追加する
手順プロジェクトを右クリック->追加-> NewItem-jsonファイルを選択-ファイル名を「appsettings.staging.json」または「appsettings.production.json」として書き込みます
実際に環境変数を追加する必要があります 公式チュートリアルによる :
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
// do not forget to add environment variables to your config!
.AddEnvironmentVariables();
私がこれまでに見つけた最も簡単な方法は、すべての構成ファイルを展開し、展開が完了した後に余分なファイルを削除することです。展開シェルまたはバッチスクリプトの最後にいくつかの行を追加するだけです。
このナゲットパッケージでこの質問を解決しました: https://github.com/Microsoft/slow-cheetah/blob/master/doc/transforming_files.md
インストールが非常に簡単で、アクティブなソリューション構成のすべての構成を使用します(私の場合-テスト展開用の新しい「テスト」構成を追加しました) 。
この後、VSにこの拡張機能をインストールできます: https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms 。
このツールを使用して、VSで.xmlまたは.jsonアプリケーション構成設定の新しい構成サブファイルを(手動で)作成できるようになりました。たとえば、デバッグ、テスト、リリースファイル(appsettings.Debug.jsonなど)があります。
次のステップ-各構成の公開プロファイルを設定します。公開後、必要なすべての変換を含む1つのファイルのみが作成されます。
変換は、.netコアWebアプリケーションでの古典的な.json環境変換のように機能します。
正直なところ、これはビルドパイプラインにふさわしいタスクではないと思います。また、dotnet cliの公開機能は非常に限られています。 Tsengが示したような外部ツールに移動します。展開は、構築よりも複雑な独自のセットを持つ別のドメインです。
外部ツールを使用する以外に、dotnet cliでのビルドはありません!
MSBuild条件を使用して、オプションでコンパイル出力(または公開された出力)にファイルを含めることができます。
<ItemGroup Condition="'$(Configuration)'=='Release'">
<Content Remove="appsettings.Development.json;appsettings.Staging.json" />
<None Include="appsettings.Development.json;appsettings.Staging.json" />
</ItemGroup>
上記では、コンパイルターゲットの構成がリリースの場合、開発およびステージングのappsettings.jsonファイルバリアントは無視されます。