Сценарий сборки Cake завершается неудачно в Azure Devops со смешанным решением ядра и фреймворка .NET - PullRequest
2 голосов
/ 27 марта 2019

У меня есть скрипт сборки тортов с моим проектом сервера .NET, который должен быть построен на нашем новом конвейере Azure DevOps. Сценарий работает локально, но не работает в DevOps Azure. Это может быть вызвано тем, что у меня есть проект модульных тестов (xUnit), построенный на .NET Core 2.1, в то время как все остальные проекты в решении - это .NET Framework 4.6.1 (мы только что добавили в проект xUnit, который мой единственный можно было добавить его как проект .NET Core).

Я написал свой скрипт для торта, который работает локально. Это выглядит так:

//Always lock down versions of tools so that we can ensure a tool works before upgrading instead of auto-upgrading.
#tool "nuget:?package=xunit.runner.console&version=2.4.1"
#tool "nuget:?package=ReportUnit&version=1.2.1"

var target = Argument("target", "Build");
var configuration = Argument("configuration", "Dev");
var solution = @".\MyCompany.MyProduct.IntegrationLayer.sln";
var report = Directory(@".\reports");
var xunitReport = report + Directory("xunit");

Task("Clean")
    .Does(() =>
{
    Information("Cleaning out directories {0} for {1}...", configuration, solution);
        CleanDirectories("./**/bin/" + configuration);
        CleanDirectories("./**/obj/" + configuration);
});

Task("Restore")
    .IsDependentOn("Clean")
    .Does(() =>
{
    //This can restore both .NET Core and Framework NuGet packages.
    Information("Restoring Nuget packages for {0}...", solution);
    DotNetCoreRestore();
});

Task("Build")
    .IsDependentOn("Restore")
    .Does(() =>
{
    //If we change all the projects and solution to .NET Core, then we will need to change this build call to DotNetCoreBuild().
    //Because we have a mixed solution (unit tests are .NET Core and all other projects are .NET Framework), we need to still use MSBuild.
    Information("Building solution {0} using the {1} configuration...", solution, configuration);
    MSBuild(solution, new MSBuildSettings {
        Configuration = configuration
    });
});

Task("UnitTests")
    .IsDependentOn("Build")
    .Does(() =>
{
    Information("Unit testing solution {0} using the {1} configuration...", solution, configuration);
    var projects = GetFiles("./UnitTests/*.csproj");
    foreach(var project in projects)
    {
        DotNetCoreTest(
            project.FullPath,
            new DotNetCoreTestSettings()
            {
                Configuration = configuration,
                NoBuild = true
            });
    }
});

Task("UnitTestsOnly")
    .Does(() =>
{
    Information("Unit testing solution {0} using the {1} configuration...", solution, configuration);
    var projects = GetFiles("./UnitTests/*.csproj");
    foreach(var project in projects)
    {
        DotNetCoreTest(
            project.FullPath,
            new DotNetCoreTestSettings()
            {
                Configuration = configuration,
                NoBuild = true
            });
    }
});

RunTarget(target);

Теперь, когда я запускаю это в Azure DevOps, я получаю 10 ошибок для каждого проекта, как показано в следующем примере:

"D:\a\1\s\PPIL\MyCompany.MyProduct.IntegrationLayer.sln" (Build target) (1) ->
"D:\a\1\s\PPIL\MC.MP.IL.DatabaseDataReset\MC.MP.IL.DatabaseDataReset.csproj" (default target) (11) ->
  D:\a\1\s\PPIL\MC.MP.IL.DatabaseDataReset\MC.MP.IL.DatabaseDataReset.csproj(123,5): error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.VisualStudio.SlowCheetah.3.1.66\build\Microsoft.VisualStudio.SlowCheetah.targets.

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

Где в моем сценарии я ошибаюсь? Мой шаг восстановления кажется хорошим, за исключением того, что он только восстанавливает проект UnitTests (который зависит от всех других проектов). Это восстановление? Есть ли настройки, которые мне не хватает в сборке или восстановлении? Заранее спасибо.

1 Ответ

1 голос
/ 28 марта 2019

Таким образом, ответ состоял в том, что я получил все файлы проекта и запустил метод «NuGetRestore» для каждого из них , исключая проект .NET Core UnitTests.Затем я могу запустить метод DotNetCoreRestore, который просто восстанавливает проект .NET Core UnitTests.

Я также обнаружил, что должен очистить каталог пакетов, так как это хорошая практика.

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