.NET Core 2.1: как вызвать задачу копирования, определенную в файле проекта, во время отладки в Visual Studio 2017? - PullRequest
0 голосов
/ 06 октября 2018

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

После некоторых исследований и экспериментов я создал следующий файл .csproj.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.4</RuntimeFrameworkVersion>
    <TieredCompilation>true</TieredCompilation>
    <PreserveCompilationContext>true</PreserveCompilationContext>
  </PropertyGroup>

  <ItemGroup>
    <APIDefinition Include="D:\SomePlace\*.API.*.yaml" />
  </ItemGroup>

  <Target Name="CopyFiles" BeforeTargets="Compile;Build;Publish">
    <Copy SourceFiles="@(APIDefinition)" DestinationFolder="wwwroot" />
    <Copy SourceFiles="D:\SomePlaceElse\BaseAPISettings.json" DestinationFolder="$(MSBuildProjectDirectory)" />
  </Target>

  <ItemGroup>
    <Compile Remove="wwwroot\**\*;node_modules;bower_components" />
    <None Update="**.user;**.vspscc">
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.4" />
  </ItemGroup>

</Project>

Здесь я определил цель CopyFiles, которая должна быть запущена до тех целей, которые я там поместил.Эта цель использует задачу «Копировать» для копирования файлов определения API формата YAML и базовых настроек API в каталог проекта.

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

Иногда я делаю изменения в этих файлах между сеансами отладки.Затем, когда я начинаю отладку из Visual Studio, поскольку файлы проекта не изменяются, очевидно, уже запущенный проект запускается.

Так как проект не построен, мои задачи копирования не запускаются, и я получаю устаревшие файлы во время отладки.

Есть ли что-то, что я могу сделать, чтобы мои задачи копирования запускались, когдаЯ делаю «Начать отладку F5» в IDE, независимо от состояния сборки проекта?

PS: я использую Visual Studio 2017 15.8.5 и ориентируюсь на среду выполнения .NET Core 2.1.4, если онаразница.

1 Ответ

0 голосов
/ 07 октября 2018

Чтобы полностью интегрироваться в актуальную проверку системы проекта в Visual Studio, я предлагаю следующие изменения:

  1. Сделать исходные и целевые пути элементов известными до
  2. Зарегистрируйте их в современной системе проверки.(Также требуется взлом, чтобы удостовериться, что исходный код проекта перекомпилирован так, чтобы вывод имел более новую временную отметку)
  3. Сделать саму цель MSBuild инкрементной.Это также помогает для сборок из командной строки, когда файлы не нужно копировать.

Полные изменения выглядят так:

<ItemGroup>
  <CustomCopyFile Include="..\TestFiles\*.API.*.yaml"
                  TargetPath="wwwroot\%(Filename)%(Extension)" />
  <CustomCopyFile Include="..\TestFiles\BaseAPISettings.json"
                  TargetPath="%(Filename)%(Extension)" />
  <UpToDateCheckInput Include="@(CustomCopyFile)" />
  <UpToDateCheckBuild Include="@(CustomCopyFile->'%(TargetPath)')"
                      Original="@(CustomCopyFile)" />
  <CustomAdditionalCompileInputs Include="@(CustomCopyFile->'%(TargetPath)')" />
</ItemGroup>

<Target Name="CopyFiles" 
        BeforeTargets="BeforeBuild;BeforePublish"
        Inputs="@(CustomCopyFile)" 
        Outputs="@(CustomCopyFile->'%(TargetPath)')">
  <Copy SourceFiles="@(CustomCopyFile)"
        DestinationFiles="@(CustomCopyFile->'%(TargetPath)')" />
</Target>

CustomCopyFile теперь собирает всеисходные файлы, и мы помещаем ожидаемое имя конечного файла в метаданные TargetPath.

UpToDateCheckInput элементы говорят Visual Studio перестроить проект в случае изменения одного из этих элементов.

UpToDateCheckBuild элементы инструктируют Visual Studio проверять только эти элементы на соответствие специальным исходным элементам.Это избыточно для этого примера проекта, но может быть полезно, если целевой путь не был внутри каталога проекта, но какая-то промежуточная выходная папка (obj ..) и никакая переоценка не увидит эти новые файлы.Было бы также полезно, если бы файлы также были изменены как часть обработки (например, замена переменных внутри файлов).

CustomAdditionalCompileInputs - это хак, поскольку элементы копируются в папку проекта и считаютсябыть "входными данными для выходных данных" автоматически. Поэтому мы заставляем проект перекомпилироваться, если наши исходные файлы изменятсяЕсли мы этого не сделаем, он никогда не будет рассматривать проект как обновленный после изменения исходных файлов yaml, поскольку они будут новее, чем скомпилированный файл app.dll.

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