/// <summary> /// Gets the project references of the specified project. /// </summary> /// <param name="project">The <see cref="ProjectInstance" /> to get project references for.</param> /// <returns>A <see cref="List{ProjectRestoreReference}" /> containing the project references for the specified project.</returns> internal static List <ProjectRestoreReference> GetProjectReferences(IMSBuildProject project) { // Get the unique list of ProjectReference items that have the ReferenceOutputAssembly metadata set to "true", ignoring duplicates var projectReferenceItems = project.GetItems("ProjectReference") .Where(i => i.IsPropertyTrue("ReferenceOutputAssembly", defaultValue: true)) .Distinct(ProjectItemInstanceEvaluatedIncludeComparer.Instance) .ToList(); var projectReferences = new List <ProjectRestoreReference>(projectReferenceItems.Count); foreach (var projectReferenceItem in projectReferenceItems) { string fullPath = projectReferenceItem.GetProperty("FullPath"); projectReferences.Add(new ProjectRestoreReference { ExcludeAssets = GetLibraryIncludeFlags(projectReferenceItem.GetProperty("ExcludeAssets"), LibraryIncludeFlags.None), IncludeAssets = GetLibraryIncludeFlags(projectReferenceItem.GetProperty("IncludeAssets"), LibraryIncludeFlags.All), PrivateAssets = GetLibraryIncludeFlags(projectReferenceItem.GetProperty("PrivateAssets"), LibraryIncludeFlagUtils.DefaultSuppressParent), ProjectPath = fullPath, ProjectUniqueName = fullPath }); } return(projectReferences); }
/// <summary> /// Gets the package references for the specified project. /// </summary> /// <param name="project">The <see cref="ProjectInstance" /> to get package references for.</param> /// <returns>A <see cref="List{LibraryDependency}" /> containing the package references for the specified project.</returns> internal static List <LibraryDependency> GetPackageReferences(IMSBuildProject project) { // Get the distinct PackageReference items, ignoring duplicates var packageReferenceItems = project.GetItems("PackageReference").Distinct(ProjectItemInstanceEvaluatedIncludeComparer.Instance).ToList(); var libraryDependencies = new List <LibraryDependency>(packageReferenceItems.Count); foreach (var packageReferenceItem in packageReferenceItems) { string version = packageReferenceItem.GetProperty("Version"); libraryDependencies.Add(new LibraryDependency { AutoReferenced = packageReferenceItem.IsPropertyTrue("IsImplicitlyDefined"), GeneratePathProperty = packageReferenceItem.IsPropertyTrue("GeneratePathProperty"), IncludeType = GetLibraryIncludeFlags(packageReferenceItem.GetProperty("IncludeAssets"), LibraryIncludeFlags.All) & ~GetLibraryIncludeFlags(packageReferenceItem.GetProperty("ExcludeAssets"), LibraryIncludeFlags.None), LibraryRange = new LibraryRange( packageReferenceItem.Identity, !string.IsNullOrWhiteSpace(version) ? VersionRange.Parse(version) : VersionRange.All, LibraryDependencyTarget.Package), NoWarn = MSBuildStringUtility.GetNuGetLogCodes(packageReferenceItem.GetProperty("NoWarn")).ToList(), SuppressParent = GetLibraryIncludeFlags(packageReferenceItem.GetProperty("PrivateAssets"), LibraryIncludeFlagUtils.DefaultSuppressParent) }); } return(libraryDependencies); }
/// <summary> /// Gets the framework references per target framework for the specified project. /// </summary> /// <param name="project">The <see cref="ProjectInstance" /> to get framework references for.</param> /// <returns>A <see cref="List{FrameworkDependency}" /> containing the framework references for the specified project.</returns> internal static List <FrameworkDependency> GetFrameworkReferences(IMSBuildProject project) { // Get the unique FrameworkReference items, ignoring duplicates var frameworkReferenceItems = project.GetItems("FrameworkReference").Distinct(ProjectItemInstanceEvaluatedIncludeComparer.Instance).ToList(); // For best performance, its better to create a list with the exact number of items needed rather than using a LINQ statement or AddRange. This is because if the list // is not allocated with enough items, the list has to be grown which can slow things down var frameworkDependencies = new List <FrameworkDependency>(frameworkReferenceItems.Count); foreach (var frameworkReferenceItem in frameworkReferenceItems) { var privateAssets = MSBuildStringUtility.Split(frameworkReferenceItem.GetProperty("PrivateAssets")); frameworkDependencies.Add(new FrameworkDependency(frameworkReferenceItem.Identity, FrameworkDependencyFlagsUtils.GetFlags(privateAssets))); } return(frameworkDependencies); }
/// <summary> /// Gets the package downloads for the specified project. /// </summary> /// <param name="project">The <see cref="ProjectInstance" /> to get package downloads for.</param> /// <returns>An <see cref="IEnumerable{DownloadDependency}" /> containing the package downloads for the specified project.</returns> internal static IEnumerable <DownloadDependency> GetPackageDownloads(IMSBuildProject project) { // Get the distinct PackageDownload items, ignoring duplicates foreach (var projectItemInstance in project.GetItems("PackageDownload").Distinct(ProjectItemInstanceEvaluatedIncludeComparer.Instance)) { string id = projectItemInstance.Identity; // PackageDownload items can contain multiple versions foreach (var version in MSBuildStringUtility.Split(projectItemInstance.GetProperty("Version"))) { // Validate the version range VersionRange versionRange = !string.IsNullOrWhiteSpace(version) ? VersionRange.Parse(version) : VersionRange.All; if (!(versionRange.HasLowerAndUpperBounds && versionRange.MinVersion.Equals(versionRange.MaxVersion))) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.Error_PackageDownload_OnlyExactVersionsAreAllowed, versionRange.OriginalString)); } yield return(new DownloadDependency(id, versionRange)); } } }