Dotnet публикует копии appsettings * .json только для Asp.Net (но не для консоли) - PullRequest
1 голос
/ 05 июня 2019

Я запускаю dotnet publish (через графический интерфейс VS2019 или команду, тот же результат) в проекте ASP.Net и в консольном проекте.

Кажется, что поведение отличается. Все appsettings*.json автоматически копируются в ASP.Net, но на консоль, только если я установил для них <CopyToOutputDirectory>Always</CopyToOutputDirectory>.

Это какая-то ошибка или она действительно разная в зависимости от типа проекта?

Поведение выглядит немного странно для меня.

1 Ответ

1 голос
/ 05 июня 2019

Если вы сравните файлы .csproj для обоих проектов, вы заметите, что проект ASP.NET Core ссылается на SDK Microsoft.NET.Sdk.Web, а консольный проект просто ссылается на Microsoft.NET.Sdk. SDK - это в основном предопределенный набор конфигураций и значений по умолчанию, упрощающих работу с ASP.NET Core или консольными приложениями, а также файл проекта, который легко читать и поддерживать.

Microsoft.NET.Sdk.Web фактически расширяет Microsoft.NET.Sdk, поэтому все, что делает последний SDK, также включено в Web SDK. Web SDK просто добавляет еще кое-что, связанное с ASP.NET Core. Это также означает, что веб-приложение - это просто консольное приложение.

Одна из строк, содержащихся в Web SDK: не , включенная в общий SDK , - это :

<Content Include="**\*.json" CopyToPublishDirectory="PreserveNewest" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(DefaultWebContentItemExcludes)" />

Это в основном определяет все .json файлы как контент, который должен быть скопирован в каталог публикации. Так что в основном это то, что заставляет проекты ASP.NET Core копировать файлы appsettings.json в каталог публикации.

Поскольку это не является частью обычного SDK проекта, консольные приложения не будут автоматически копировать файлы appsettings.json в каталог публикации. Обычно это преднамеренно , поскольку необработанные консольные приложения не обязательно построены на системе конфигурации, которая использует эти файлы.

Это возможно (и, вероятно, оно станет более актуальным в будущем с универсальным хостом в 3.0), но не по умолчанию. Поэтому, если вы хотите скопировать файлы в каталог публикации, вам следует добавить это правило самостоятельно в ваш .csproj:

<ItemGroup>
    <Content Include="*.json" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>

Btw. так как вы упомянули в комментариях, что ASP.NET Core на самом деле не требует appsettings.json самих файлов (что абсолютно верно), Web SDK предоставляет два свойства EnableDefaultItems и EnableDefaultContentItems для отключения это поведение по умолчанию (наряду с некоторыми другими). ​​

...