关于powershell:Cake Build 4.0中的.NET Core 2.1版本错误NuGetRestore和MSBuild操作

.NET Core 2.1 version error with Cake Build 4.0 NuGetRestore and MSBuild actions

Cake Build 4.0.0通过执行MSBuild CLI命令来运行NuGetRestore和MSBuild方法。据我了解,Cake下载了某些版本的MSBuild。在我的解决方案中,它主要是.NET Framework,但我们的测试项目的目标是.NET Core 2.1(我们最终会将整个项目移至.NET Core 2.1,但现在不能。)我遇到以下错误:

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脚本下载和编译的。

以下是导致错误的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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)
        );
    });

我可以通过以下操作防止错误发生:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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脚本中进行,并且不影响环境。预先感谢。


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

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

您可以从https://dotnet.microsoft.com/download/dotnet-core/2.1

下载安装的.NET Core SDK。

对于Azure DevOps,可以使用.NET Core工具安装程序任务来确保

如果您想将您的工具包含在存储库中,而不希望将任何内容安装到程序文件中,那么使用PowerShell / Bash boostrapper安装SDK是一种确保每个人都能获取并使用相同SDK而不影响其余SDK的一种方法系统的

Microsoft在

提供了用于获取SDK的脚本

  • https://dot.net/v1/dotnet-install.ps1
  • https://dot.net/v1/dotnet-install.sh

用法示例:

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

Cake项目本身在build.ps1中使用此方法,如果计算机上不可用,则下载所需的SDK版本。

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

  • DotNetCoreRestore
  • DotNetCoreBuild

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