#visual-studio #asp.net-core #msbuild #csproj
#visual-studio #asp.net-core #msbuild #csproj
Вопрос:
У меня есть 3 разных файла настроек, используемых с приложением .NET Core 2.2
appsettings.json
appsettings.Development.json
appsettings.Test.json
Я использую профиль публикации, предназначенный для конкретной конфигурации сборки (например. Тест), и в моем профиле публикации я добавил это, чтобы попытаться удалить файлы appsettings, которые я НЕ хочу развертывать. Нет смысла развертывать производственные настройки на сервере разработки…
<PropertyGroup>
<ExcludeFilesFromDeployment>appsettings.json</ExcludeFilesFromDeployment>
<ExcludeFilesFromDeployment>appsettings.Development.json</ExcludeFilesFromDeployment>
</PropertyGroup>
Однако, когда я публикую, поскольку в Visual Studio присутствуют все 3 файла. Как я могу указать, что эти другие 2 файла будут удалены при публикации?
Я также пытался поместить это в свой файл csproj, но все 3 файла в конечном итоге были опубликованы
<ItemGroup>
<None Update="appsettings.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Test' "/>
<None Update="appsettings.Development.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Test' "/>
<None Update="appsettings.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Release' "/>
<None Update="appsettings.Test.json" CopyToPublishDirectory="Never" Condition=" '$(Configuration)' == 'Release' "/>
</ItemGroup>
Комментарии:
1. Конфигурация сборки не имеет отношения к ASP.NET Основные приложения. Поскольку не происходит ничего подобного преобразованиям конфигурации и тому подобному, один и тот же опубликованный код приложения может быть помещен в любую среду. Что в конечном итоге определяет, какие конфигурации для конкретной среды загружаются, так это значение
ASPNETCORE_ENVIRONMENT
переменной, а не то, как вы опубликовали. Вот почему публикация включает в себя все файлы; нет механизма, позволяющего заранее узнать, какие из них релевантны, а какие нет.2. На практике это вряд ли является проблемой. В любом случае в эти файлы JSON не должна попадать секретная информация, так что кого волнует,
appsettings.Production.json
существует ли она на вашем сервере разработки?
Ответ №1:
Не уверен, но поместите это в свой файл .csproj, чтобы проверить, поможет ли это.Это работает в vs2017, .net core на моей стороне.
<ItemGroup Condition="'$(Configuration)' == 'Test'">
<Content Remove="appsettings.Development.json" />
<None Include="appsettings.Development.json" />
<Content Remove="appsettings.json" />
<None Include="appsettings.json" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='Release'">
<Content Remove="appsettings.Test.json" />
<None Include="appsettings.Test.json" />
<Content Remove="appsettings.json" />
<None Include="appsettings.json" />
</ItemGroup>
Ответ №2:
Обычно я создаю разные конфигурации сборки для разных развертываний (разных компьютеров), поэтому я указываю дополнительные настройки приложений в качестве имени конфигурации сборки. В итоге я получаю этот небольшой шаблон (в файле .csproj)
<Choose>
<When Condition="'$(Configuration)' == 'Debug'">
<ItemGroup>
<None Include="appsettings*.json" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Content Remove="appsettings*.json" />
<None Include="appsettings.json;appsettings.$(Configuration).json" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
</ItemGroup>
</Otherwise>
<Choose>
Ответ №3:
Не уверен на 100% в этом, но просто подумал, вы пробовали настраивать их на копирование только тогда, когда это соответствует ожидаемой конфигурации сборки, например
<ItemGroup>
<None Update="appsettings.json" CopyToPublishDirectory="PreserveNewest" Condition=" '$(Configuration)' == 'Production' "/>
<None Update="appsettings.Development.json" CopyToPublishDirectory="PreserveNewest" Condition=" '$(Configuration)' == 'Development' "/>
<None Update="appsettings.Test.json" CopyToPublishDirectory="PreserveNewest" Condition=" '$(Configuration)' == 'Test' "/>
</ItemGroup>
Также, пожалуйста, проверьте, что на вашу версию .net Core не влияетhttps://github.com/dotnet/sdk/issues/881