Указать файлы в профиле публикации, которые необходимо удалить?

#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