From abd496a6f146020a041d22fba230fdd04d01fd52 Mon Sep 17 00:00:00 2001 From: Ankit Mishra Date: Tue, 20 Dec 2016 14:23:11 -0800 Subject: [PATCH 1/5] Adding base add package sub command --- src/dotnet/commands/dotnet-add/Program.cs | 4 +- .../dotnet-add-package/LocalizableStrings.cs | 22 +++ .../dotnet-add/dotnet-add-package/Program.cs | 130 ++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs create mode 100644 src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs diff --git a/src/dotnet/commands/dotnet-add/Program.cs b/src/dotnet/commands/dotnet-add/Program.cs index 7ddd12e45..e6a5fc452 100644 --- a/src/dotnet/commands/dotnet-add/Program.cs +++ b/src/dotnet/commands/dotnet-add/Program.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Tools.Add.PackageReference; using Microsoft.DotNet.Tools.Add.ProjectToProjectReference; using Microsoft.DotNet.Tools.Add.ProjectToSolution; @@ -18,6 +19,7 @@ namespace Microsoft.DotNet.Tools.Add { AddProjectToSolutionCommand.Create, AddProjectToProjectReferenceCommand.Create, + AddPackageReferenceCommand.Create }; public static int Run(string[] args) @@ -26,4 +28,4 @@ namespace Microsoft.DotNet.Tools.Add return command.RunCommand(args); } } -} +} \ No newline at end of file diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs new file mode 100644 index 000000000..570cd0e52 --- /dev/null +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs @@ -0,0 +1,22 @@ +// 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. + +namespace Microsoft.DotNet.Tools.Add.PackageReference +{ + internal class LocalizableStrings + { + public const string AppFullName = ".NET Add Package reference Command"; + + public const string AppDescription = "Command to add package reference"; + + public const string AppHelpText = "Package references to add"; + + public const string CmdFrameworkDescription = "Add reference only when targetting a specific framework"; + + public const string CmdNoRestoreDescription = "Add reference without performing restore preview and compatibility check."; + + public const string CmdSourceDescription = "Use specific NuGet package sources to use during the restore."; + + public const string CmdPackageDirectoryDescription = "Restore the packages to this Directory ."; + } +} \ No newline at end of file diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs new file mode 100644 index 000000000..34976633d --- /dev/null +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs @@ -0,0 +1,130 @@ +// 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; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.Build.Evaluation; +using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Cli.CommandLine; +using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.Tools.Common; +using Microsoft.DotNet.Tools.MSBuild; +using NuGet.Frameworks; + +namespace Microsoft.DotNet.Tools.Add.PackageReference +{ + internal class AddPackageReferenceCommand : DotNetSubCommandBase + { + private CommandOption _frameworkOption; + private CommandOption _noRestore; + private CommandOption _source; + private CommandOption _packageDirectory; + + public static DotNetSubCommandBase Create() + { + var command = new AddPackageReferenceCommand() + { + Name = "package", + FullName = LocalizableStrings.AppFullName, + Description = LocalizableStrings.AppDescription, + HandleRemainingArguments = true, + ArgumentSeparatorHelpText = LocalizableStrings.AppHelpText, + }; + + command.HelpOption("-h|--help"); + + command._frameworkOption = command.Option( + $"-f|--framework", + LocalizableStrings.CmdFrameworkDescription, + CommandOptionType.SingleValue); + + command._noRestore = command.Option( + $"-n|--no-restore ", + LocalizableStrings.CmdNoRestoreDescription, + CommandOptionType.NoValue); + + command._source = command.Option( + $"-s|--source ", + LocalizableStrings.CmdSourceDescription, + CommandOptionType.SingleValue); + + command._packageDirectory = command.Option( + $"--package-directory", + LocalizableStrings.CmdPackageDirectoryDescription, + CommandOptionType.SingleValue); + + return command; + } + + public override int Run(string fileOrDirectory) + { + WaitForDebugger(); + var projects = new ProjectCollection(); + var msbuildProj = MsbuildProject.FromFileOrDirectory(projects, fileOrDirectory); + + if (RemainingArguments.Count == 0) + { + throw new GracefulException(CommonLocalizableStrings.SpecifyAtLeastOneReferenceToAdd); + } + + var tempDgFilePath = CreateTemporaryFile(".dg"); + + GetProjectDependencyGraph(msbuildProj.ProjectDirectory, tempDgFilePath); + + DisposeTemporaryFile(tempDgFilePath); + + return 0; + } + + private void GetProjectDependencyGraph(string projectFilePath, + string dgFilePath) + { + var args = new List(); + + // Pass the task as generate restore dg file + args.Add("/t:GenerateRestoreGraphFile"); + + // Pass dg file output path + args.Add(string.Format("/p:RestoreGraphOutputPath={0}{1}{2}", '"', dgFilePath, '"')); + + var result = new MSBuildForwardingApp(args).Execute(); + + if (result != 0) + { + throw new GracefulException("Could not generate dg file"); + } + } + + private string CreateTemporaryFile(string extension) + { + var tempDirectory = Path.GetTempPath(); + var tempFile = Path.Combine(tempDirectory, Guid.NewGuid().ToString() + extension); + File.Create(tempFile).Dispose(); + return tempFile; + } + + private void DisposeTemporaryFile(string filePath) + { + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + } + + public void WaitForDebugger() + { + Console.WriteLine("Waiting for debugger to attach."); + Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}"); + + while (!Debugger.IsAttached) + { + System.Threading.Thread.Sleep(100); + } + Debugger.Break(); + } + } +} \ No newline at end of file From 3a5b89c24248fae4188fc1eebfdb9e923c72a066 Mon Sep 17 00:00:00 2001 From: Ankit Mishra Date: Tue, 20 Dec 2016 16:25:18 -0800 Subject: [PATCH 2/5] Add package sub command --- .../dotnet-add-package/LocalizableStrings.cs | 4 + .../dotnet-add/dotnet-add-package/Program.cs | 74 ++++++++++++++----- 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs index 570cd0e52..2e5ddb6df 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs @@ -18,5 +18,9 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public const string CmdSourceDescription = "Use specific NuGet package sources to use during the restore."; public const string CmdPackageDirectoryDescription = "Restore the packages to this Directory ."; + + public const string CmdVersionDescription = "Version for the package to be added."; + + public const string CmdDGFileException = "Unable to Create Dependency graph file for project '{0}'. Cannot add package reference."; } } \ No newline at end of file diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs index 34976633d..aa86d8c0a 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs @@ -13,16 +13,18 @@ using Microsoft.DotNet.Cli.CommandLine; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Tools.Common; using Microsoft.DotNet.Tools.MSBuild; +using Microsoft.DotNet.Tools.NuGet; using NuGet.Frameworks; namespace Microsoft.DotNet.Tools.Add.PackageReference { internal class AddPackageReferenceCommand : DotNetSubCommandBase { + private CommandOption _versionOption; private CommandOption _frameworkOption; - private CommandOption _noRestore; - private CommandOption _source; - private CommandOption _packageDirectory; + private CommandOption _noRestoreOption; + private CommandOption _sourceOption; + private CommandOption _packageDirectoryOption; public static DotNetSubCommandBase Create() { @@ -37,22 +39,27 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference command.HelpOption("-h|--help"); + command._versionOption = command.Option( + $"-v|--version", + LocalizableStrings.CmdVersionDescription, + CommandOptionType.SingleValue); + command._frameworkOption = command.Option( $"-f|--framework", LocalizableStrings.CmdFrameworkDescription, CommandOptionType.SingleValue); - command._noRestore = command.Option( + command._noRestoreOption = command.Option( $"-n|--no-restore ", LocalizableStrings.CmdNoRestoreDescription, CommandOptionType.NoValue); - command._source = command.Option( + command._sourceOption = command.Option( $"-s|--source ", LocalizableStrings.CmdSourceDescription, CommandOptionType.SingleValue); - command._packageDirectory = command.Option( + command._packageDirectoryOption = command.Option( $"--package-directory", LocalizableStrings.CmdPackageDirectoryDescription, CommandOptionType.SingleValue); @@ -62,10 +69,10 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public override int Run(string fileOrDirectory) { - WaitForDebugger(); var projects = new ProjectCollection(); var msbuildProj = MsbuildProject.FromFileOrDirectory(projects, fileOrDirectory); + var x = this.Arguments; if (RemainingArguments.Count == 0) { throw new GracefulException(CommonLocalizableStrings.SpecifyAtLeastOneReferenceToAdd); @@ -73,10 +80,10 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference var tempDgFilePath = CreateTemporaryFile(".dg"); - GetProjectDependencyGraph(msbuildProj.ProjectDirectory, tempDgFilePath); - + GetProjectDependencyGraph(msbuildProj.ProjectRootElement.FullPath, tempDgFilePath); + + var result = NuGetCommand.Run(TransformArgs(tempDgFilePath, msbuildProj.ProjectRootElement.FullPath)); DisposeTemporaryFile(tempDgFilePath); - return 0; } @@ -85,6 +92,9 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference { var args = new List(); + // Pass the project file path + args.Add(projectFilePath); + // Pass the task as generate restore dg file args.Add("/t:GenerateRestoreGraphFile"); @@ -95,7 +105,7 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference if (result != 0) { - throw new GracefulException("Could not generate dg file"); + throw new GracefulException(string.Format(LocalizableStrings.CmdDGFileException, projectFilePath)); } } @@ -115,16 +125,44 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference } } - public void WaitForDebugger() + private string[] TransformArgs(string tempDgFilePath, string projectFilePath) { - Console.WriteLine("Waiting for debugger to attach."); - Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}"); - - while (!Debugger.IsAttached) + var args = new List(){ + "package", + "add", + "--package", + "Newtonsoft.Json", + "--project", + projectFilePath, + "--dg-file", + tempDgFilePath + }; + if(_versionOption.HasValue()) { - System.Threading.Thread.Sleep(100); + args.Append("--version"); + args.Append(_versionOption.Value()); } - Debugger.Break(); + if(_sourceOption.HasValue()) + { + args.Append("--source"); + args.Append(_sourceOption.Value()); + } + if(_frameworkOption.HasValue()) + { + args.Append("--framework"); + args.Append(_frameworkOption.Value()); + } + if(_noRestoreOption.HasValue()) + { + args.Append("--no-restore"); + } + if(_packageDirectoryOption.HasValue()) + { + args.Append("--package-directory"); + args.Append(_packageDirectoryOption.Value()); + } + + return args.ToArray(); } } } \ No newline at end of file From 0f6e4e3f10a88904e6a541f10168c31b7d48e736 Mon Sep 17 00:00:00 2001 From: Ankit Mishra Date: Tue, 20 Dec 2016 19:48:52 -0800 Subject: [PATCH 3/5] FIxing argument adding --- .../dotnet-add/dotnet-add-package/Program.cs | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs index aa86d8c0a..a0ababecc 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs @@ -40,27 +40,27 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference command.HelpOption("-h|--help"); command._versionOption = command.Option( - $"-v|--version", + "-v|--version", LocalizableStrings.CmdVersionDescription, CommandOptionType.SingleValue); command._frameworkOption = command.Option( - $"-f|--framework", + $"-f|--framework <{CommonLocalizableStrings.CmdFramework}>", LocalizableStrings.CmdFrameworkDescription, CommandOptionType.SingleValue); command._noRestoreOption = command.Option( - $"-n|--no-restore ", + "-n|--no-restore ", LocalizableStrings.CmdNoRestoreDescription, CommandOptionType.NoValue); command._sourceOption = command.Option( - $"-s|--source ", + "-s|--source ", LocalizableStrings.CmdSourceDescription, CommandOptionType.SingleValue); command._packageDirectoryOption = command.Option( - $"--package-directory", + "--package-directory", LocalizableStrings.CmdPackageDirectoryDescription, CommandOptionType.SingleValue); @@ -69,22 +69,33 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public override int Run(string fileOrDirectory) { + Console.WriteLine("Waiting for debugger to attach."); + Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}"); + + while (!Debugger.IsAttached) + { + System.Threading.Thread.Sleep(100); + } + Debugger.Break(); var projects = new ProjectCollection(); var msbuildProj = MsbuildProject.FromFileOrDirectory(projects, fileOrDirectory); - var x = this.Arguments; if (RemainingArguments.Count == 0) { throw new GracefulException(CommonLocalizableStrings.SpecifyAtLeastOneReferenceToAdd); } - var tempDgFilePath = CreateTemporaryFile(".dg"); + var tempDgFilePath = string.Empty; + if(!_noRestoreOption.HasValue()) + { + // Create a Dependency Graph file for the project + tempDgFilePath = CreateTemporaryFile(".dg"); + GetProjectDependencyGraph(msbuildProj.ProjectRootElement.FullPath, tempDgFilePath); + } - GetProjectDependencyGraph(msbuildProj.ProjectRootElement.FullPath, tempDgFilePath); - var result = NuGetCommand.Run(TransformArgs(tempDgFilePath, msbuildProj.ProjectRootElement.FullPath)); DisposeTemporaryFile(tempDgFilePath); - return 0; + return result; } private void GetProjectDependencyGraph(string projectFilePath, @@ -95,10 +106,10 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference // Pass the project file path args.Add(projectFilePath); - // Pass the task as generate restore dg file + // Pass the task as generate restore Dependency Graph file args.Add("/t:GenerateRestoreGraphFile"); - // Pass dg file output path + // Pass Dependency Graph file output path args.Add(string.Format("/p:RestoreGraphOutputPath={0}{1}{2}", '"', dgFilePath, '"')); var result = new MSBuildForwardingApp(args).Execute(); @@ -133,33 +144,36 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference "--package", "Newtonsoft.Json", "--project", - projectFilePath, - "--dg-file", - tempDgFilePath + projectFilePath }; if(_versionOption.HasValue()) { - args.Append("--version"); - args.Append(_versionOption.Value()); + args.Add("--version"); + args.Add(_versionOption.Value()); } if(_sourceOption.HasValue()) { - args.Append("--source"); - args.Append(_sourceOption.Value()); + args.Add("--source"); + args.Add(_sourceOption.Value()); } if(_frameworkOption.HasValue()) { - args.Append("--framework"); - args.Append(_frameworkOption.Value()); - } - if(_noRestoreOption.HasValue()) - { - args.Append("--no-restore"); + args.Add("--framework"); + args.Add(_frameworkOption.Value()); } if(_packageDirectoryOption.HasValue()) { - args.Append("--package-directory"); - args.Append(_packageDirectoryOption.Value()); + args.Add("--package-directory"); + args.Add(_packageDirectoryOption.Value()); + } + if(_noRestoreOption.HasValue()) + { + args.Add("--no-restore"); + } + else + { + args.Add("--dg-file"); + args.Add(tempDgFilePath); } return args.ToArray(); From 303a267a01b5c2a877d6e95df2a7a45d0d7d9d79 Mon Sep 17 00:00:00 2001 From: Ankit Mishra Date: Wed, 21 Dec 2016 11:44:45 -0800 Subject: [PATCH 4/5] Clean up before PR --- .../dotnet-add-package/LocalizableStrings.cs | 9 +++++++++ .../dotnet-add/dotnet-add-package/Program.cs | 16 ++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs index 2e5ddb6df..25986ace6 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs @@ -22,5 +22,14 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public const string CmdVersionDescription = "Version for the package to be added."; public const string CmdDGFileException = "Unable to Create Dependency graph file for project '{0}'. Cannot add package reference."; + + public const string CmdVersion = "VERSION"; + + public const string CmdFramework = "FRAMEWORK"; + + public const string CmdSource = "SOURCE"; + + public const string CmdPackageDirectory = "PACKAGE_DIRECTORY"; + } } \ No newline at end of file diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs index a0ababecc..7f344e4c9 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs @@ -40,12 +40,12 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference command.HelpOption("-h|--help"); command._versionOption = command.Option( - "-v|--version", + $"-v|--version <{LocalizableStrings.CmdVersion}>", LocalizableStrings.CmdVersionDescription, CommandOptionType.SingleValue); command._frameworkOption = command.Option( - $"-f|--framework <{CommonLocalizableStrings.CmdFramework}>", + $"-f|--framework <{LocalizableStrings.CmdFramework}>", LocalizableStrings.CmdFrameworkDescription, CommandOptionType.SingleValue); @@ -55,12 +55,12 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference CommandOptionType.NoValue); command._sourceOption = command.Option( - "-s|--source ", + $"-s|--source <{LocalizableStrings.CmdSource}>", LocalizableStrings.CmdSourceDescription, CommandOptionType.SingleValue); command._packageDirectoryOption = command.Option( - "--package-directory", + $"--package-directory <{LocalizableStrings.CmdPackageDirectory}>", LocalizableStrings.CmdPackageDirectoryDescription, CommandOptionType.SingleValue); @@ -69,14 +69,6 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public override int Run(string fileOrDirectory) { - Console.WriteLine("Waiting for debugger to attach."); - Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}"); - - while (!Debugger.IsAttached) - { - System.Threading.Thread.Sleep(100); - } - Debugger.Break(); var projects = new ProjectCollection(); var msbuildProj = MsbuildProject.FromFileOrDirectory(projects, fileOrDirectory); From ac988a4ac92cecb3eb21a58e88cf645f0f2d7279 Mon Sep 17 00:00:00 2001 From: Ankit Mishra Date: Thu, 22 Dec 2016 15:29:29 -0800 Subject: [PATCH 5/5] Fixing on PR comments --- src/dotnet/MsbuildProject.cs | 42 +++++++------- .../dotnet-add-package/LocalizableStrings.cs | 3 +- .../dotnet-add/dotnet-add-package/Program.cs | 58 ++++++++++--------- 3 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/dotnet/MsbuildProject.cs b/src/dotnet/MsbuildProject.cs index 8d2ec6879..414ebf4cb 100644 --- a/src/dotnet/MsbuildProject.cs +++ b/src/dotnet/MsbuildProject.cs @@ -1,6 +1,10 @@ // 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; +using System.Collections.Generic; +using System.IO; +using System.Linq; using Microsoft.Build.Construction; using Microsoft.Build.Evaluation; using Microsoft.Build.Exceptions; @@ -8,10 +12,6 @@ using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Tools.Common; using Microsoft.DotNet.Tools.ProjectExtensions; using NuGet.Frameworks; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; namespace Microsoft.DotNet.Tools { @@ -61,6 +61,19 @@ namespace Microsoft.DotNet.Tools } public static MsbuildProject FromDirectory(ProjectCollection projects, string projectDirectory) + { + FileInfo projectFile = GetProjectFileFromDirectory(projectDirectory); + + var project = TryOpenProject(projects, projectFile.FullName); + if (project == null) + { + throw new GracefulException(CommonLocalizableStrings.FoundInvalidProject, projectFile.FullName); + } + + return new MsbuildProject(projects, project); + } + + public static FileInfo GetProjectFileFromDirectory(string projectDirectory) { DirectoryInfo dir; try @@ -90,22 +103,7 @@ namespace Microsoft.DotNet.Tools throw new GracefulException(CommonLocalizableStrings.MoreThanOneProjectInDirectory, projectDirectory); } - FileInfo projectFile = files.First(); - - if (!projectFile.Exists) - { - throw new GracefulException( - CommonLocalizableStrings.CouldNotFindAnyProjectInDirectory, - projectDirectory); - } - - var project = TryOpenProject(projects, projectFile.FullName); - if (project == null) - { - throw new GracefulException(CommonLocalizableStrings.FoundInvalidProject, projectFile.FullName); - } - - return new MsbuildProject(projects, project); + return files.First(); } public int AddProjectToProjectReferences(string framework, IEnumerable refs) @@ -120,7 +118,7 @@ namespace Microsoft.DotNet.Tools if (ProjectRootElement.HasExistingItemWithCondition(framework, @ref)) { Reporter.Output.WriteLine(string.Format( - CommonLocalizableStrings.ProjectAlreadyHasAreference, + CommonLocalizableStrings.ProjectAlreadyHasAreference, @ref)); continue; } @@ -270,4 +268,4 @@ namespace Microsoft.DotNet.Tools } } } -} +} \ No newline at end of file diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs index 25986ace6..1290883a3 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/LocalizableStrings.cs @@ -11,6 +11,8 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public const string AppHelpText = "Package references to add"; + public const string SpecifyExactlyOnePackageReference = "Please specify one package reference to add."; + public const string CmdFrameworkDescription = "Add reference only when targetting a specific framework"; public const string CmdNoRestoreDescription = "Add reference without performing restore preview and compatibility check."; @@ -30,6 +32,5 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public const string CmdSource = "SOURCE"; public const string CmdPackageDirectory = "PACKAGE_DIRECTORY"; - } } \ No newline at end of file diff --git a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs index 7f344e4c9..1394638e8 100644 --- a/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs +++ b/src/dotnet/commands/dotnet-add/dotnet-add-package/Program.cs @@ -28,7 +28,7 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public static DotNetSubCommandBase Create() { - var command = new AddPackageReferenceCommand() + var command = new AddPackageReferenceCommand { Name = "package", FullName = LocalizableStrings.AppFullName, @@ -69,29 +69,38 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference public override int Run(string fileOrDirectory) { - var projects = new ProjectCollection(); - var msbuildProj = MsbuildProject.FromFileOrDirectory(projects, fileOrDirectory); - - if (RemainingArguments.Count == 0) + if (RemainingArguments.Count != 1) { - throw new GracefulException(CommonLocalizableStrings.SpecifyAtLeastOneReferenceToAdd); + throw new GracefulException(LocalizableStrings.SpecifyExactlyOnePackageReference); + } + + var projectFilePath = string.Empty; + + if (!File.Exists(fileOrDirectory)) + { + projectFilePath = MsbuildProject.GetProjectFileFromDirectory(fileOrDirectory).FullName; + } + else + { + projectFilePath = fileOrDirectory; } var tempDgFilePath = string.Empty; - if(!_noRestoreOption.HasValue()) + + if (!_noRestoreOption.HasValue()) { // Create a Dependency Graph file for the project - tempDgFilePath = CreateTemporaryFile(".dg"); - GetProjectDependencyGraph(msbuildProj.ProjectRootElement.FullPath, tempDgFilePath); + tempDgFilePath = Path.GetTempFileName(); + GetProjectDependencyGraph(projectFilePath, tempDgFilePath); } - var result = NuGetCommand.Run(TransformArgs(tempDgFilePath, msbuildProj.ProjectRootElement.FullPath)); + var result = NuGetCommand.Run(TransformArgs(RemainingArguments.First(), tempDgFilePath, projectFilePath)); DisposeTemporaryFile(tempDgFilePath); + return result; } - private void GetProjectDependencyGraph(string projectFilePath, - string dgFilePath) + private void GetProjectDependencyGraph(string projectFilePath, string dgFilePath) { var args = new List(); @@ -102,7 +111,7 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference args.Add("/t:GenerateRestoreGraphFile"); // Pass Dependency Graph file output path - args.Add(string.Format("/p:RestoreGraphOutputPath={0}{1}{2}", '"', dgFilePath, '"')); + args.Add($"/p:RestoreGraphOutputPath=\"{dgFilePath}\""); var result = new MSBuildForwardingApp(args).Execute(); @@ -112,14 +121,6 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference } } - private string CreateTemporaryFile(string extension) - { - var tempDirectory = Path.GetTempPath(); - var tempFile = Path.Combine(tempDirectory, Guid.NewGuid().ToString() + extension); - File.Create(tempFile).Dispose(); - return tempFile; - } - private void DisposeTemporaryFile(string filePath) { if (File.Exists(filePath)) @@ -128,37 +129,38 @@ namespace Microsoft.DotNet.Tools.Add.PackageReference } } - private string[] TransformArgs(string tempDgFilePath, string projectFilePath) + private string[] TransformArgs(string packageId, string tempDgFilePath, string projectFilePath) { var args = new List(){ "package", "add", "--package", - "Newtonsoft.Json", + packageId, "--project", projectFilePath }; - if(_versionOption.HasValue()) + + if (_versionOption.HasValue()) { args.Add("--version"); args.Add(_versionOption.Value()); } - if(_sourceOption.HasValue()) + if (_sourceOption.HasValue()) { args.Add("--source"); args.Add(_sourceOption.Value()); } - if(_frameworkOption.HasValue()) + if (_frameworkOption.HasValue()) { args.Add("--framework"); args.Add(_frameworkOption.Value()); } - if(_packageDirectoryOption.HasValue()) + if (_packageDirectoryOption.HasValue()) { args.Add("--package-directory"); args.Add(_packageDirectoryOption.Value()); } - if(_noRestoreOption.HasValue()) + if (_noRestoreOption.HasValue()) { args.Add("--no-restore"); }