public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext context, SdkResultFactory factory) { string dotnetRoot = null; string msbuildSdksDir = null; string netcoreSdkVersion = null; IDictionary <string, string> propertiesToAdd = null; IDictionary <string, SdkResultItem> itemsToAdd = null; List <string> warnings = null; CachingWorkloadResolver workloadResolver = null; if (context.State is CachedState priorResult) { dotnetRoot = priorResult.DotnetRoot; msbuildSdksDir = priorResult.MSBuildSdksDir; netcoreSdkVersion = priorResult.NETCoreSdkVersion; propertiesToAdd = priorResult.PropertiesToAdd; workloadResolver = priorResult.WorkloadResolver; } if (context.IsRunningInVisualStudio) { workloadResolver = _staticWorkloadResolver; } if (workloadResolver == null) { workloadResolver = new CachingWorkloadResolver(); } if (msbuildSdksDir == null) { dotnetRoot = EnvironmentProvider.GetDotnetExeDirectory(_getEnvironmentVariable); string globalJsonStartDir = Path.GetDirectoryName(context.SolutionFilePath ?? context.ProjectFilePath); var resolverResult = _netCoreSdkResolver.ResolveNETCoreSdkDirectory(globalJsonStartDir, context.MSBuildVersion, context.IsRunningInVisualStudio, dotnetRoot); if (resolverResult.ResolvedSdkDirectory == null) { return(Failure( factory, Strings.UnableToLocateNETCoreSdk)); } msbuildSdksDir = Path.Combine(resolverResult.ResolvedSdkDirectory, "Sdks"); netcoreSdkVersion = new DirectoryInfo(resolverResult.ResolvedSdkDirectory).Name; // These are overrides that are used to force the resolved SDK tasks and targets to come from a given // base directory and report a given version to msbuild (which may be null if unknown. One key use case // for this is to test SDK tasks and targets without deploying them inside the .NET Core SDK. var msbuildSdksDirFromEnv = _getEnvironmentVariable("DOTNET_MSBUILD_SDK_RESOLVER_SDKS_DIR"); var netcoreSdkVersionFromEnv = _getEnvironmentVariable("DOTNET_MSBUILD_SDK_RESOLVER_SDKS_VER"); if (!string.IsNullOrEmpty(msbuildSdksDirFromEnv)) { msbuildSdksDir = msbuildSdksDirFromEnv; } if (!string.IsNullOrEmpty(netcoreSdkVersionFromEnv)) { netcoreSdkVersion = netcoreSdkVersionFromEnv; } if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, sdkReference.MinimumVersion)) { return(Failure( factory, Strings.NETCoreSDKSmallerThanMinimumRequestedVersion, netcoreSdkVersion, sdkReference.MinimumVersion)); } Version minimumMSBuildVersion = _netCoreSdkResolver.GetMinimumMSBuildVersion(resolverResult.ResolvedSdkDirectory); if (context.MSBuildVersion < minimumMSBuildVersion) { return(Failure( factory, Strings.MSBuildSmallerThanMinimumVersion, netcoreSdkVersion, minimumMSBuildVersion, context.MSBuildVersion)); } string minimumVSDefinedSDKVersion = GetMinimumVSDefinedSDKVersion(); if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, minimumVSDefinedSDKVersion)) { return(Failure( factory, Strings.NETCoreSDKSmallerThanMinimumVersionRequiredByVisualStudio, netcoreSdkVersion, minimumVSDefinedSDKVersion)); } if (resolverResult.FailedToResolveSDKSpecifiedInGlobalJson) { if (warnings == null) { warnings = new List <string>(); } warnings.Add(Strings.GlobalJsonResolutionFailed); if (propertiesToAdd == null) { propertiesToAdd = new Dictionary <string, string>(); } propertiesToAdd.Add("SdkResolverHonoredGlobalJson", "false"); propertiesToAdd.Add("SdkResolverGlobalJsonPath", resolverResult.GlobalJsonPath); } } context.State = new CachedState { DotnetRoot = dotnetRoot, MSBuildSdksDir = msbuildSdksDir, NETCoreSdkVersion = netcoreSdkVersion, PropertiesToAdd = propertiesToAdd, WorkloadResolver = workloadResolver }; // First check if requested SDK resolves to a workload SDK pack string userProfileDir = CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath(); var workloadResult = workloadResolver.Resolve(sdkReference.Name, dotnetRoot, netcoreSdkVersion, userProfileDir); if (workloadResult is not CachingWorkloadResolver.NullResolutionResult) { return(workloadResult.ToSdkResult(sdkReference, factory)); } string msbuildSdkDir = Path.Combine(msbuildSdksDir, sdkReference.Name, "Sdk"); if (!Directory.Exists(msbuildSdkDir)) { return(Failure( factory, Strings.MSBuildSDKDirectoryNotFound, msbuildSdkDir)); } return(factory.IndicateSuccess(msbuildSdkDir, netcoreSdkVersion, propertiesToAdd, itemsToAdd, warnings)); }
public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext context, SdkResultFactory factory) { string msbuildSdksDir = null; string netcoreSdkVersion = null; IDictionary <string, string> propertiesToAdd = null; IDictionary <string, SdkResultItem> itemsToAdd = null; List <string> warnings = null; if (context.State is CachedResult priorResult) { msbuildSdksDir = priorResult.MSBuildSdksDir; netcoreSdkVersion = priorResult.NETCoreSdkVersion; } if (msbuildSdksDir == null) { // These are overrides that are used to force the resolved SDK tasks and targets to come from a given // base directory and report a given version to msbuild (which may be null if unknown. One key use case // for this is to test SDK tasks and targets without deploying them inside the .NET Core SDK. msbuildSdksDir = _getEnvironmentVariable("DOTNET_MSBUILD_SDK_RESOLVER_SDKS_DIR"); netcoreSdkVersion = _getEnvironmentVariable("DOTNET_MSBUILD_SDK_RESOLVER_SDKS_VER"); } if (msbuildSdksDir == null) { string dotnetExeDir = _netCoreSdkResolver.GetDotnetExeDirectory(); string globalJsonStartDir = Path.GetDirectoryName(context.SolutionFilePath ?? context.ProjectFilePath); var resolverResult = _netCoreSdkResolver.ResolveNETCoreSdkDirectory(globalJsonStartDir, context.MSBuildVersion, context.IsRunningInVisualStudio, dotnetExeDir); if (resolverResult.ResolvedSdkDirectory == null) { return(Failure( factory, Strings.UnableToLocateNETCoreSdk)); } msbuildSdksDir = Path.Combine(resolverResult.ResolvedSdkDirectory, "Sdks"); netcoreSdkVersion = new DirectoryInfo(resolverResult.ResolvedSdkDirectory).Name; if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, sdkReference.MinimumVersion)) { return(Failure( factory, Strings.NETCoreSDKSmallerThanMinimumRequestedVersion, netcoreSdkVersion, sdkReference.MinimumVersion)); } Version minimumMSBuildVersion = _netCoreSdkResolver.GetMinimumMSBuildVersion(resolverResult.ResolvedSdkDirectory); if (context.MSBuildVersion < minimumMSBuildVersion) { return(Failure( factory, Strings.MSBuildSmallerThanMinimumVersion, netcoreSdkVersion, minimumMSBuildVersion, context.MSBuildVersion)); } string minimumVSDefinedSDKVersion = GetMinimumVSDefinedSDKVersion(); if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, minimumVSDefinedSDKVersion)) { return(Failure( factory, Strings.NETCoreSDKSmallerThanMinimumVersionRequiredByVisualStudio, netcoreSdkVersion, minimumVSDefinedSDKVersion)); } if (resolverResult.FailedToResolveSDKSpecifiedInGlobalJson) { if (warnings == null) { warnings = new List <string>(); } warnings.Add(Strings.GlobalJsonResolutionFailed); if (propertiesToAdd == null) { propertiesToAdd = new Dictionary <string, string>(); } propertiesToAdd.Add("SdkResolverHonoredGlobalJson", "false"); propertiesToAdd.Add("SdkResolverGlobalJsonPath", resolverResult.GlobalJsonPath); } } context.State = new CachedResult { MSBuildSdksDir = msbuildSdksDir, NETCoreSdkVersion = netcoreSdkVersion }; string msbuildSdkDir = Path.Combine(msbuildSdksDir, sdkReference.Name, "Sdk"); if (!Directory.Exists(msbuildSdkDir)) { return(Failure( factory, Strings.MSBuildSDKDirectoryNotFound, msbuildSdkDir)); } return(factory.IndicateSuccess(msbuildSdkDir, netcoreSdkVersion, propertiesToAdd, itemsToAdd, warnings)); }