Exemple #1
0
        private Match GetElementMatch(ElementPath elementPath, PackageReference package)
        {
            Match match = null;

            if (elementPath.Element != null)
            {
                switch (elementPath.Element)
                {
                case ProjectItemElement itemElement:

                    if (itemElement.ItemType.Equals("Analyzer", StringComparison.OrdinalIgnoreCase))
                    {
                        match = RegularExpressions.Analyzers[package.PackageIdentity].Match(elementPath.FullPath);

                        if (match.Success)
                        {
                            package.AnalyzerItems.Add(itemElement);
                        }
                    }
                    else if (itemElement.ItemType.Equals("Reference", StringComparison.OrdinalIgnoreCase))
                    {
                        if (File.Exists(elementPath.FullPath))
                        {
                            match = RegularExpressions.AssemblyReferences[package.PackageIdentity].Match(elementPath.FullPath);

                            if (match.Success)
                            {
                                package.AssemblyReferences.Add(itemElement);
                            }
                        }
                    }

                    break;

                case ProjectImportElement importElement:

                    match = RegularExpressions.Imports[package.PackageIdentity].Match(elementPath.FullPath);

                    if (match.Success)
                    {
                        package.Imports.Add(importElement);
                    }

                    break;
                }
            }

            return(match);
        }
Exemple #2
0
        private void ProcessElement(ProjectElement element, List <PackageReference> packages)
        {
            switch (element)
            {
            case ProjectPropertyElement propertyElement:
                if (PropertiesToRemove.Contains(propertyElement.Name))
                {
                    Log.Debug($"    {element.Location}: Removing property \"{element.ElementName}\"");
                    propertyElement.Remove();
                    return;
                }

                break;

            case ProjectItemElement itemElement:
                if (ItemsToRemove.Contains(itemElement.ItemType) || ItemsToRemove.Contains(itemElement.Include))
                {
                    Log.Debug($"    {element.Location}: Removing item \"{itemElement.ItemType}\"");
                    itemElement.Remove();
                    return;
                }

                break;

            case ProjectTargetElement targetElement:
                if (TargetsToRemove.Contains(targetElement.Name))
                {
                    Log.Debug($"    {element.Location}: Removing target \"{targetElement.Name}\"");
                    targetElement.Remove();
                    return;
                }

                break;
            }

            ElementPath elementPath = new ElementPath(element);

            bool elementPathIsValid = false;

            foreach (PackageReference package in packages.Where(i => !i.IsMissingTransitiveDependency))
            {
                Match match = GetElementMatch(elementPath, package);

                if (match != null && match.Success && match.Groups["version"] != null && match.Groups["version"].Success && NuGetVersion.TryParse(match.Groups["version"].Value, out NuGetVersion version))
                {
                    elementPathIsValid = true;

                    if (!version.Equals(package.PackageIdentity.Version))
                    {
                        Log.Warn($"  {element.Location}: The package version \"{version}\" specified in the \"{element.ElementName}\" element does not match the package version \"{package.PackageVersion}\".  After conversion, the project will reference ONLY version \"{package.PackageVersion}\"");
                    }
                }
            }

            if (!elementPathIsValid && IsPathRootedInRepositoryPath(elementPath.FullPath))
            {
                PackageReference package = packages.FirstOrDefault(i => !string.IsNullOrEmpty(i.RepositoryInstalledPath) && elementPath.FullPath.StartsWith(i.RepositoryInstalledPath));

                if (package == null)
                {
                    // TODO: Using a package that isn't referenced
                }
                else
                {
                    string path = Path.Combine(package.GlobalInstalledPath, elementPath.FullPath.Substring(package.RepositoryInstalledPath.Length + 1));

                    if (!File.Exists(path) && !Directory.Exists(path))
                    {
                        // TODO: Using a path that doesn't exist?
                    }
                    else
                    {
                        var generatedProperty = $"$(Pkg{package.PackageId.Replace(".", "_").Replace("-", "_")})";
                        path = $"{generatedProperty}{path.Substring(_globalPackagesFolder.Length + package.PackageId.Length + package.PackageVersion.ToFullString().Length + 1 + 1)}";

                        package.GeneratePathProperty = true;
                        elementPath.Set(path);
                    }
                }
            }
        }
Exemple #3
0
        private ProjectItemElement AddPackageReference(ProjectItemGroupElement itemGroupElement, PackageReference package)
        {
            LibraryIncludeFlags includeAssets = LibraryIncludeFlags.All;
            LibraryIncludeFlags excludeAssets = LibraryIncludeFlags.None;

            LibraryIncludeFlags privateAssets = LibraryIncludeFlags.None;

            if (package.HasFolder("build") && package.Imports.Count == 0)
            {
                excludeAssets |= LibraryIncludeFlags.Build;
            }

            if (package.HasFolder("lib") && package.AssemblyReferences.Count == 0)
            {
                excludeAssets |= LibraryIncludeFlags.Compile;
                excludeAssets |= LibraryIncludeFlags.Runtime;
            }

            if (package.HasFolder("analyzers") && package.AnalyzerItems.Count == 0)
            {
                excludeAssets |= LibraryIncludeFlags.Analyzers;
            }

            if (package.IsDevelopmentDependency)
            {
                privateAssets |= LibraryIncludeFlags.All;
            }

            if (package.IsMissingTransitiveDependency)
            {
                includeAssets = LibraryIncludeFlags.None;
                excludeAssets = LibraryIncludeFlags.None;
                privateAssets = LibraryIncludeFlags.All;
            }

            ProjectItemElement itemElement = itemGroupElement.AppendItem("PackageReference", package.PackageIdentity.Id);

            itemElement.AddMetadataAsAttribute("Version", package.PackageVersion.ToNormalizedString());

            if (includeAssets != LibraryIncludeFlags.All)
            {
                itemElement.AddMetadataAsAttribute("IncludeAssets", includeAssets.ToString());
            }

            if (excludeAssets != LibraryIncludeFlags.None)
            {
                itemElement.AddMetadataAsAttribute("ExcludeAssets", excludeAssets.ToString());
            }

            if (privateAssets != LibraryIncludeFlags.None)
            {
                itemElement.AddMetadataAsAttribute("PrivateAssets", privateAssets.ToString());
            }

            if (package.GeneratePathProperty)
            {
                itemElement.AddMetadataAsAttribute("GeneratePathProperty", bool.TrueString);
            }

            return(itemElement);
        }