Ошибка версии .NET Core 2.1 с действиями Cake Build 4.0 NuGetRestore и MSBuild - PullRequest
0 голосов
/ 22 апреля 2019

Cake Build 4.0.0 запускает методы NuGetRestore и MSBuild, выполняя команду MSBuild CLI. Насколько я понимаю, Cake загружает определенную версию MSBuild. В моем решении это в основном .NET Framework, но наш тестовый проект нацелен на .NET Core 2.1 (в конечном итоге мы переместим весь наш проект на .NET Core 2.1+, но не можем сейчас). У меня возникает следующая ошибка:

C:\git\OurProduct\PPUXL\tools\.dotnet\sdk\2.1.4\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.TargetFrameworkInference.targets(135,5): error : The current .NET SDK does not support targeting .NET Core 2.1.  Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1. [C:\git\OurProduct\PPUXL\src\Portals\Core\OurProduct.Tests\OurProduct.Tests.csproj]

Поэтому обычно я скачивал бы новый SDK, но мы собираемся запустить скрипт в DevOps Azure на агенте сборки, и SDK не являются частью нашей рабочей станции, но загружаются и компилируются Cake с помощью запускаемого нами скрипта Powershell.

Вот код причины ошибки:

Task("Restore")
    .Does(() =>
    {
        //We need to change this code if we switch from .NET Framework to .NET Core for this project.
        NuGetRestore(
            solution,
            new NuGetRestoreSettings() 
            {
                PackagesDirectory = packagesDirectory       
            }
        );

        var projects = GetFiles("./**/*.csproj");
        foreach(var project in projects)
        {
                NuGetRestore(
                    project,
                    new NuGetRestoreSettings() 
                    {
                        PackagesDirectory = packagesDirectory       
                    }
                );
        }
    });

Task("Build")
    .Does(() =>
    {
        MSBuild(
                SAMLProject, 
                new MSBuildSettings()
                    .SetConfiguration(configuration)
                    .WithProperty("DeployOnBuild", "true")
                    .WithProperty("PublishProfile", configuration)
                    .WithProperty("publishUrl", SAMLDeployDirectory)
                    .WithProperty("WebPublishMethod", "FileSystem")
            );

        var projects = GetFiles("./**/*.csproj");
        foreach(var project in projects)
        {
            if(!project.FullPath.Contains("Tests") && !project.FullPath.Contains("SAML"))
            {
                MSBuild(
                    project, 
                    new MSBuildSettings()
                        .SetConfiguration(configuration)
                );
            }
        }

        MSBuild(
            testProject, 
            new MSBuildSettings()
                .SetConfiguration(configuration)
        );
    });

Я могу предотвратить ошибку, выполнив следующее:

Task("Restore")
    .Does(() =>
    {
        //We need to change this code if we switch from .NET Framework to .NET Core for this project.
        NuGetRestore(
            solution,
            new NuGetRestoreSettings() 
            {
                PackagesDirectory = packagesDirectory       
            }
        );

        var projects = GetFiles("./**/*.csproj");
        foreach(var project in projects)
        {
            if(!project.FullPath.Contains("Tests") && !project.FullPath.Contains("SAML"))
            {
                NuGetRestore(
                    project,
                    new NuGetRestoreSettings() 
                    {
                        PackagesDirectory = packagesDirectory       
                    }
                );
            }
        }
    });

Task("Build")
    .Does(() =>
    {
        MSBuild(
                SAMLProject, 
                new MSBuildSettings()
                    .SetConfiguration(configuration)
                    .WithProperty("DeployOnBuild", "true")
                    .WithProperty("PublishProfile", configuration)
                    .WithProperty("publishUrl", SAMLDeployDirectory)
                    .WithProperty("WebPublishMethod", "FileSystem")
            );

        var projects = GetFiles("./**/*.csproj");
        foreach(var project in projects)
        {
            if(!project.FullPath.Contains("Tests") && !project.FullPath.Contains("SAML"))
            {
                MSBuild(
                    project, 
                    new MSBuildSettings()
                        .SetConfiguration(configuration)
                );
            }
        }

        MSBuild(
            testProject, 
            new MSBuildSettings()
                .SetConfiguration(configuration)
        );
    });

Как можно запустить методы сборки для нацеливания на правильные библиотеки .NET Core с помощью Cake? Я хочу, чтобы все происходило внутри моего скрипта Powershell и моего скрипта Cake без влияния на окружающую среду. Заранее спасибо.

1 Ответ

1 голос
/ 23 апреля 2019

Cake не загружает какие-либо инструменты автоматически, но автоматически разрешает инструменты.

Ошибка может указывать на то, что на машине, на которой выполняется сборка, отсутствует .NET Core SDK, который может создавать .NET Core 2.1apps.

Вы можете загрузить установочный SDK .NET Core из https://dotnet.microsoft.com/download/dotnet-core/2.1

Для DevOps Azure вы можете использовать задачу .NET Core Tool Installer *1009*, чтобы обеспечить

Если вы хотите хранить свои инструменты в репозитории и ничего не устанавливать в программные файлы, то установка SDK с помощью ускорителя PowerShell / Bash - это способ гарантировать, что каждый получит и использует один и тот же SDK, не затрагивая остальную частьsystem.

Microsoft предоставляет сценарии для получения SDK на

Пример использования:

   dotnet-install.ps1 -Channel 'LTS' -Version '2.1.603' -InstallDir '.\dotnet';

Сам проект Cake использует этот метод в build.ps1 , загружая нужную версию SDK, если она недоступна на компьютере.

Если вы также хотитевубедитесь, что вы используете загруженный SDK для создания своих проектов, затем вы можете переключиться с псевдонимов NuGetRestore / MSBuild на

Эти псевдонимы будут вызывать CLI .NET Core, и если загруженный CLI .NET COre находится первым в пути или указан в свойстве ToolPath настроек псевдонимов .NET Core, то он будеттот, который использовал..NET Core SDK может создавать проекты как .NET Core, так и .NET Framework.Т.е. проект Cake достигает этого в своем build.ps1 добавлении папки dotnet первым в переменную окружения path.

...