dotnet ограничителя публиковать не публиковать правильный параметр appsettings.{env.EnvironmentName}.формат JSON
когда я выполните следующую команду в командной строке:
dotnet publish -o "./../output" -c Release
на dotnetcli публикует проект правильно. Однако, он не копирует , только appsettings.json.
почему это? Я погуглил и прочитал официальные основные документы, но не нашел, как правильная среда appsettings.json предполагается в конечном итоге в выходных данных публикации.
должен ли я копировать appsettings.Production.json вручную в опубликованную папку?
4 ответов
обновление:
для текущего (нового) .формат csproj на CopyToPublishDirectory атрибут должен использоваться. Он определяет, следует ли копировать файл в общедоступный каталог и может иметь одно из следующих значений:
- всегда,
 - PreserveNewest
 - никогда
 
поэтому добавьте следующий раздел в свой .csproj: 
<ItemGroup>
   <None Include="appsettings.Production.json" CopyToPublishDirectory="Always" />
</ItemGroup>
посмотреть в @nover ответ и исключить или включить файлы в publish для получения дополнительной информации о контроле файла в процессе публикации.
"в  у вас есть раздел 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 и в переменной среды будет использоваться параметр из переменной среды. Последняя конфигурация источник указан "wins", если параметр существует в нескольких местах. В 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>