Skip to content

Commit b98e0dd

Browse files
authored
Fix dotnet remove package project argument not recognized (dotnet#53401)
2 parents 521bd74 + 9984cae commit b98e0dd

4 files changed

Lines changed: 43 additions & 1 deletion

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.CommandLine;
45
using Microsoft.DotNet.Cli.Commands.Package.Remove;
56

67
namespace Microsoft.DotNet.Cli.Commands.Hidden.Remove.Package;
78

89
internal sealed class RemovePackageCommandDefinition() : PackageRemoveCommandDefinitionBase(Name)
910
{
1011
public new const string Name = "package";
12+
13+
public RemoveCommandDefinition Parent => (RemoveCommandDefinition)Parents.Single();
14+
15+
public override Argument<string>? GetProjectOrFileArgument()
16+
=> Parent.ProjectOrFileArgument;
1117
}

src/Cli/Microsoft.DotNet.Cli.Definitions/Commands/Package/PackageRemoveCommandDefinition.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public PackageRemoveCommandDefinition()
1616
Options.Add(ProjectOption);
1717
Options.Add(FileOption);
1818
}
19+
20+
public override Argument<string>? GetProjectOrFileArgument()
21+
=> null;
1922
}
2023

2124
internal abstract class PackageRemoveCommandDefinitionBase : Command
@@ -36,4 +39,6 @@ public PackageRemoveCommandDefinitionBase(string name)
3639
Arguments.Add(CmdPackageArgument);
3740
Options.Add(InteractiveOption);
3841
}
42+
43+
public abstract Argument<string>? GetProjectOrFileArgument();
3944
}

src/Cli/dotnet/Commands/Package/Remove/PackageRemoveCommand.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ public override int Execute()
2525
throw new GracefulException(CliCommandStrings.PackageRemoveSpecifyExactlyOnePackageReference);
2626
}
2727

28-
var (fileOrDirectory, allowedAppKinds) = PackageCommandParser.ProcessPathOptions(_definition.FileOption, _definition.ProjectOption, projectOrFileArgument: null, _parseResult);
28+
var (fileOrDirectory, allowedAppKinds) = PackageCommandParser.ProcessPathOptions(
29+
_definition.FileOption,
30+
_definition.ProjectOption,
31+
_definition.GetProjectOrFileArgument(),
32+
_parseResult);
2933

3034
if (allowedAppKinds.HasFlag(AppKinds.FileBased) && VirtualProjectBuilder.IsValidEntryPointPath(fileOrDirectory))
3135
{

test/dotnet.Tests/CommandTests/Package/Remove/GivenDotnetRemovePackage.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,33 @@ public void WhenReferencedPackageIsPassedItGetsRemoved()
8686
remove.StdErr.Should().BeEmpty();
8787
}
8888

89+
[Fact]
90+
public void WhenReferencedPackageIsRemovedUsingPositionalProjectArgumentItGetsRemoved()
91+
{
92+
const string testAsset = "TestAppSimple";
93+
var projectDirectory = TestAssetsManager
94+
.CopyTestAsset(testAsset)
95+
.WithSource().Path;
96+
97+
var packageName = "Newtonsoft.Json";
98+
var projectFilePath = Path.Combine(projectDirectory, $"{testAsset}.csproj");
99+
var parentDirectory = Directory.GetParent(projectDirectory)!.FullName;
100+
var relativeProjectPath = Path.GetRelativePath(parentDirectory, projectFilePath);
101+
102+
new DotnetCommand(Log)
103+
.WithWorkingDirectory(projectDirectory)
104+
.Execute("add", "package", packageName)
105+
.Should().Pass();
106+
107+
var remove = new DotnetCommand(Log)
108+
.WithWorkingDirectory(parentDirectory)
109+
.Execute("remove", relativeProjectPath, "package", packageName);
110+
111+
remove.Should().Pass();
112+
remove.StdOut.Should().Contain($"Removing PackageReference for package '{packageName}' from project '{relativeProjectPath}'.");
113+
remove.StdErr.Should().BeEmpty();
114+
}
115+
89116
[Fact]
90117
public void FileBasedApp()
91118
{

0 commit comments

Comments
 (0)