Задача msbuild, которая работает из профиля публикации, чтобы удалить определенный файл - PullRequest
0 голосов
/ 27 октября 2019

В моем проекте 3 файла json. Для определенного профиля публикации, используя публикацию FileSystem, и я пытаюсь найти способ, чтобы конкретный файл НЕ публиковался в целевой папке. Это для основного консольного приложения .net.

Это мой профиль публикации, но файл, который я пытаюсь ограничить от публикации, все еще публикуется в целевой папке.

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Debug</Configuration>
    <Platform>Any CPU</Platform>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <PublishDir>D:\projects\test_publish</PublishDir>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <SelfContained>false</SelfContained>
    <DeleteExistingFiles>false</DeleteExistingFiles>
    <ExcludeFilesFromDeployment>appsettings.Test.json</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

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

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Local.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Test.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Обходное решение, которое я нашел, похоже на другой мой проект. Это включает запись в систему сборки и добавление некоторых дополнительных битов в файл csproj.

Так что файл csproj теперь будет выглядеть следующим образом. Он исключает файл, который вам не нужен, и вам нужно всего лишь добавить соответствующую запись конфигурации сборки, и при этом система сборки VS определяет, какой из этих файлов json будет выводиться.

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Local.json" Condition=" '$(Configuration)' == 'Debug' " >
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Test.json" Condition=" '$(Configuration)' == 'Test' " >
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
0 голосов
/ 28 октября 2019

Это мой профиль публикации, но файл, который я пытаюсь ограничить от публикации, все еще публикуется в целевой папке.

Я тестирую его на локальном компьютере и воспроизводлю ту же проблему,Также я нахожу, если я использую этот элемент в веб-приложении , как asp.net, он всегда работает. Поэтому я предполагаю, что этот элемент не поддерживается для публикации консольного приложения ядра .net.

Какую роль этот файл играет в вашем проекте?

1.Если ваше приложение не нуждается в build output directory и publish directory, вы можете установить для Copy to Output Directory значение Do not copy.

, а затем очистить папку публикации иОпубликуйте снова, чтобы проверить, помогает ли это.

enter image description here

2. И если у вас есть конкретная причина, по которой вам нужен файл в сборке, но нужно исключить егоиз папки публикации, пытаясь добавить этот скрипт в xx.csproj ( Удалить задачу ):

  <Target Name="CustomTarget" AfterTargets="_PublishNoBuildAlternative">
    <Delete Files="$(PublishDir)\appsettings.Test.json"/>
    <!--<Delete Files="$(PublishDir)\appsettings.xxx.json"/>-->
  </Target>

Вы можете добавить Условия MSbuild как Condition="$(Configuration)=='xxx'" кцели, чтобы сделать его более гибким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...