【问题标题】:.NET Core 2.1 version error with Cake Build 4.0 NuGetRestore and MSBuild actionsCake Build 4.0 NuGetRestore 和 MSBuild 操作的 .NET Core 2.1 版本错误
【发布时间】:2019-09-11 23:24:51
【问题描述】:

Cake Build 4.0.0 通过执行 MSBuild CLI 命令来运行 NuGetRestore 和 MSBuild 方法。据我了解,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,但我们将在构建代理上运行 Azure DevOps 上的脚本,这些 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)
        );
    });

如何使用 Cake 运行构建方法来定位正确的 .NET Core 库?我希望构建全部发生在我的 Powershell 脚本和我的 Cake 脚本中,而不受环境影响。提前致谢。

【问题讨论】:

    标签: powershell .net-core msbuild nuget cakebuild


    【解决方案1】:

    Cake 不会自动下载任何工具,但它会自动解析工具。

    该错误表明运行构建的机器缺少可以构建 .NET Core 2.1 应用程序的 .NET Core SDK。

    您可以从https://dotnet.microsoft.com/download/dotnet-core/2.1 下载安装 .NET Core SDK

    对于 Azure DevOps,您可以使用.NET Core Tool Installer task 来确保

    如果您想将您的工具包含在存储库中并且不将任何东西安装到 ie 程序文件中,那么使用 PowerShell/Bash boostrapper 安装 SDK 是一种确保每个人都获得和使用相同 SDK 而不会影响系统其余部分的方法.

    Microsoft 提供了用于获取 SDK 的脚本

    示例用法:

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

    Cake 项目本身在其build.ps1 中使用此方法,如果机器上没有可用的 SDK 版本,则下载它所需的 SDK 版本。

    如果您还想确保使用下载的 SDK 来构建您的项目,那么您可以从 NuGetRestore/MSBuild 别名切换到

    这些别名将调用 .NET Core CLI,如果下载的 .NET COre CLI 在路径中的第一个或在 .NET Core 别名设置 ToolPath 属性中指定,那么它将是使用的那个。 .NET Core SDK 可以构建 .NET Core 和 .NET Framework 项目。 IE。 Cake 项目在其build.ps1 中通过首先在路径环境变量中添加 dotnet 文件夹来实现这一点。

    【讨论】:

    • 我有 dotnet 2.1.6(当我使用 PS 中的 dotnet 版本检查时)。所以我不知道为什么它不起作用......
    • @RossGustafson 可能是运行时版本,不一定是任何 sdk。运行 dotnet --list-sdks 可以看到有哪些 .NET Core sdks 可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多