web-dev-qa-db-ja.com

.Netコアアプリで環境固有のアプリ設定を公開する方法は?

.Netコアアプリケーションに3つの環境固有のappsettingsファイルがあります

enter image description here

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ファイルを公開するにはどうすればよいですか?

27
LP13

他の誰かが複数の環境で異なる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();
}

このソリューションがお役に立てば幸いです。

4
Ben

可能な方法の1つは、たとえばdotnet publish-iis(またはprepublishscriptsセクションのタスクを使用して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コンテナーでは、魅力のように機能します。

3
Tseng

最近、これに対する解決策も見つけなければなりませんでしたが、.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ファイルからその行を削除するだけです。

2
Sensei_Shoh

VS2017で複数環境を追加する

手順プロジェクトを右クリック->追加-> NewItem-jsonファイルを選択-ファイル名を「appsettings.staging.json」または「appsettings.production.json」として書き込みます

appsettings.staging.jsonファイルを追加

出力は次のようになります

2
Balaji Sadhu

実際に環境変数を追加する必要があります 公式チュートリアルによる

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();
1
VMAtm

私がこれまでに見つけた最も簡単な方法は、すべての構成ファイルを展開し、展開が完了した後に余分なファイルを削除することです。展開シェルまたはバッチスクリプトの最後にいくつかの行を追加するだけです。

0
incognito

このナゲットパッケージでこの質問を解決しました: 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環境変換のように機能します。

0

正直なところ、これはビルドパイプラインにふさわしいタスクではないと思います。また、dotnet cliの公開機能は非常に限られています。 Tsengが示したような外部ツールに移動します。展開は、構築よりも複雑な独自のセットを持つ別のドメインです。

外部ツールを使用する以外に、dotnet cliでのビルドはありません!

0
Thomas

MSBuild条件を使用して、オプションでコンパイル出力(または公開された出力)にファイルを含めることができます。

<ItemGroup Condition="'$(Configuration)'=='Release'">
  <Content Remove="appsettings.Development.json;appsettings.Staging.json" />
  <None Include="appsettings.Development.json;appsettings.Staging.json" />
</ItemGroup>

上記では、コンパイルターゲットの構成がリリースの場合、開発およびステージングのappsettings.jsonファイルバリアントは無視されます。

0
Gabe Szabo