├── .gitignore ├── .nuget ├── NuGet.Config ├── NuGet.exe └── NuGet.targets ├── DGMLWriter.cs ├── DependencyViewModel.cs ├── DgmlColorConfiguration.cs ├── GraphHelper.cs ├── GraphVizColorConfiguration.cs ├── GraphVizNodeExtensions.cs ├── GraphvizWriter.cs ├── IColorConfiguration.cs ├── IPackageWriter.cs ├── NuGetPackageVisualizer.csproj ├── NuGetPackageVisualizer.nuspec ├── NuGetPackageVisualizer.sln ├── PackageViewModel.cs ├── Program.cs ├── Properties └── AssemblyInfo.cs ├── README.md ├── Service References └── NuGetService │ ├── Reference.cs │ ├── Reference.datasvcmap │ └── service.edmx ├── app.config ├── example.png ├── license.txt ├── packages.config └── projectExample.PNG /.gitignore: -------------------------------------------------------------------------------- 1 | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs) 2 | [Bb]in/ 3 | [Oo]bj/ 4 | 5 | # mstest test results 6 | TestResults 7 | 8 | ## Ignore Visual Studio temporary files, build results, and 9 | ## files generated by popular Visual Studio add-ons. 10 | 11 | # User-specific files 12 | *.suo 13 | *.user 14 | *.sln.docstates 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Rr]elease/ 19 | x64/ 20 | *_i.c 21 | *_p.c 22 | *.ilk 23 | *.meta 24 | *.obj 25 | *.pch 26 | *.pdb 27 | *.pgc 28 | *.pgd 29 | *.rsp 30 | *.sbr 31 | *.tlb 32 | *.tli 33 | *.tlh 34 | *.tmp 35 | *.log 36 | *.vspscc 37 | *.vssscc 38 | .builds 39 | 40 | # Visual C++ cache files 41 | ipch/ 42 | *.aps 43 | *.ncb 44 | *.opensdf 45 | *.sdf 46 | 47 | # Visual Studio profiler 48 | *.psess 49 | *.vsp 50 | *.vspx 51 | 52 | # Guidance Automation Toolkit 53 | *.gpState 54 | 55 | # ReSharper is a .NET coding add-in 56 | _ReSharper* 57 | 58 | # NCrunch 59 | *.ncrunch* 60 | .*crunch*.local.xml 61 | 62 | # Installshield output folder 63 | [Ee]xpress 64 | 65 | # DocProject is a documentation generator add-in 66 | DocProject/buildhelp/ 67 | DocProject/Help/*.HxT 68 | DocProject/Help/*.HxC 69 | DocProject/Help/*.hhc 70 | DocProject/Help/*.hhk 71 | DocProject/Help/*.hhp 72 | DocProject/Help/Html2 73 | DocProject/Help/html 74 | 75 | # Click-Once directory 76 | publish 77 | 78 | # Publish Web Output 79 | *.Publish.xml 80 | 81 | # NuGet Packages Directory 82 | packages 83 | 84 | # Windows Azure Build Output 85 | csx 86 | *.build.csdef 87 | 88 | # Windows Store app package directory 89 | AppPackages/ 90 | 91 | # Others 92 | [Bb]in 93 | [Oo]bj 94 | sql 95 | TestResults 96 | [Tt]est[Rr]esult* 97 | *.Cache 98 | ClientBin 99 | [Ss]tyle[Cc]op.* 100 | ~$* 101 | *.dbmdl 102 | Generated_Code #added for RIA/Silverlight projects 103 | 104 | # Backup & report files from converting an old project file to a newer 105 | # Visual Studio version. Backup files are not needed, because we have git ;-) 106 | _UpgradeReport_Files/ 107 | Backup*/ 108 | UpgradeLog*.XML*DotSettings 109 | /.vs/NuGetPackageVisualizer/v15/Server/sqlite3 110 | -------------------------------------------------------------------------------- /.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasArdal/NuGetPackageVisualizer/f34be4797988137dba52cf96d6b04b06b85c2b9a/.nuget/NuGet.exe -------------------------------------------------------------------------------- /.nuget/NuGet.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(MSBuildProjectDirectory)\..\ 5 | 6 | 7 | false 8 | 9 | 10 | false 11 | 12 | 13 | true 14 | 15 | 16 | false 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) 30 | $([System.IO.Path]::Combine($(ProjectDir), "packages.config")) 31 | 32 | 33 | 34 | 35 | $(SolutionDir).nuget 36 | packages.config 37 | 38 | 39 | 40 | 41 | $(NuGetToolsPath)\nuget.exe 42 | @(PackageSource) 43 | 44 | "$(NuGetExePath)" 45 | mono --runtime=v4.0.30319 $(NuGetExePath) 46 | 47 | $(TargetDir.Trim('\\')) 48 | 49 | -RequireConsent 50 | 51 | $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(RequireConsentSwitch) -solutionDir "$(SolutionDir) " 52 | $(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols 53 | 54 | 55 | 56 | RestorePackages; 57 | $(ResolveReferencesDependsOn); 58 | 59 | 60 | 61 | 62 | $(BuildDependsOn); 63 | BuildPackage; 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /DGMLWriter.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Diagnostics; 3 | using System.Linq; 4 | using System.Xml.Linq; 5 | 6 | namespace NuGetPackageVisualizer 7 | { 8 | public class DGMLWriter : IPackageWriter 9 | { 10 | public void Write(List packages, string file) 11 | { 12 | if (string.IsNullOrWhiteSpace(file)) 13 | { 14 | file = "packages.dgml"; 15 | } 16 | 17 | Debug.WriteLine($"Writing {file}."); 18 | 19 | XNamespace ns = "http://schemas.microsoft.com/vs/2009/dgml"; 20 | var colors = new DgmlColorConfiguration(); 21 | var nodes = 22 | packages 23 | .Select( 24 | package => 25 | new XElement(ns + "Node", 26 | new XAttribute("Id", package.Id), 27 | new XAttribute("Label", string.Format("{0} ({1})", package.NugetId, package.LocalVersion)), 28 | new XAttribute("Background", GraphHelper.GenerateBackgroundColor(packages, package, colors)))) 29 | .ToList(); 30 | 31 | var links = 32 | (packages 33 | .SelectMany( 34 | package => package.Dependencies, (package, dep) => 35 | new XElement(ns + "Link", 36 | new XAttribute("Source", package.Id), 37 | new XAttribute("Target", packages.Any(x => x.NugetId == dep.NugetId && x.LocalVersion == dep.Version) ? packages.First(x => x.NugetId == dep.NugetId && x.LocalVersion == dep.Version).Id : string.Format("{0} ({1})", dep.NugetId, dep.Version))))) 38 | .ToList(); 39 | 40 | var document = 41 | new XDocument( 42 | new XDeclaration("1.0", "utf-8", string.Empty), 43 | new XElement(ns + "DirectedGraph", new XElement(ns + "Nodes", nodes), new XElement(ns + "Links", links))); 44 | 45 | document.Save(file); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /DependencyViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace NuGetPackageVisualizer 2 | { 3 | public class DependencyViewModel 4 | { 5 | public string NugetId { get; set; } 6 | 7 | public string Version { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /DgmlColorConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace NuGetPackageVisualizer 2 | { 3 | public class DgmlColorConfiguration : IColorConfiguration 4 | { 5 | public string VersionMismatchPackageColor 6 | { 7 | get { return "#FF0000"; } 8 | } 9 | 10 | public string PackageHasDifferentVersionsColor 11 | { 12 | get { return "#FCE428"; } 13 | } 14 | 15 | public string DefaultColor 16 | { 17 | get { return "#339933"; } 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /GraphHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | 4 | namespace NuGetPackageVisualizer 5 | { 6 | public static class GraphHelper 7 | { 8 | public static string GenerateBackgroundColor(IEnumerable packages, PackageViewModel package, IColorConfiguration colors) 9 | { 10 | if (VersionMismatch(package)) 11 | { 12 | return colors.VersionMismatchPackageColor; 13 | } 14 | 15 | if (HasSamePackageInDifferentVersion(packages, package)) 16 | { 17 | return colors.PackageHasDifferentVersionsColor; 18 | } 19 | 20 | return colors.DefaultColor; 21 | } 22 | 23 | private static bool HasSamePackageInDifferentVersion(IEnumerable packages, PackageViewModel package) 24 | { 25 | return packages.Any(p => p.NugetId == package.NugetId && p.LocalVersion != package.LocalVersion); 26 | } 27 | 28 | private static bool VersionMismatch(PackageViewModel package) 29 | { 30 | return package.LocalVersion != package.RemoteVersion; 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /GraphVizColorConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace NuGetPackageVisualizer 2 | { 3 | public class GraphVizColorConfiguration : IColorConfiguration 4 | { 5 | public string VersionMismatchPackageColor 6 | { 7 | get { return "red"; } 8 | } 9 | 10 | public string PackageHasDifferentVersionsColor 11 | { 12 | get { return "grey"; } 13 | } 14 | 15 | public string DefaultColor 16 | { 17 | get { return "forestgreen"; } 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /GraphVizNodeExtensions.cs: -------------------------------------------------------------------------------- 1 | namespace NuGetPackageVisualizer 2 | { 3 | public static class GraphVizNodeExtensions 4 | { 5 | public static string GraphId(this PackageViewModel model) 6 | { 7 | return string.Format("{0}_{1}", model.NugetId, model.LocalVersion); 8 | } 9 | 10 | public static string DisplayVersion(this PackageViewModel model) 11 | { 12 | return string.Format("{0} ({1})", model.NugetId, model.LocalVersion); 13 | } 14 | 15 | public static string GraphId(this DependencyViewModel model) 16 | { 17 | return string.Format("{0}_{1}", model.NugetId, model.Version); 18 | } 19 | 20 | public static string DisplayVersion(this DependencyViewModel model) 21 | { 22 | return string.Format("{0} ({1})", model.NugetId, model.Version); 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /GraphvizWriter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | 8 | namespace NuGetPackageVisualizer 9 | { 10 | public class GraphvizWriter : IPackageWriter 11 | { 12 | public void Write(List packages, string file) 13 | { 14 | if (string.IsNullOrWhiteSpace(file)) 15 | { 16 | file = "packages.dot"; 17 | } 18 | 19 | Debug.WriteLine($"Writing {file}."); 20 | 21 | var colors = new GraphVizColorConfiguration(); 22 | var sb = new StringBuilder(); 23 | 24 | WriteHeader(sb); 25 | foreach (var package in packages) 26 | { 27 | sb.AppendFormat(" \"{0}\"[fillcolor=\"{1}\",label=\"{2}\"];", 28 | package.GraphId(), 29 | GraphHelper.GenerateBackgroundColor(packages, package, colors), 30 | package.DisplayVersion()).AppendLine(); 31 | 32 | var dependenciesToWrite = package.Dependencies.Select(dep => 33 | String.Format(" \"{0}\" -> \"{1}\";", package.GraphId(), DependencyNodeId(dep, packages))).ToArray(); 34 | sb.AppendLine(String.Join(Environment.NewLine, dependenciesToWrite)); 35 | } 36 | WriteClose(sb); 37 | 38 | File.WriteAllText(file, sb.ToString()); 39 | } 40 | 41 | private static void WriteHeader(StringBuilder sb) 42 | { 43 | sb.AppendLine("digraph packages {"); 44 | sb.AppendLine(" node [shape=box, style=\"rounded,filled\"];"); 45 | } 46 | 47 | private static void WriteClose(StringBuilder sb) 48 | { 49 | sb.AppendLine("}"); 50 | } 51 | 52 | private static string DependencyNodeId(DependencyViewModel dep, IEnumerable packages) 53 | { 54 | string targetId = dep.GraphId(); 55 | // If version on dep is not explicitly stated, we should use an existing package with same nuget id. 56 | // This greatly minimizes the number of disconnected nodes. 57 | if (string.IsNullOrWhiteSpace(dep.Version)) 58 | { 59 | PackageViewModel existingModel = packages.FirstOrDefault(x => x.NugetId == dep.NugetId); 60 | if (existingModel != null) 61 | targetId = existingModel.GraphId(); 62 | } 63 | return targetId; 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /IColorConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace NuGetPackageVisualizer 2 | { 3 | public interface IColorConfiguration 4 | { 5 | string VersionMismatchPackageColor { get; } 6 | string PackageHasDifferentVersionsColor { get; } 7 | string DefaultColor { get; } 8 | } 9 | } -------------------------------------------------------------------------------- /IPackageWriter.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace NuGetPackageVisualizer 4 | { 5 | public interface IPackageWriter 6 | { 7 | void Write(List packages, string file); 8 | } 9 | } -------------------------------------------------------------------------------- /NuGetPackageVisualizer.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | x86 6 | 8.0.30703 7 | 2.0 8 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6} 9 | Exe 10 | Properties 11 | NuGetPackageVisualizer 12 | NuGetPackageVisualizer 13 | v4.0 14 | 15 | 16 | 512 17 | .\ 18 | true 19 | 20 | 21 | x86 22 | true 23 | full 24 | false 25 | bin\Debug\ 26 | DEBUG;TRACE 27 | prompt 28 | 4 29 | 30 | 31 | x86 32 | pdbonly 33 | true 34 | bin\Release\ 35 | TRACE 36 | prompt 37 | 4 38 | 39 | 40 | NuGetPackageVisualizer.Program 41 | 42 | 43 | 44 | packages\GoCommando.0.3\lib\net35\GoCommando.dll 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | True 72 | True 73 | Reference.datasvcmap 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | Designer 82 | 83 | 84 | 85 | 86 | 87 | 88 | datasvcmap 89 | 90 | 91 | 92 | 93 | DataServiceClientGenerator 94 | Reference.cs 95 | 96 | 97 | 98 | 99 | 106 | -------------------------------------------------------------------------------- /NuGetPackageVisualizer.nuspec: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | $version$ 5 | ThomasArdal 6 | 7 | 8 | 9 | 10 | NuGetPackageVisualizer 11 | NuGetPackageVisualizer 12 | false 13 | A small tool able to generate a DGML file visualizing your NuGet references. 14 | https://github.com/ThomasArdal/NuGetPackageVisualizer 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /NuGetPackageVisualizer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NuGetPackageVisualizer", "NuGetPackageVisualizer.csproj", "{FDDDC704-5E29-4F18-8197-06B9FB447AB6}" 5 | EndProject 6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{016CB3D3-DF85-45A2-AD7E-5FED6732DF76}" 7 | ProjectSection(SolutionItems) = preProject 8 | .nuget\NuGet.Config = .nuget\NuGet.Config 9 | .nuget\NuGet.exe = .nuget\NuGet.exe 10 | .nuget\NuGet.targets = .nuget\NuGet.targets 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|Any CPU = Debug|Any CPU 16 | Debug|Mixed Platforms = Debug|Mixed Platforms 17 | Debug|x86 = Debug|x86 18 | Release|Any CPU = Release|Any CPU 19 | Release|Mixed Platforms = Release|Mixed Platforms 20 | Release|x86 = Release|x86 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Debug|Any CPU.ActiveCfg = Debug|x86 24 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 25 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Debug|Mixed Platforms.Build.0 = Debug|x86 26 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Debug|x86.ActiveCfg = Debug|x86 27 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Debug|x86.Build.0 = Debug|x86 28 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Release|Any CPU.ActiveCfg = Release|x86 29 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Release|Mixed Platforms.ActiveCfg = Release|x86 30 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Release|Mixed Platforms.Build.0 = Release|x86 31 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Release|x86.ActiveCfg = Release|x86 32 | {FDDDC704-5E29-4F18-8197-06B9FB447AB6}.Release|x86.Build.0 = Release|x86 33 | EndGlobalSection 34 | GlobalSection(SolutionProperties) = preSolution 35 | HideSolutionNode = FALSE 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /PackageViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace NuGetPackageVisualizer 2 | { 3 | public class PackageViewModel 4 | { 5 | public string NugetId { get; set; } 6 | 7 | public string Id { get; set; } 8 | 9 | public string RemoteVersion { get; set; } 10 | 11 | public string LocalVersion { get; set; } 12 | 13 | public DependencyViewModel[] Dependencies { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using GoCommando; 2 | using GoCommando.Api; 3 | using GoCommando.Attributes; 4 | using NuGetPackageVisualizer.NuGetService; 5 | using System; 6 | using System.Collections.Concurrent; 7 | using System.Collections.Generic; 8 | using System.Data.Services.Client; 9 | using System.Diagnostics; 10 | using System.IO; 11 | using System.Linq; 12 | using System.Net; 13 | using System.Threading.Tasks; 14 | using System.Xml.Linq; 15 | 16 | namespace NuGetPackageVisualizer 17 | { 18 | public class Program : ICommando 19 | { 20 | [NamedArgument("folder", "l")] 21 | [Description("Path for a folder containing packages.config file(s).")] 22 | [Example("-folder:\"c:\\my projects\\proj\"")] 23 | public string Folder { get; set; } 24 | 25 | [NamedArgument("recursive", "r", Default = "true")] 26 | [Description("If set together with folder, a recursive search for packages.config files are made from the specified folder. Default: true.")] 27 | [Example("-recursive:false")] 28 | public bool Recursive { get; set; } 29 | 30 | [NamedArgument("file", "f")] 31 | [Description("Path to a packages.config file.")] 32 | [Example("-file:\"c:\\my projects\\proj\\packages.config\"")] 33 | public string File { get; set; } 34 | 35 | [NamedArgument("outputtype", "ot", Default = "dgml")] 36 | [Description("Sets the type of the output file. The following file types are supported: dgml, graphviz.")] 37 | [Example("-outputtype:dgml")] 38 | public string OutputType { get; set; } 39 | 40 | [NamedArgument("outputpath", "op", Default = "")] 41 | [Description("Sets the root path where output files should be written. Default: \"\" the folder where NuGet Package Visualizer was run.")] 42 | [Example("-outputpath:\"C:\\temp\"")] 43 | public string OutputPath { get; set; } 44 | 45 | [NamedArgument("output", "o", Default = "packages")] 46 | [Description("The name of the generated file for the whole source folder. Default: \"packages\".")] 47 | [Example("-output:.\\packages")] 48 | public string Output { get; set; } 49 | 50 | [NamedArgument("repositoryuri", "ru", Default = @"http://nuget.org/api/v2/")] 51 | [Description("The URI of the NuGet repository to use for reference. Default: \"http://nuget.org/api/v2/\".")] 52 | [Example("-repositoryuri:\"http://nuget.org/api/v2/\"")] 53 | public string RepositoryUrl { get; set; } 54 | 55 | [NamedArgument("wholediagram", "wd", Default = "true")] 56 | [Description("Whether to generate a diagram for the whole source. Default: true.")] 57 | [Example("-wholediagram:true")] 58 | public bool WholeDiagram { get; set; } 59 | 60 | [NamedArgument("projectdiagrams", "pd", Default = "false")] 61 | [Description("Whether to generate diagram per project in the source folder. Default: false.")] 62 | [Example("-projectdiagrams:false")] 63 | public bool ProjectDiagrams { get; set; } 64 | 65 | [NamedArgument("username", "u", Default = "")] 66 | [Description("The user name for accessing a protected package feed. Default: \"\" (empty).")] 67 | [Example("-username:jdoe")] 68 | public string UserName { get; set; } 69 | 70 | [NamedArgument("password", "pw", Default = "")] 71 | [Description("The password for accessing a protected package feed. Default: \"\" (empty).")] 72 | [Example("-password:XYZ")] 73 | public string Password { get; set; } 74 | 75 | public static void Main(string[] args) 76 | { 77 | Console.WriteLine("============================"); 78 | Console.WriteLine("= NuGet Package Visualizer ="); 79 | Console.WriteLine("============================"); 80 | Go.Run(args); 81 | } 82 | 83 | public void Run() 84 | { 85 | if (!Valid()) 86 | { 87 | Console.WriteLine("Invoke with -? for detailed help."); 88 | return; 89 | } 90 | 91 | var packageFiles = GetFiles(); 92 | var packages = new ConcurrentBag(); 93 | 94 | Parallel.ForEach( 95 | packageFiles, 96 | packageFile => 97 | { 98 | if (!Path.GetDirectoryName(packageFile).EndsWith(".nuget", StringComparison.CurrentCultureIgnoreCase)) 99 | { 100 | var projectPackages = GeneratePackages(packageFile); 101 | 102 | foreach ( 103 | var package in 104 | projectPackages.Where( 105 | package => 106 | package.LocalVersion != "" 107 | && !packages.Any( 108 | p => p.NugetId == package.NugetId && p.LocalVersion == package.LocalVersion))) 109 | { 110 | packages.Add(package); 111 | } 112 | 113 | if (ProjectDiagrams) 114 | GenerateFile( 115 | projectPackages, 116 | BuildFilePath(Path.GetFileName(Path.GetDirectoryName(packageFile)))); 117 | } 118 | }); 119 | 120 | if (WholeDiagram) GenerateFile(packages.ToList(), BuildFilePath(Output)); 121 | } 122 | 123 | private IEnumerable GetFiles() 124 | { 125 | var packageFiles = new List(); 126 | if (!string.IsNullOrWhiteSpace(File)) 127 | packageFiles.Add(File); 128 | else 129 | packageFiles.AddRange(DirSearch(Folder)); 130 | 131 | Debug.WriteLine($"Found {packageFiles.Count} package files."); 132 | return packageFiles; 133 | } 134 | 135 | private List GeneratePackages(string file) 136 | { 137 | Debug.WriteLine($"Processing {file}."); 138 | 139 | var packages = new List(); 140 | var feedContext = new FeedContext_x0060_1(new Uri(RepositoryUrl)) 141 | { 142 | IgnoreMissingProperties = true 143 | }; 144 | 145 | ApplyCredentials(feedContext); 146 | 147 | var packagesConfig = XDocument.Load(file); 148 | var dependencies = new List(); 149 | 150 | if (Path.GetFileName(file).Equals("packages.config", StringComparison.CurrentCultureIgnoreCase)) 151 | { 152 | foreach (var package in packagesConfig.Descendants("package")) 153 | { 154 | var id = package.Attribute("id").Value; 155 | var version = package.Attribute("version").Value; 156 | // ReSharper disable ReplaceWithSingleCallToFirstOrDefault 157 | var remotePackage = 158 | feedContext 159 | .Packages 160 | .OrderByDescending(x => x.Version) 161 | .Where(x => x.Id == id && x.IsLatestVersion && !x.IsPrerelease) 162 | .FirstOrDefault(); 163 | // ReSharper restore ReplaceWithSingleCallToFirstOrDefault 164 | 165 | dependencies.Add(new DependencyViewModel { NugetId = id, Version = version }); 166 | 167 | if (remotePackage == null) continue; 168 | 169 | if (packages.Any(p => p.NugetId == id && p.LocalVersion == version)) continue; 170 | 171 | packages.Add( 172 | new PackageViewModel 173 | { 174 | RemoteVersion = remotePackage.Version, 175 | LocalVersion = version, 176 | NugetId = id, 177 | Id = Guid.NewGuid().ToString(), 178 | Dependencies = remotePackage.Dependencies 179 | .Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries) 180 | .Select( 181 | x => 182 | { 183 | var strings = x.Split(new[] { ':' }); 184 | 185 | return new DependencyViewModel { NugetId = strings[0], Version = strings[1] }; 186 | }) 187 | .ToArray() 188 | }); 189 | 190 | foreach ( 191 | var pack in 192 | packages 193 | .Last() 194 | .Dependencies 195 | .Select( 196 | dependency => 197 | dependencies 198 | .FirstOrDefault( 199 | x => x.NugetId == dependency.NugetId && x.Version == dependency.Version)) 200 | .Where(pack => pack != null)) 201 | { 202 | dependencies.Remove(pack); 203 | } 204 | } 205 | } 206 | 207 | if (Path.GetExtension(file).Equals(".csproj", StringComparison.CurrentCultureIgnoreCase)) 208 | { 209 | //todo process new format CSProj file. 210 | foreach (var package in packagesConfig.Descendants("PackageReference")) 211 | { 212 | var id = package.Attribute("Include")?.Value; 213 | var version = package.Attribute("Version")?.Value; 214 | // ReSharper disable ReplaceWithSingleCallToFirstOrDefault 215 | var remotePackage = 216 | feedContext 217 | .Packages 218 | .OrderByDescending(x => x.Version) 219 | .Where(x => x.Id == id && x.IsLatestVersion && !x.IsPrerelease) 220 | .FirstOrDefault(); 221 | // ReSharper restore ReplaceWithSingleCallToFirstOrDefault 222 | 223 | dependencies.Add(new DependencyViewModel { NugetId = id, Version = version }); 224 | 225 | if (remotePackage == null) continue; 226 | 227 | if (packages.Any(p => p.NugetId == id && p.LocalVersion == version)) continue; 228 | 229 | packages.Add( 230 | new PackageViewModel 231 | { 232 | RemoteVersion = remotePackage.Version, 233 | LocalVersion = version, 234 | NugetId = id, 235 | Id = Guid.NewGuid().ToString(), 236 | Dependencies = remotePackage.Dependencies 237 | .Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries) 238 | .Select( 239 | x => 240 | { 241 | var strings = x.Split(new[] { ':' }); 242 | 243 | return new DependencyViewModel { NugetId = strings[0], Version = strings[1] }; 244 | }) 245 | .ToArray() 246 | }); 247 | 248 | foreach ( 249 | var pack in 250 | packages 251 | .Last() 252 | .Dependencies 253 | .Select( 254 | dependency => 255 | dependencies 256 | .FirstOrDefault( 257 | x => x.NugetId == dependency.NugetId && x.Version == dependency.Version)) 258 | .Where(pack => pack != null)) 259 | { 260 | dependencies.Remove(pack); 261 | } 262 | } 263 | } 264 | 265 | packages.Add( 266 | new PackageViewModel 267 | { 268 | RemoteVersion = "", 269 | LocalVersion = "", 270 | NugetId = Path.GetFileName(Path.GetDirectoryName(file)), 271 | Id = Guid.NewGuid().ToString(), 272 | Dependencies = dependencies.ToArray() 273 | }); 274 | 275 | return packages; 276 | } 277 | 278 | private void ApplyCredentials(DataServiceContext dataServiceContext) 279 | { 280 | if (!string.IsNullOrEmpty(UserName)) 281 | { 282 | if (string.IsNullOrEmpty(Password)) 283 | { 284 | promptForPassword(); 285 | } 286 | dataServiceContext.Credentials = new NetworkCredential(UserName, Password); 287 | } 288 | } 289 | 290 | private void promptForPassword() 291 | { 292 | Console.WriteLine("You have supplied a username only, please enter the password for accessing the protected feed:"); 293 | Console.ResetColor(); 294 | 295 | //from http://stackoverflow.com/a/3404522/1793 296 | var pass = string.Empty; 297 | ConsoleKeyInfo key; 298 | do 299 | { 300 | key = Console.ReadKey(true); 301 | 302 | // Backspace Should Not Work 303 | if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter) 304 | { 305 | pass += key.KeyChar; 306 | Console.Write("*"); 307 | } 308 | else 309 | { 310 | if (key.Key == ConsoleKey.Backspace && pass.Length > 0) 311 | { 312 | pass = pass.Substring(0, (pass.Length - 1)); 313 | Console.Write("\b \b"); 314 | } 315 | } 316 | } 317 | // Stops Receiving Keys Once Enter is Pressed 318 | while (key.Key != ConsoleKey.Enter); 319 | Console.WriteLine(); 320 | Console.WriteLine("Thank you."); 321 | Password = pass; 322 | } 323 | 324 | private void GenerateFile(List packages, string fileName) 325 | { 326 | switch (OutputType) 327 | { 328 | case "dgml": 329 | new DGMLWriter().Write(packages, fileName); 330 | break; 331 | 332 | case "graphviz": 333 | new GraphvizWriter().Write(packages, fileName); 334 | break; 335 | } 336 | } 337 | 338 | private bool Valid() 339 | { 340 | if (FolderAndFileNotSpecified()) 341 | { 342 | Console.WriteLine("You need to specify either folder or file."); 343 | return false; 344 | } 345 | 346 | if (FolderAndFileBothSpecified()) 347 | { 348 | Console.WriteLine("You cannot specify both folder and file."); 349 | return false; 350 | } 351 | 352 | if (WholeDiagramAndProjectDiagramsNotSpecified()) 353 | { 354 | Console.WriteLine("You must specify either wholediagram and/or projectdiagrams."); 355 | return false; 356 | } 357 | 358 | if (!string.IsNullOrWhiteSpace(File) && !System.IO.File.Exists(File)) 359 | { 360 | Console.WriteLine("Could not find file: " + File); 361 | return false; 362 | } 363 | 364 | if (!string.IsNullOrWhiteSpace(Folder) && !Directory.Exists(Folder)) 365 | { 366 | Console.WriteLine("Could not find folder: " + Folder); 367 | return false; 368 | } 369 | 370 | return true; 371 | } 372 | 373 | private bool FolderAndFileBothSpecified() 374 | { 375 | return !string.IsNullOrWhiteSpace(Folder) && !string.IsNullOrWhiteSpace(File); 376 | } 377 | 378 | private bool FolderAndFileNotSpecified() 379 | { 380 | return string.IsNullOrWhiteSpace(Folder) && string.IsNullOrWhiteSpace(File); 381 | } 382 | 383 | private bool WholeDiagramAndProjectDiagramsNotSpecified() 384 | { 385 | return !(WholeDiagram || ProjectDiagrams); 386 | } 387 | 388 | private IEnumerable DirSearch(string sDir) 389 | { 390 | var packageFiles = new List(); 391 | try 392 | { 393 | foreach (var d in Directory.GetDirectories(sDir)) 394 | { 395 | packageFiles.AddRange(Directory.GetFiles(d, "packages.config")); 396 | packageFiles.AddRange(Directory.GetFiles(d, "*.csproj")); 397 | if (Recursive) 398 | packageFiles.AddRange(DirSearch(d)); 399 | } 400 | } 401 | catch (Exception excpt) 402 | { 403 | Console.WriteLine(excpt.Message); 404 | } 405 | 406 | return packageFiles; 407 | } 408 | 409 | private string BuildFilePath(string name) 410 | { 411 | if (OutputPath != string.Empty) Directory.CreateDirectory(OutputPath); 412 | return Path.Combine(OutputPath, string.Format("{0}.{1}", name, GetFileExtension())); 413 | } 414 | 415 | private string GetFileExtension() 416 | { 417 | return OutputType == "graphviz" ? "dot" : OutputType; 418 | } 419 | } 420 | } -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("NuGetPackageVisualizer")] 9 | [assembly: AssemblyDescription("A small tool able to generate a DGML file visualizing your NuGet references.")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("DiToMi")] 12 | [assembly: AssemblyProduct("NuGetPackageVisualizer")] 13 | [assembly: AssemblyCopyright("Copyright © DiToMi 2012")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("7550f507-c360-4ae8-87e3-30e83dd1e607")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | NuGetPackageVisualizer 2 | ====================== 3 | 4 | A small tool able to generate a DGML file visualizing your NuGet references. 5 | 6 | Using different colors for each package, you will be able to monitor of you are using the most recent version of each package. Green color and you're good. Red and you are not using the recent version of that NuGet package. A yellow color indicates, that you are referencing the same package from different packages.config files, but in different versions. 7 | 8 | Example output: 9 | 10 | ![Example output](https://raw.github.com/ThomasArdal/NuGetPackageVisualizer/master/example.png) 11 | 12 | In addition a dependency diagram will be produced for each project. 13 | 14 | Example output: 15 | 16 | ![Example output](https://raw.github.com/Yewridge/NuGetPackageVisualizer/master/projectExample.PNG) 17 | 18 | [![Make a donation](http://i3.codeplex.com/Download?ProjectName=msbuildshellex&DownloadId=237259)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=KR2FXHQX44EQJ&lc=DK&item_name=Thomas%20Ardal&item_number=NuGetPackageVisualizer&no_note=0&cn=Add%20special%20instructions%20to%20the%20seller%3a&no_shipping=2¤cy_code=DKK&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted) 19 | -------------------------------------------------------------------------------- /Service References/NuGetService/Reference.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.18034 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | // Original file name: 12 | // Generation date: 18-03-2013 22:59:32 13 | namespace NuGetPackageVisualizer.NuGetService 14 | { 15 | 16 | /// 17 | /// There are no comments for FeedContext_x0060_1 in the schema. 18 | /// 19 | public partial class FeedContext_x0060_1 : global::System.Data.Services.Client.DataServiceContext 20 | { 21 | /// 22 | /// Initialize a new FeedContext_x0060_1 object. 23 | /// 24 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 25 | public FeedContext_x0060_1(global::System.Uri serviceRoot) : 26 | base(serviceRoot) 27 | { 28 | this.ResolveName = new global::System.Func(this.ResolveNameFromType); 29 | this.ResolveType = new global::System.Func(this.ResolveTypeFromName); 30 | this.OnContextCreated(); 31 | } 32 | partial void OnContextCreated(); 33 | /// 34 | /// Since the namespace configured for this service reference 35 | /// in Visual Studio is different from the one indicated in the 36 | /// server schema, use type-mappers to map between the two. 37 | /// 38 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 39 | protected global::System.Type ResolveTypeFromName(string typeName) 40 | { 41 | if (typeName.StartsWith("NuGetGallery", global::System.StringComparison.Ordinal)) 42 | { 43 | return this.GetType().Assembly.GetType(string.Concat("NuGetPackageVisualizer.NuGetService", typeName.Substring(12)), false); 44 | } 45 | return null; 46 | } 47 | /// 48 | /// Since the namespace configured for this service reference 49 | /// in Visual Studio is different from the one indicated in the 50 | /// server schema, use type-mappers to map between the two. 51 | /// 52 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 53 | protected string ResolveNameFromType(global::System.Type clientType) 54 | { 55 | if (clientType.Namespace.Equals("NuGetPackageVisualizer.NuGetService", global::System.StringComparison.Ordinal)) 56 | { 57 | return string.Concat("NuGetGallery.", clientType.Name); 58 | } 59 | return null; 60 | } 61 | /// 62 | /// There are no comments for Packages in the schema. 63 | /// 64 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 65 | public global::System.Data.Services.Client.DataServiceQuery Packages 66 | { 67 | get 68 | { 69 | if ((this._Packages == null)) 70 | { 71 | this._Packages = base.CreateQuery("Packages"); 72 | } 73 | return this._Packages; 74 | } 75 | } 76 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 77 | private global::System.Data.Services.Client.DataServiceQuery _Packages; 78 | /// 79 | /// There are no comments for Packages in the schema. 80 | /// 81 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 82 | public void AddToPackages(V2FeedPackage v2FeedPackage) 83 | { 84 | base.AddObject("Packages", v2FeedPackage); 85 | } 86 | } 87 | /// 88 | /// There are no comments for NuGetGallery.V2FeedPackage in the schema. 89 | /// 90 | /// 91 | /// Id 92 | /// Version 93 | /// 94 | [global::System.Data.Services.Common.EntitySetAttribute("Packages")] 95 | [global::System.Data.Services.Common.EntityPropertyMappingAttribute("Id", System.Data.Services.Common.SyndicationItemProperty.Title, System.Data.Services.Common.SyndicationTextContentKind.Plaintext, false)] 96 | [global::System.Data.Services.Common.EntityPropertyMappingAttribute("Authors", System.Data.Services.Common.SyndicationItemProperty.AuthorName, System.Data.Services.Common.SyndicationTextContentKind.Plaintext, false)] 97 | [global::System.Data.Services.Common.EntityPropertyMappingAttribute("LastUpdated", System.Data.Services.Common.SyndicationItemProperty.Updated, System.Data.Services.Common.SyndicationTextContentKind.Plaintext, false)] 98 | [global::System.Data.Services.Common.EntityPropertyMappingAttribute("Summary", System.Data.Services.Common.SyndicationItemProperty.Summary, System.Data.Services.Common.SyndicationTextContentKind.Plaintext, false)] 99 | [global::System.Data.Services.Common.HasStreamAttribute()] 100 | [global::System.Data.Services.Common.DataServiceKeyAttribute("Id", "Version")] 101 | public partial class V2FeedPackage : global::System.ComponentModel.INotifyPropertyChanged 102 | { 103 | /// 104 | /// Create a new V2FeedPackage object. 105 | /// 106 | /// Initial value of Id. 107 | /// Initial value of Version. 108 | /// Initial value of Created. 109 | /// Initial value of DownloadCount. 110 | /// Initial value of IsLatestVersion. 111 | /// Initial value of IsAbsoluteLatestVersion. 112 | /// Initial value of IsPrerelease. 113 | /// Initial value of LastUpdated. 114 | /// Initial value of Published. 115 | /// Initial value of PackageSize. 116 | /// Initial value of RequireLicenseAcceptance. 117 | /// Initial value of VersionDownloadCount. 118 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 119 | public static V2FeedPackage CreateV2FeedPackage(string ID, string version, global::System.DateTime created, int downloadCount, bool isLatestVersion, bool isAbsoluteLatestVersion, bool isPrerelease, global::System.DateTime lastUpdated, global::System.DateTime published, long packageSize, bool requireLicenseAcceptance, int versionDownloadCount) 120 | { 121 | V2FeedPackage v2FeedPackage = new V2FeedPackage(); 122 | v2FeedPackage.Id = ID; 123 | v2FeedPackage.Version = version; 124 | v2FeedPackage.Created = created; 125 | v2FeedPackage.DownloadCount = downloadCount; 126 | v2FeedPackage.IsLatestVersion = isLatestVersion; 127 | v2FeedPackage.IsAbsoluteLatestVersion = isAbsoluteLatestVersion; 128 | v2FeedPackage.IsPrerelease = isPrerelease; 129 | v2FeedPackage.LastUpdated = lastUpdated; 130 | v2FeedPackage.Published = published; 131 | v2FeedPackage.PackageSize = packageSize; 132 | v2FeedPackage.RequireLicenseAcceptance = requireLicenseAcceptance; 133 | v2FeedPackage.VersionDownloadCount = versionDownloadCount; 134 | return v2FeedPackage; 135 | } 136 | /// 137 | /// There are no comments for Property Id in the schema. 138 | /// 139 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 140 | public string Id 141 | { 142 | get 143 | { 144 | return this._Id; 145 | } 146 | set 147 | { 148 | this.OnIdChanging(value); 149 | this._Id = value; 150 | this.OnIdChanged(); 151 | this.OnPropertyChanged("Id"); 152 | } 153 | } 154 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 155 | private string _Id; 156 | partial void OnIdChanging(string value); 157 | partial void OnIdChanged(); 158 | /// 159 | /// There are no comments for Property Version in the schema. 160 | /// 161 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 162 | public string Version 163 | { 164 | get 165 | { 166 | return this._Version; 167 | } 168 | set 169 | { 170 | this.OnVersionChanging(value); 171 | this._Version = value; 172 | this.OnVersionChanged(); 173 | this.OnPropertyChanged("Version"); 174 | } 175 | } 176 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 177 | private string _Version; 178 | partial void OnVersionChanging(string value); 179 | partial void OnVersionChanged(); 180 | /// 181 | /// There are no comments for Property Authors in the schema. 182 | /// 183 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 184 | public string Authors 185 | { 186 | get 187 | { 188 | return this._Authors; 189 | } 190 | set 191 | { 192 | this.OnAuthorsChanging(value); 193 | this._Authors = value; 194 | this.OnAuthorsChanged(); 195 | this.OnPropertyChanged("Authors"); 196 | } 197 | } 198 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 199 | private string _Authors; 200 | partial void OnAuthorsChanging(string value); 201 | partial void OnAuthorsChanged(); 202 | /// 203 | /// There are no comments for Property Copyright in the schema. 204 | /// 205 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 206 | public string Copyright 207 | { 208 | get 209 | { 210 | return this._Copyright; 211 | } 212 | set 213 | { 214 | this.OnCopyrightChanging(value); 215 | this._Copyright = value; 216 | this.OnCopyrightChanged(); 217 | this.OnPropertyChanged("Copyright"); 218 | } 219 | } 220 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 221 | private string _Copyright; 222 | partial void OnCopyrightChanging(string value); 223 | partial void OnCopyrightChanged(); 224 | /// 225 | /// There are no comments for Property Created in the schema. 226 | /// 227 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 228 | public global::System.DateTime Created 229 | { 230 | get 231 | { 232 | return this._Created; 233 | } 234 | set 235 | { 236 | this.OnCreatedChanging(value); 237 | this._Created = value; 238 | this.OnCreatedChanged(); 239 | this.OnPropertyChanged("Created"); 240 | } 241 | } 242 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 243 | private global::System.DateTime _Created; 244 | partial void OnCreatedChanging(global::System.DateTime value); 245 | partial void OnCreatedChanged(); 246 | /// 247 | /// There are no comments for Property Dependencies in the schema. 248 | /// 249 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 250 | public string Dependencies 251 | { 252 | get 253 | { 254 | return this._Dependencies; 255 | } 256 | set 257 | { 258 | this.OnDependenciesChanging(value); 259 | this._Dependencies = value; 260 | this.OnDependenciesChanged(); 261 | this.OnPropertyChanged("Dependencies"); 262 | } 263 | } 264 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 265 | private string _Dependencies; 266 | partial void OnDependenciesChanging(string value); 267 | partial void OnDependenciesChanged(); 268 | /// 269 | /// There are no comments for Property Description in the schema. 270 | /// 271 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 272 | public string Description 273 | { 274 | get 275 | { 276 | return this._Description; 277 | } 278 | set 279 | { 280 | this.OnDescriptionChanging(value); 281 | this._Description = value; 282 | this.OnDescriptionChanged(); 283 | this.OnPropertyChanged("Description"); 284 | } 285 | } 286 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 287 | private string _Description; 288 | partial void OnDescriptionChanging(string value); 289 | partial void OnDescriptionChanged(); 290 | /// 291 | /// There are no comments for Property DownloadCount in the schema. 292 | /// 293 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 294 | public int DownloadCount 295 | { 296 | get 297 | { 298 | return this._DownloadCount; 299 | } 300 | set 301 | { 302 | this.OnDownloadCountChanging(value); 303 | this._DownloadCount = value; 304 | this.OnDownloadCountChanged(); 305 | this.OnPropertyChanged("DownloadCount"); 306 | } 307 | } 308 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 309 | private int _DownloadCount; 310 | partial void OnDownloadCountChanging(int value); 311 | partial void OnDownloadCountChanged(); 312 | /// 313 | /// There are no comments for Property GalleryDetailsUrl in the schema. 314 | /// 315 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 316 | public string GalleryDetailsUrl 317 | { 318 | get 319 | { 320 | return this._GalleryDetailsUrl; 321 | } 322 | set 323 | { 324 | this.OnGalleryDetailsUrlChanging(value); 325 | this._GalleryDetailsUrl = value; 326 | this.OnGalleryDetailsUrlChanged(); 327 | this.OnPropertyChanged("GalleryDetailsUrl"); 328 | } 329 | } 330 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 331 | private string _GalleryDetailsUrl; 332 | partial void OnGalleryDetailsUrlChanging(string value); 333 | partial void OnGalleryDetailsUrlChanged(); 334 | /// 335 | /// There are no comments for Property IconUrl in the schema. 336 | /// 337 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 338 | public string IconUrl 339 | { 340 | get 341 | { 342 | return this._IconUrl; 343 | } 344 | set 345 | { 346 | this.OnIconUrlChanging(value); 347 | this._IconUrl = value; 348 | this.OnIconUrlChanged(); 349 | this.OnPropertyChanged("IconUrl"); 350 | } 351 | } 352 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 353 | private string _IconUrl; 354 | partial void OnIconUrlChanging(string value); 355 | partial void OnIconUrlChanged(); 356 | /// 357 | /// There are no comments for Property IsLatestVersion in the schema. 358 | /// 359 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 360 | public bool IsLatestVersion 361 | { 362 | get 363 | { 364 | return this._IsLatestVersion; 365 | } 366 | set 367 | { 368 | this.OnIsLatestVersionChanging(value); 369 | this._IsLatestVersion = value; 370 | this.OnIsLatestVersionChanged(); 371 | this.OnPropertyChanged("IsLatestVersion"); 372 | } 373 | } 374 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 375 | private bool _IsLatestVersion; 376 | partial void OnIsLatestVersionChanging(bool value); 377 | partial void OnIsLatestVersionChanged(); 378 | /// 379 | /// There are no comments for Property IsAbsoluteLatestVersion in the schema. 380 | /// 381 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 382 | public bool IsAbsoluteLatestVersion 383 | { 384 | get 385 | { 386 | return this._IsAbsoluteLatestVersion; 387 | } 388 | set 389 | { 390 | this.OnIsAbsoluteLatestVersionChanging(value); 391 | this._IsAbsoluteLatestVersion = value; 392 | this.OnIsAbsoluteLatestVersionChanged(); 393 | this.OnPropertyChanged("IsAbsoluteLatestVersion"); 394 | } 395 | } 396 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 397 | private bool _IsAbsoluteLatestVersion; 398 | partial void OnIsAbsoluteLatestVersionChanging(bool value); 399 | partial void OnIsAbsoluteLatestVersionChanged(); 400 | /// 401 | /// There are no comments for Property IsPrerelease in the schema. 402 | /// 403 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 404 | public bool IsPrerelease 405 | { 406 | get 407 | { 408 | return this._IsPrerelease; 409 | } 410 | set 411 | { 412 | this.OnIsPrereleaseChanging(value); 413 | this._IsPrerelease = value; 414 | this.OnIsPrereleaseChanged(); 415 | this.OnPropertyChanged("IsPrerelease"); 416 | } 417 | } 418 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 419 | private bool _IsPrerelease; 420 | partial void OnIsPrereleaseChanging(bool value); 421 | partial void OnIsPrereleaseChanged(); 422 | /// 423 | /// There are no comments for Property Language in the schema. 424 | /// 425 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 426 | public string Language 427 | { 428 | get 429 | { 430 | return this._Language; 431 | } 432 | set 433 | { 434 | this.OnLanguageChanging(value); 435 | this._Language = value; 436 | this.OnLanguageChanged(); 437 | this.OnPropertyChanged("Language"); 438 | } 439 | } 440 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 441 | private string _Language; 442 | partial void OnLanguageChanging(string value); 443 | partial void OnLanguageChanged(); 444 | /// 445 | /// There are no comments for Property LastUpdated in the schema. 446 | /// 447 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 448 | public global::System.DateTime LastUpdated 449 | { 450 | get 451 | { 452 | return this._LastUpdated; 453 | } 454 | set 455 | { 456 | this.OnLastUpdatedChanging(value); 457 | this._LastUpdated = value; 458 | this.OnLastUpdatedChanged(); 459 | this.OnPropertyChanged("LastUpdated"); 460 | } 461 | } 462 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 463 | private global::System.DateTime _LastUpdated; 464 | partial void OnLastUpdatedChanging(global::System.DateTime value); 465 | partial void OnLastUpdatedChanged(); 466 | /// 467 | /// There are no comments for Property Published in the schema. 468 | /// 469 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 470 | public global::System.DateTime Published 471 | { 472 | get 473 | { 474 | return this._Published; 475 | } 476 | set 477 | { 478 | this.OnPublishedChanging(value); 479 | this._Published = value; 480 | this.OnPublishedChanged(); 481 | this.OnPropertyChanged("Published"); 482 | } 483 | } 484 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 485 | private global::System.DateTime _Published; 486 | partial void OnPublishedChanging(global::System.DateTime value); 487 | partial void OnPublishedChanged(); 488 | /// 489 | /// There are no comments for Property LicenseUrl in the schema. 490 | /// 491 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 492 | public string LicenseUrl 493 | { 494 | get 495 | { 496 | return this._LicenseUrl; 497 | } 498 | set 499 | { 500 | this.OnLicenseUrlChanging(value); 501 | this._LicenseUrl = value; 502 | this.OnLicenseUrlChanged(); 503 | this.OnPropertyChanged("LicenseUrl"); 504 | } 505 | } 506 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 507 | private string _LicenseUrl; 508 | partial void OnLicenseUrlChanging(string value); 509 | partial void OnLicenseUrlChanged(); 510 | /// 511 | /// There are no comments for Property PackageHash in the schema. 512 | /// 513 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 514 | public string PackageHash 515 | { 516 | get 517 | { 518 | return this._PackageHash; 519 | } 520 | set 521 | { 522 | this.OnPackageHashChanging(value); 523 | this._PackageHash = value; 524 | this.OnPackageHashChanged(); 525 | this.OnPropertyChanged("PackageHash"); 526 | } 527 | } 528 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 529 | private string _PackageHash; 530 | partial void OnPackageHashChanging(string value); 531 | partial void OnPackageHashChanged(); 532 | /// 533 | /// There are no comments for Property PackageHashAlgorithm in the schema. 534 | /// 535 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 536 | public string PackageHashAlgorithm 537 | { 538 | get 539 | { 540 | return this._PackageHashAlgorithm; 541 | } 542 | set 543 | { 544 | this.OnPackageHashAlgorithmChanging(value); 545 | this._PackageHashAlgorithm = value; 546 | this.OnPackageHashAlgorithmChanged(); 547 | this.OnPropertyChanged("PackageHashAlgorithm"); 548 | } 549 | } 550 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 551 | private string _PackageHashAlgorithm; 552 | partial void OnPackageHashAlgorithmChanging(string value); 553 | partial void OnPackageHashAlgorithmChanged(); 554 | /// 555 | /// There are no comments for Property PackageSize in the schema. 556 | /// 557 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 558 | public long PackageSize 559 | { 560 | get 561 | { 562 | return this._PackageSize; 563 | } 564 | set 565 | { 566 | this.OnPackageSizeChanging(value); 567 | this._PackageSize = value; 568 | this.OnPackageSizeChanged(); 569 | this.OnPropertyChanged("PackageSize"); 570 | } 571 | } 572 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 573 | private long _PackageSize; 574 | partial void OnPackageSizeChanging(long value); 575 | partial void OnPackageSizeChanged(); 576 | /// 577 | /// There are no comments for Property ProjectUrl in the schema. 578 | /// 579 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 580 | public string ProjectUrl 581 | { 582 | get 583 | { 584 | return this._ProjectUrl; 585 | } 586 | set 587 | { 588 | this.OnProjectUrlChanging(value); 589 | this._ProjectUrl = value; 590 | this.OnProjectUrlChanged(); 591 | this.OnPropertyChanged("ProjectUrl"); 592 | } 593 | } 594 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 595 | private string _ProjectUrl; 596 | partial void OnProjectUrlChanging(string value); 597 | partial void OnProjectUrlChanged(); 598 | /// 599 | /// There are no comments for Property ReportAbuseUrl in the schema. 600 | /// 601 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 602 | public string ReportAbuseUrl 603 | { 604 | get 605 | { 606 | return this._ReportAbuseUrl; 607 | } 608 | set 609 | { 610 | this.OnReportAbuseUrlChanging(value); 611 | this._ReportAbuseUrl = value; 612 | this.OnReportAbuseUrlChanged(); 613 | this.OnPropertyChanged("ReportAbuseUrl"); 614 | } 615 | } 616 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 617 | private string _ReportAbuseUrl; 618 | partial void OnReportAbuseUrlChanging(string value); 619 | partial void OnReportAbuseUrlChanged(); 620 | /// 621 | /// There are no comments for Property ReleaseNotes in the schema. 622 | /// 623 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 624 | public string ReleaseNotes 625 | { 626 | get 627 | { 628 | return this._ReleaseNotes; 629 | } 630 | set 631 | { 632 | this.OnReleaseNotesChanging(value); 633 | this._ReleaseNotes = value; 634 | this.OnReleaseNotesChanged(); 635 | this.OnPropertyChanged("ReleaseNotes"); 636 | } 637 | } 638 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 639 | private string _ReleaseNotes; 640 | partial void OnReleaseNotesChanging(string value); 641 | partial void OnReleaseNotesChanged(); 642 | /// 643 | /// There are no comments for Property RequireLicenseAcceptance in the schema. 644 | /// 645 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 646 | public bool RequireLicenseAcceptance 647 | { 648 | get 649 | { 650 | return this._RequireLicenseAcceptance; 651 | } 652 | set 653 | { 654 | this.OnRequireLicenseAcceptanceChanging(value); 655 | this._RequireLicenseAcceptance = value; 656 | this.OnRequireLicenseAcceptanceChanged(); 657 | this.OnPropertyChanged("RequireLicenseAcceptance"); 658 | } 659 | } 660 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 661 | private bool _RequireLicenseAcceptance; 662 | partial void OnRequireLicenseAcceptanceChanging(bool value); 663 | partial void OnRequireLicenseAcceptanceChanged(); 664 | /// 665 | /// There are no comments for Property Summary in the schema. 666 | /// 667 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 668 | public string Summary 669 | { 670 | get 671 | { 672 | return this._Summary; 673 | } 674 | set 675 | { 676 | this.OnSummaryChanging(value); 677 | this._Summary = value; 678 | this.OnSummaryChanged(); 679 | this.OnPropertyChanged("Summary"); 680 | } 681 | } 682 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 683 | private string _Summary; 684 | partial void OnSummaryChanging(string value); 685 | partial void OnSummaryChanged(); 686 | /// 687 | /// There are no comments for Property Tags in the schema. 688 | /// 689 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 690 | public string Tags 691 | { 692 | get 693 | { 694 | return this._Tags; 695 | } 696 | set 697 | { 698 | this.OnTagsChanging(value); 699 | this._Tags = value; 700 | this.OnTagsChanged(); 701 | this.OnPropertyChanged("Tags"); 702 | } 703 | } 704 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 705 | private string _Tags; 706 | partial void OnTagsChanging(string value); 707 | partial void OnTagsChanged(); 708 | /// 709 | /// There are no comments for Property Title in the schema. 710 | /// 711 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 712 | public string Title 713 | { 714 | get 715 | { 716 | return this._Title; 717 | } 718 | set 719 | { 720 | this.OnTitleChanging(value); 721 | this._Title = value; 722 | this.OnTitleChanged(); 723 | this.OnPropertyChanged("Title"); 724 | } 725 | } 726 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 727 | private string _Title; 728 | partial void OnTitleChanging(string value); 729 | partial void OnTitleChanged(); 730 | /// 731 | /// There are no comments for Property VersionDownloadCount in the schema. 732 | /// 733 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 734 | public int VersionDownloadCount 735 | { 736 | get 737 | { 738 | return this._VersionDownloadCount; 739 | } 740 | set 741 | { 742 | this.OnVersionDownloadCountChanging(value); 743 | this._VersionDownloadCount = value; 744 | this.OnVersionDownloadCountChanged(); 745 | this.OnPropertyChanged("VersionDownloadCount"); 746 | } 747 | } 748 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 749 | private int _VersionDownloadCount; 750 | partial void OnVersionDownloadCountChanging(int value); 751 | partial void OnVersionDownloadCountChanged(); 752 | /// 753 | /// There are no comments for Property MinClientVersion in the schema. 754 | /// 755 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 756 | public string MinClientVersion 757 | { 758 | get 759 | { 760 | return this._MinClientVersion; 761 | } 762 | set 763 | { 764 | this.OnMinClientVersionChanging(value); 765 | this._MinClientVersion = value; 766 | this.OnMinClientVersionChanged(); 767 | this.OnPropertyChanged("MinClientVersion"); 768 | } 769 | } 770 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 771 | private string _MinClientVersion; 772 | partial void OnMinClientVersionChanging(string value); 773 | partial void OnMinClientVersionChanged(); 774 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 775 | public event global::System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 776 | [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 777 | protected virtual void OnPropertyChanged(string property) 778 | { 779 | if ((this.PropertyChanged != null)) 780 | { 781 | this.PropertyChanged(this, new global::System.ComponentModel.PropertyChangedEventArgs(property)); 782 | } 783 | } 784 | } 785 | } 786 | -------------------------------------------------------------------------------- /Service References/NuGetService/Reference.datasvcmap: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Service References/NuGetService/service.edmx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasArdal/NuGetPackageVisualizer/f34be4797988137dba52cf96d6b04b06b85c2b9a/example.png -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 10 | 11 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. 12 | 13 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 14 | 15 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. 16 | 17 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 18 | 19 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. 20 | 21 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). 22 | 23 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. 24 | 25 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." 26 | 27 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 28 | 29 | 2. Grant of Copyright License. 30 | 31 | Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 32 | 33 | 3. Grant of Patent License. 34 | 35 | Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 36 | 37 | 4. Redistribution. 38 | 39 | You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 40 | 41 | 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and 42 | 43 | 2. You must cause any modified files to carry prominent notices stating that You changed the files; and 44 | 45 | 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 46 | 47 | 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. 48 | 49 | You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 50 | 51 | 5. Submission of Contributions. 52 | 53 | Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 54 | 55 | 6. Trademarks. 56 | 57 | This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 58 | 59 | 7. Disclaimer of Warranty. 60 | 61 | Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 62 | 63 | 8. Limitation of Liability. 64 | 65 | In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 66 | 67 | 9. Accepting Warranty or Additional Liability. 68 | 69 | While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. -------------------------------------------------------------------------------- /packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /projectExample.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThomasArdal/NuGetPackageVisualizer/f34be4797988137dba52cf96d6b04b06b85c2b9a/projectExample.PNG --------------------------------------------------------------------------------