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>