Задача MSBuild ZipDirectory не архивировать весь каталог? - PullRequest
1 голос
/ 16 апреля 2020

У меня есть функция. NET Core 3.1 Azure (может быть, не имеет значения), и я изменил мой .csproj, чтобы архивировать двоичные файлы с помощью ZipDirectory после запуска сборки. При архивировании я заметил, что ZipDirectory не архивирует папки для каждой функции, которая создается во время сборки, а архивирует все остальное. Я запускаю MSBuild через командную строку разработчика для VS 2019 с msbuild /p:platform="Any CPU" /p:configuration="Release" /p:VisualStudioVersion="16.0" в том же каталоге, где находится мое решение. Я предоставил мой .csproj и мой единственный файл .cs в проекте:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.3" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>

  <Target Name="DeleteArtifactsFolder" AfterTargets="Build">
    <RemoveDir Directories="$(OutputPath)\..\..\..\Artifacts" />
  </Target>

  <Target Name="CreateArtifactsDirectory" AfterTargets="DeleteArtifactsFolder">
    <MakeDir Directories="$(OutputPath)\..\..\..\Artifacts" />
  </Target>

  <Target Name="ZipBinariesToArtifacts" AfterTargets="CreateArtifactsDirectory">
    <ZipDirectory SourceDirectory="$(OutputPath)" DestinationFile="$(OutputPath)\..\..\..\Artifacts\Artifacts.zip" />
  </Target>
</Project>

Вот единственный файл .cs в проекте:

namespace MyFunctionApp
{
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.Extensions.Logging;

    using System.Threading.Tasks;
    public static class Functions
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "1")] HttpRequest req,
            ILogger log)
        {
            return new OkResult();
        }

        [FunctionName("Function2")]
        public static async Task<IActionResult> Run2(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "1")] HttpRequest req,
            ILogger log)
        {
            return new OkResult();
        }
    }
}

Вот скриншоты файлы, которые, как я ожидаю, будут заархивированы и файлы, которые фактически заархивированы . Одна вещь, которую я заметил, это то, что она копирует файл MyFunctionApp.pdb из корзины в root почтового индекса.

Редактировать: я сделал тест, преднамеренно выдав ошибку zip, выполнив архивирование в папку это еще не существует, и я заметил, что ошибки zip-задач перед созданием папок Function1 и Function2, но после создания других файлов сборки. Это заставляет меня думать, что задача zip начинается до того, как закончится сборка. Кто-нибудь знает, что я сделал не так?

1 Ответ

2 голосов
/ 16 апреля 2020

Я обнаружил, что проблема связана с шагами сборки для Azure функций (или моими ожиданиями шагов сборки). Когда мы создаем C# библиотеки, цель Build заканчивается на CopyFilesToOutputDirectory. Для функций Azure цель Build заканчивается на _FunctionsPostBuildDepsCopy («PostBuild» вводит в заблуждение), что следует после CopyFilesToOutputDirectory.

Наконец, есть 2 события после сборки, которые вызываются после этого: _GenerateFunctionsPostBuild, а затем _GenerateFunctionsExtensionsMetadataPostBuild. Цель _GenerateFunctionsPostBuild - это то, что создает папки и файлы для каждой функции. После запуска этой цели мы можем начать архивирование двоичных файлов нашей Azure функции. Это было важно для меня, потому что мне нужна была папка для каждой функции, чтобы использовать WebDeploy с zip-архивом. В противном случае я бы развернул ресурс Azure Function без функций.

...