Dotnet publish не публикует правильные установки. {env.EnvironmentName}.json

Когда я выдаю следующую команду в командной строке:

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

dotnetcli публикует проект правильно. Однако он не копирует файл appsettings.Production.json, а только appsettings.json.

Почему это? Я googled вокруг и читаю официальные основные документы, но не нашел, как предполагается, что правильная среда appsettings.json окажется в выходе публикации.

Должен ли я скопировать appsettings.Production.json вручную в опубликованную папку?

Ответ 1

Update: Для текущего (нового).csproj формата должен использоваться атрибут CopyToPublishDirectory. Он определяет, следует ли копировать файл в каталог публикации и может иметь одно из следующих значений:

  • Всегда,
  • PreserveNewest
  • Никогда

Итак, добавьте следующий раздел в свой .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 рекомендует специфицировать переменные среды последним, так что локальное окружение может переопределить все, что установлено в развернутых конфигурационных файлах.

Ответ 2

В вашем project.json есть раздел publishOptions. В этом списке перечислены все файлы и папки, которые будут включены при публикации. Вам нужно будет обновить свою версию, чтобы выглядеть примерно так.

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

Вы также можете использовать шаблоны глобусов, поэтому вы должны найти это тоже (я не тестировал этот)

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

Ответ 3

Для нового формата проекта 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 будут опубликованы!