コマンドラインで次のコマンドを発行すると:
dotnet publish -o "./../output" -c Release
dotnetcli
はプロジェクトを正しく公開します。ただし、appsettings.Production.json
ファイルはコピーされず、appsettings.json
のみがコピーされます。
どうしてこれなの?私はグーグルで調べて公式のコアドキュメントを読みましたが、正しい環境appsettings.json
がどのようにパブリッシュ出力に含まれるかを見つけられませんでした。
appsettings.Production.json
を公開フォルダーに手動でコピーする必要がありますか?
Update:現在の(新しい).csproj形式の場合CopyToPublishDirectory
属性を使用する必要があります。ファイルをパブリッシュディレクトリにコピーするかどうかを決定し、次のいずれかの値を持つことができます。
次のセクションを.csproj
に追加します。
<ItemGroup>
<None Include="appsettings.Production.json" CopyToPublishDirectory="Always" />
</ItemGroup>
公開時のファイルの制御に関する詳細については、 @ nover answer およびSO 公開時にファイルを除外または含める を参照してください。
「project.json
ファイルには、セクションpublishOptions
があり、サブセクションinclude
があります。既に "appsettings.json"のようなファイルがあります。
"publishOptions": {
"include": [
"appsettings.json",
"hosting.json",
"project.json",
"web.config"
]
},
"appsettings.Production.json"
をこの配列に追加する必要があります。
コメントに基づく更新:
appsettings.*.json
、appsettings.development.json
、appsettings.staging.json
などのすべてのappsettings.production.json
ファイルは常にすべての環境で使用されることに注意してください。 project.json
を使用してこれを単純に処理することはできません。条件ルールをサポートしていないためです。これは将来、project.json
が 元に戻す からmsbuild
および.csproj
に変更されるときに変更されます。これがアプリにとって重要な場合は、環境変数、データベースなどの別の構成ストアを使用することを検討してください。
複数の場所に存在する場合に適用される設定を決定するため、その順序は重要です。 ドキュメント から:
構成ソースが指定されている順序は重要です。これにより、設定が複数の場所に存在する場合に適用される優先順位が確立されるためです。以下の例では、appsettings.jsonと環境変数の両方に同じ設定が存在する場合、環境変数の設定が使用されます。設定が複数の場所に存在する場合、最後に指定された構成ソースが「優先」されます。 ASP.NETチームは、環境変数を最後に指定することをお勧めします。これにより、ローカル環境が、展開された構成ファイルに設定されているものを上書きできます。
project.json
にはpublishOptions
セクションがあります。これには、公開時に含まれるすべてのファイルとフォルダーがリストされます。このように見えるように更新する必要があります
{
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings.json",
"appsettings.Production.json",
"web.config"
]
},
}
また、グロビングパターンを使用することもできるため、これも動作するはずです(これはテストしていません)
{
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings*.json",
"web.config"
]
},
}
新しいcsproj
プロジェクト形式の場合、コンテンツに新しいItemGroup
を追加する必要があります
<ItemGroup>
<Content Include="appsettings.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Include="appsettings.Production.json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
複数のappsettings.{env}.json
ファイルがある場合、同じContent
内でItemGroup
タグを繰り返すだけで、すべての設定ファイルがパブリッシュフォルダーに格納されます。
コメントで述べたように、さらにクリーンなソリューションは、ワイルドカードを使用することです。
<ItemGroup>
<Content Include="appsettings*json">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
そして、すべてのappsettings
ファイルが公開されます!
Visual Studio 2017 15.3以降
.csprojファイルを編集して、ファイル/フォルダーの公開を手動で除外します
<ItemGroup>
<Content Remove="appsettings.Development.json" />
</ItemGroup>