Ejemplo n.º 1
0
        public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext resolverContext, SdkResultFactory factory)
        {
            if (sdkReference.Name != "Mono.UE4.Sdk")
            {
                return(factory.IndicateFailure(new[] { $"Not a UE4 SDK reference" }));
            }

            //provide a way to force a specific directory
            string engineDir = Environment.GetEnvironmentVariable("MONOUE_SDKRESOLVER_OVERRIDE_ENGINE_DIR");

            if (string.IsNullOrEmpty(engineDir))
            {
                var uproject = GetUProjectFromMSBuildProject(resolverContext.SolutionFilePath, resolverContext.ProjectFilePath);
                if (uproject == null)
                {
                    return(factory.IndicateFailureAndLog(new[] { $"Could not find a uproject file" }));
                }

                var engineAssociation = ReadEngineAssociationFromUProject(uproject);
                engineDir = GetEngineFromID(engineAssociation);

                if (string.IsNullOrEmpty(engineDir))
                {
                    string installedLocationsInfo = ". Found: " + string.Join(", ", EnumerateEngineInstallations().ToList().Select(x => x.ID));
                    return(factory.IndicateFailureAndLog(new[] { $"Could not find UE4 engine matching '{engineAssociation}' {installedLocationsInfo}" }));
                }
            }

            if (!Directory.Exists(engineDir))
            {
                return(factory.IndicateFailureAndLog(new[] { $"UE4 engine directory '{engineDir}' does not exist" }));
            }

            if (!IsValidEngineDirectory(engineDir))
            {
                return(factory.IndicateFailureAndLog(new[] { $"Engine '{engineDir}' is not a valid installation" }));
            }

            if (!IsMonoUEEngineDirectory(engineDir))
            {
                return(factory.IndicateFailureAndLog(new[] { $"Engine '{engineDir}' does not contain MonoUE plugin" }));
            }

            var sdkDir = Path.Combine(engineDir, "Engine", "Plugins", "MonoUE", "MSBuild", "Sdks", sdkReference.Name, "Sdk");

            if (Directory.Exists(sdkDir))
            {
                string engineVersion = GetEngineVersion(engineDir);
                return(factory.IndicateSuccess(sdkDir, "1.0"));
            }

            return(factory.IndicateFailureAndLog(new[] { $"Did not find SDK '{sdkReference.Name}'" }));
        }