web-dev-qa-db-ja.com

dotnet publishは正しいappsettingsを公開しません。{env.EnvironmentName} .json

コマンドラインで次のコマンドを発行すると:

dotnet publish -o "./../output" -c Release

dotnetcliはプロジェクトを正しく公開します。ただし、appsettings.Production.jsonファイルはコピーされず、appsettings.jsonのみがコピーされます。

どうしてこれなの?私はグーグルで調べて公式のコアドキュメントを読みましたが、正しい環境appsettings.jsonがどのようにパブリッシュ出力に含まれるかを見つけられませんでした。

appsettings.Production.jsonを公開フォルダーに手動でコピーする必要がありますか?

59
peco

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.*.jsonappsettings.development.jsonappsettings.staging.jsonなどのすべてのappsettings.production.jsonファイルは常にすべての環境で使用されることに注意してください。 project.jsonを使用してこれを単純に処理することはできません。条件ルールをサポートしていないためです。これは将来、project.json元に戻す からmsbuildおよび.csprojに変更されるときに変更されます。これがアプリにとって重要な場合は、環境変数、データベースなどの別の構成ストアを使用することを検討してください。

  • 複数の場所に存在する場合に適用される設定を決定するため、その順序は重要です。 ドキュメント から:

    構成ソースが指定されている順序は重要です。これにより、設定が複数の場所に存在する場合に適用される優先順位が確立されるためです。以下の例では、appsettings.jsonと環境変数の両方に同じ設定が存在する場合、環境変数の設定が使用されます。設定が複数の場所に存在する場合、最後に指定された構成ソースが「優先」されます。 ASP.NETチームは、環境変数を最後に指定することをお勧めします。これにより、ローカル環境が、展開された構成ファイルに設定されているものを上書きできます。

78
Set

project.jsonにはpublishOptionsセクションがあります。これには、公開時に含まれるすべてのファイルとフォルダーがリストされます。このように見えるように更新する必要があります

{
  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "appsettings.Production.json",
      "web.config"
    ]
  },
}

また、グロビングパターンを使用することもできるため、これも動作するはずです(これはテストしていません)

{
  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings*.json",
      "web.config"
    ]
  },
}
15
Sock

新しい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ファイルが公開されます!

10
nover

Visual Studio 2017 15.3以降

.csprojファイルを編集して、ファイル/フォルダーの公開を手動で除外します

<ItemGroup>
  <Content Remove="appsettings.Development.json" />
</ItemGroup>

参照: https://www.danielcrabtree.com/blog/273/fixing-the-duplicate-content-error-after-upgrading-visual-studio-2017

元のソース

2
Ben Anderson