Esempio n. 1
0
        private bool KnownFrameworkReferenceAppliesToTargetFramework(KnownFrameworkReference kfr)
        {
            if (!kfr.TargetFramework.Framework.Equals(TargetFrameworkIdentifier, StringComparison.OrdinalIgnoreCase) ||
                NormalizeVersion(kfr.TargetFramework.Version) != _normalizedTargetFrameworkVersion)
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(kfr.TargetFramework.Platform) &&
                kfr.TargetFramework.PlatformVersion != null)
            {
                if (!Version.TryParse(TargetPlatformVersion, out var targetPlatformVersionParsed))
                {
                    return(false);
                }

                if (NormalizeVersion(targetPlatformVersionParsed) != NormalizeVersion(kfr.TargetFramework.PlatformVersion) ||
                    NormalizeVersion(kfr.TargetFramework.Version) != _normalizedTargetFrameworkVersion)
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 2
0
        private void ProcessRuntimeIdentifier(string runtimeIdentifier, KnownFrameworkReference knownFrameworkReference,
                                              string runtimeFrameworkVersion, HashSet <string> unrecognizedRuntimeIdentifiers,
                                              List <ITaskItem> unavailableRuntimePacks, List <ITaskItem> runtimePacks, List <ITaskItem> packagesToDownload, string isTrimmable)
        {
            var runtimeGraph = new RuntimeGraphCache(this).GetRuntimeGraph(RuntimeGraphPath);
            var knownFrameworkReferenceRuntimePackRuntimeIdentifiers = knownFrameworkReference.RuntimePackRuntimeIdentifiers.Split(';');

            string runtimePackRuntimeIdentifier = NuGetUtils.GetBestMatchingRid(
                runtimeGraph,
                runtimeIdentifier,
                knownFrameworkReferenceRuntimePackRuntimeIdentifiers,
                out bool wasInGraph);

            if (runtimePackRuntimeIdentifier == null)
            {
                if (wasInGraph)
                {
                    //  Report this as an error later, if necessary.  This is because we try to download
                    //  all available runtime packs in case there is a transitive reference to a shared
                    //  framework we don't directly reference.  But we don't want to immediately error out
                    //  here if a runtime pack that we might not need to reference isn't available for the
                    //  targeted RID (e.g. Microsoft.WindowsDesktop.App for a linux RID).
                    var unavailableRuntimePack = new TaskItem(knownFrameworkReference.Name);
                    unavailableRuntimePack.SetMetadata(MetadataKeys.RuntimeIdentifier, runtimeIdentifier);
                    unavailableRuntimePacks.Add(unavailableRuntimePack);
                }
                else if (!unrecognizedRuntimeIdentifiers.Contains(runtimeIdentifier))
                {
                    //  NETSDK1083: The specified RuntimeIdentifier '{0}' is not recognized.
                    Log.LogError(Strings.RuntimeIdentifierNotRecognized, runtimeIdentifier);
                    unrecognizedRuntimeIdentifiers.Add(runtimeIdentifier);
                }
            }
            else
            {
                foreach (var runtimePackNamePattern in knownFrameworkReference.RuntimePackNamePatterns.Split(';'))
                {
                    string runtimePackName = runtimePackNamePattern.Replace("**RID**", runtimePackRuntimeIdentifier);

                    if (runtimePacks != null)
                    {
                        TaskItem runtimePackItem = new TaskItem(runtimePackName);
                        runtimePackItem.SetMetadata(MetadataKeys.PackageName, runtimePackName);
                        runtimePackItem.SetMetadata(MetadataKeys.PackageVersion, runtimeFrameworkVersion);
                        runtimePackItem.SetMetadata(MetadataKeys.FrameworkName, knownFrameworkReference.Name);
                        runtimePackItem.SetMetadata(MetadataKeys.RuntimeIdentifier, runtimePackRuntimeIdentifier);
                        runtimePackItem.SetMetadata(MetadataKeys.IsTrimmable, isTrimmable);
                        runtimePackItem.SetMetadata(MetadataKeys.AvailableRuntimeIdentifiers, knownFrameworkReference.RuntimePackRuntimeIdentifiers);

                        runtimePacks.Add(runtimePackItem);
                    }

                    TaskItem packageToDownload = new TaskItem(runtimePackName);
                    packageToDownload.SetMetadata(MetadataKeys.Version, runtimeFrameworkVersion);

                    packagesToDownload.Add(packageToDownload);
                }
            }
        }
Esempio n. 3
0
        private string GetRuntimeFrameworkVersion(
            ITaskItem frameworkReference,
            KnownFrameworkReference knownFrameworkReference,
            KnownRuntimePack?knownRuntimePack,
            out string runtimePackVersion)
        {
            //  Precedence order for selecting runtime framework version
            //  - RuntimeFrameworkVersion metadata on FrameworkReference item
            //  - RuntimeFrameworkVersion MSBuild property
            //  - Then, use either the LatestRuntimeFrameworkVersion or the DefaultRuntimeFrameworkVersion of the KnownFrameworkReference, based on
            //      - The value (if set) of TargetLatestRuntimePatch metadata on the FrameworkReference
            //      - The TargetLatestRuntimePatch MSBuild property (which defaults to True if SelfContained is true, and False otherwise)
            //      - But, if TargetLatestRuntimePatch was defaulted and not overridden by user, then acquire latest runtime pack for future
            //        self-contained deployment (or for crossgen of framework-dependent deployment), while targeting the default version.

            string requestedVersion = GetRequestedRuntimeFrameworkVersion(frameworkReference);

            if (!string.IsNullOrEmpty(requestedVersion))
            {
                runtimePackVersion = requestedVersion;
                return(requestedVersion);
            }

            switch (GetRuntimePatchRequest(frameworkReference))
            {
            case RuntimePatchRequest.UseDefaultVersion:
                runtimePackVersion = knownFrameworkReference.DefaultRuntimeFrameworkVersion;
                return(knownFrameworkReference.DefaultRuntimeFrameworkVersion);

            case RuntimePatchRequest.UseLatestVersion:
                if (knownRuntimePack != null)
                {
                    runtimePackVersion = knownRuntimePack?.LatestRuntimeFrameworkVersion;
                    return(knownRuntimePack?.LatestRuntimeFrameworkVersion);
                }
                else
                {
                    runtimePackVersion = knownFrameworkReference.DefaultRuntimeFrameworkVersion;
                    return(knownFrameworkReference.DefaultRuntimeFrameworkVersion);
                }

            case RuntimePatchRequest.UseDefaultVersionWithLatestRuntimePack:
                if (knownRuntimePack != null)
                {
                    runtimePackVersion = knownRuntimePack?.LatestRuntimeFrameworkVersion;
                }
                else
                {
                    runtimePackVersion = knownFrameworkReference.DefaultRuntimeFrameworkVersion;
                }
                return(knownFrameworkReference.DefaultRuntimeFrameworkVersion);

            default:
                // Unreachable
                throw new InvalidOperationException();
            }
        }
        private string GetRuntimeFrameworkVersion(ITaskItem frameworkReference, KnownFrameworkReference knownFrameworkReference)
        {
            //  Precedence order for selecting runtime framework version
            //  - RuntimeFrameworkVersion metadata on FrameworkReference item
            //  - RuntimeFrameworkVersion MSBuild property
            //  - Then, use either the LatestRuntimeFrameworkVersion or the DefaultRuntimeFrameworkVersion of the KnownFrameworkReference, based on
            //      - The value (if set) of TargetLatestRuntimePatch metadata on the FrameworkReference
            //      - The TargetLatestRuntimePatch MSBuild property (which defaults to True if SelfContained is true, and False otherwise)

            string runtimeFrameworkVersion = null;

            if (frameworkReference != null)
            {
                runtimeFrameworkVersion = frameworkReference.GetMetadata("RuntimeFrameworkVersion");
            }
            if (string.IsNullOrEmpty(runtimeFrameworkVersion))
            {
                runtimeFrameworkVersion = RuntimeFrameworkVersion;
            }
            if (string.IsNullOrEmpty(runtimeFrameworkVersion))
            {
                bool?useLatestRuntimeFrameworkVersion = null;
                if (frameworkReference != null)
                {
                    string useLatestRuntimeFrameworkMetadata = frameworkReference.GetMetadata("TargetLatestRuntimePatch");
                    if (!string.IsNullOrEmpty(useLatestRuntimeFrameworkMetadata))
                    {
                        useLatestRuntimeFrameworkVersion = MSBuildUtilities.ConvertStringToBool(useLatestRuntimeFrameworkMetadata,
                                                                                                defaultValue: false);
                    }
                }
                if (useLatestRuntimeFrameworkVersion == null)
                {
                    useLatestRuntimeFrameworkVersion = TargetLatestRuntimePatch;
                }
                if (useLatestRuntimeFrameworkVersion.Value)
                {
                    runtimeFrameworkVersion = knownFrameworkReference.LatestRuntimeFrameworkVersion;
                }
                else
                {
                    runtimeFrameworkVersion = knownFrameworkReference.DefaultRuntimeFrameworkVersion;
                }
            }

            return(runtimeFrameworkVersion);
        }
Esempio n. 5
0
        private KnownRuntimePack?SelectRuntimePack(ITaskItem frameworkReference, KnownFrameworkReference knownFrameworkReference, List <KnownRuntimePack> knownRuntimePacks)
        {
            var requiredLabelsMetadata = frameworkReference?.GetMetadata(MetadataKeys.RuntimePackLabels) ?? "";

            HashSet <string> requiredRuntimePackLabels = null;

            if (frameworkReference != null)
            {
                requiredRuntimePackLabels = new HashSet <string>(requiredLabelsMetadata.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries), StringComparer.OrdinalIgnoreCase);
            }

            //  The runtime pack name matches the RuntimeFrameworkName on the KnownFrameworkReference
            var matchingRuntimePacks = knownRuntimePacks.Where(krp => krp.Name.Equals(knownFrameworkReference.RuntimeFrameworkName, StringComparison.OrdinalIgnoreCase))
                                       .Where(krp =>
            {
                if (requiredRuntimePackLabels == null)
                {
                    return(krp.RuntimePackLabels.Length == 0);
                }
                else
                {
                    return(requiredRuntimePackLabels.SetEquals(krp.RuntimePackLabels));
                }
            })
                                       .ToList();

            if (matchingRuntimePacks.Count == 0)
            {
                return(null);
            }
            else if (matchingRuntimePacks.Count == 1)
            {
                return(matchingRuntimePacks[0]);
            }
            else
            {
                string runtimePackDescriptionForErrorMessage = knownFrameworkReference.RuntimeFrameworkName +
                                                               (requiredLabelsMetadata == string.Empty ? string.Empty : ":" + requiredLabelsMetadata);

                Log.LogError(Strings.ConflictingRuntimePackInformation, runtimePackDescriptionForErrorMessage,
                             string.Join(Environment.NewLine, matchingRuntimePacks.Select(rp => rp.RuntimePackNamePatterns)));

                return(knownFrameworkReference.ToKnownRuntimePack());
            }
        }