.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中实现此目标。