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>

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

первоисточник