From f69eed98ebf70f9ea2cb087864c2646858329480 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 10 Nov 2016 20:05:19 -0800 Subject: [PATCH] Adds initial code for addingn and removing a package reference --- src/dotnet/commands/dotnet-ref/Program.cs | 120 ++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src/dotnet/commands/dotnet-ref/Program.cs diff --git a/src/dotnet/commands/dotnet-ref/Program.cs b/src/dotnet/commands/dotnet-ref/Program.cs new file mode 100644 index 000000000..edae50c38 --- /dev/null +++ b/src/dotnet/commands/dotnet-ref/Program.cs @@ -0,0 +1,120 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using Microsoft.DotNet.Cli.CommandLine; +using Microsoft.DotNet.Cli.Utils; +using System; +using System.IO; +using System.Linq; +using Microsoft.Build.Construction; +using Microsoft.DotNet.ProjectJsonMigration; + +namespace Microsoft.DotNet.Tools.Ref +{ + public class RefCommand + { + public static int Run(string[] args) + { + DebugHelper.HandleDebugSwitch(ref args); + + DirectoryInfo currDir = new DirectoryInfo(Directory.GetCurrentDirectory()); + FileInfo projectFile = currDir.GetFiles("*.csproj").FirstOrDefault(); + + if (!projectFile.Exists) + { + throw new Exception("Unable to find any projects in the current folder"); + } + + CommandLineApplication app = new CommandLineApplication(throwOnUnexpectedArg: false) + { + Name = "dotnet ref", + FullName = ".NET Ref Command", + Description = "Command to modify project and package references", + AllowArgumentSeparator = true, + ArgumentSeparatorHelpText = HelpMessageStrings.MSBuildAdditionalArgsHelpText + }; + app.HelpOption("-h|--help"); + + app.Command("add", c => + { + c.Description = "Add package and project references"; + c.HelpOption("-h|--help"); + + CommandArgument packageNameArg = c.Argument("", "The package name to install"); + CommandOption packageVersionOption = c.Option("-v|--version ", "The package version to install, defaults to * if omited", CommandOptionType.SingleValue); + + c.OnExecute(() => + { + + string version = "*"; + if (packageVersionOption.HasValue()) + { + version = packageVersionOption.Value(); + } + + var rootElement = ProjectRootElement.Open(projectFile.FullName); + AddOrUpdatePackageRef(packageNameArg.Value, version, rootElement); + rootElement.Save(); + + // List msbuildArgs = new List(); + // msbuildArgs.Add("/t:RefAdd"); + // msbuildArgs.Add($"/p:PackageName={packageNameArg.Value}"); + // msbuildArgs.Add($"/p:PackageVersion={version}"); + // msbuildArgs.AddRange(app.RemainingArguments); + // return new MSBuildForwardingApp(msbuildArgs).Execute(); + return 1; + }); + + }); + + app.Command("del", c => + { + c.Description = "Remove package and project references"; + c.HelpOption("-h|--help"); + + CommandArgument packageNameArg = c.Argument("", "The package name to remove"); + + c.OnExecute(() => + { + var rootElement = ProjectRootElement.Open(projectFile.FullName); + RemovePackageRef(packageNameArg.Value, rootElement); + rootElement.Save(); + + // List msbuildArgs = new List(); + // msbuildArgs.Add("/t:RefDel"); + // msbuildArgs.Add($"/p:PackageName={packageNameArg.Value}"); + // msbuildArgs.AddRange(app.RemainingArguments); + // return new MSBuildForwardingApp(msbuildArgs).Execute(); + return 1; + }); + + }); + + return app.Execute(args); + } + + private static void RemovePackageRef(string packageName, ProjectRootElement proj) + { + //find existing ones + var packageRefs = proj.Items.Where(i => i.ItemType == "PackageReference") + .Where(x => x.Include == packageName) + .ToList(); + //remove any existing ones + foreach (var packageRef in packageRefs) + { + var parent = packageRef.Parent; + packageRef.Parent.RemoveChild(packageRef); + parent.RemoveIfEmpty(); + } + } + + private static void AddOrUpdatePackageRef(string packageName, string packageVersion, ProjectRootElement proj) + { + RemovePackageRef(packageName, proj); + + //add this one + proj.AddItem("PackageReference", packageName, new Dictionary{{"Version", packageVersion}}); + } + } +}