Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/Aspire.Cli/DotNet/DotNetCliRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -747,24 +747,27 @@ public async Task<int> AddPackageAsync(FileInfo projectFilePath, string packageN

var cliArgsList = new List<string>
{
"add"
"package"
};

// For single-file AppHost (apphost.cs), use --file switch instead of positional argument
var isSingleFileAppHost = projectFilePath.Name.Equals("apphost.cs", StringComparison.OrdinalIgnoreCase);
if (isSingleFileAppHost)
{
cliArgsList.AddRange(["package", "--file", projectFilePath.FullName]);
cliArgsList.Add("add");
cliArgsList.AddRange(["--file", projectFilePath.FullName]);
// For single-file AppHost, use packageName@version format
cliArgsList.Add($"{packageName}@{packageVersion}");
}
else
{
cliArgsList.AddRange([projectFilePath.FullName, "package"]);
cliArgsList.Add("add");
// For non single-file scenarios, use separate --version flag
cliArgsList.Add(packageName);
cliArgsList.Add("--version");
cliArgsList.Add(packageVersion);
cliArgsList.Add("--project");
cliArgsList.Add(projectFilePath.FullName);
}

if (string.IsNullOrEmpty(nugetSource))
Expand Down
39 changes: 22 additions & 17 deletions tests/Aspire.Cli.Tests/DotNet/DotNetCliRunnerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -551,14 +551,14 @@ public async Task AddPackageAsyncUseFilesSwitchForSingleFileAppHost()
Assert.Contains("Aspire.Hosting.Redis@9.2.0", args);
Assert.Contains("--no-restore", args);

// Verify the order: add package PackageName --file FilePath --version Version --no-restore
var addIndex = Array.IndexOf(args, "add");
// Verify the order: package add PackageName --file FilePath --version Version --no-restore
var packageIndex = Array.IndexOf(args, "package");
var addIndex = Array.IndexOf(args, "add");
var fileIndex = Array.IndexOf(args, "--file");
var filePathIndex = Array.IndexOf(args, appHostFile.FullName);
var packageNameIndex = Array.IndexOf(args, "Aspire.Hosting.Redis@9.2.0");

Assert.True(addIndex < packageIndex);
Assert.True(packageIndex < addIndex);
Assert.True(packageIndex < fileIndex);
Assert.True(fileIndex < filePathIndex);
Assert.True(filePathIndex < packageNameIndex);
Expand Down Expand Up @@ -605,19 +605,21 @@ public async Task AddPackageAsyncUsesPositionalArgumentForCsprojFile()
Assert.Contains("--source", args);
Assert.Contains("https://api.nuget.org/v3/index.json", args);

// Verify the order: add ProjectFile package PackageName --version Version --source Source
var addIndex = Array.IndexOf(args, "add");
var projectIndex = Array.IndexOf(args, projectFile.FullName);
// Verify the order: package add PackageName --version Version --source Source --project ProjectFile
var packageIndex = Array.IndexOf(args, "package");
var addIndex = Array.IndexOf(args, "add");
var projectFlagIndex = Array.IndexOf(args, "--project");
var projectValueIndex = Array.IndexOf(args, projectFile.FullName);
var packageNameIndex = Array.IndexOf(args, "Aspire.Hosting.Redis");
var versionFlagIndex = Array.IndexOf(args, "--version");
var versionValueIndex = Array.IndexOf(args, "9.2.0");

Assert.True(addIndex < projectIndex);
Assert.True(projectIndex < packageIndex);
Assert.True(packageIndex < packageNameIndex);
Assert.True(packageIndex < addIndex);
Assert.True(addIndex < packageNameIndex);
Assert.True(packageNameIndex < versionFlagIndex);
Assert.True(versionFlagIndex < versionValueIndex);
Assert.True(packageNameIndex < projectFlagIndex);
Assert.True(projectFlagIndex < projectValueIndex);

// Should NOT contain --file or the @version format
Assert.DoesNotContain("--file", args);
Expand Down Expand Up @@ -656,28 +658,31 @@ public async Task AddPackageAsyncUsesPositionalArgumentForCsprojFileWithNoRestor
(args, _, _, _) =>
{
// Verify arguments are correct for .csproj file with --no-restore (no source provided)
Assert.Contains("add", args);
Assert.Contains("package", args);
Assert.Contains(projectFile.FullName, args);
Assert.Contains("add", args);
Assert.Contains("Aspire.Hosting.Redis", args);
Assert.Contains("--version", args);
Assert.Contains("9.2.0", args);
Assert.Contains("--project", args);
Assert.Contains(projectFile.FullName, args);
Assert.Contains("--no-restore", args);

// Verify the order: add ProjectFile package PackageName --version Version --no-restore
var addIndex = Array.IndexOf(args, "add");
var projectIndex = Array.IndexOf(args, projectFile.FullName);
// Verify the order: package add PackageName --version Version --project ProjectFile --no-restore
var packageIndex = Array.IndexOf(args, "package");
var addIndex = Array.IndexOf(args, "add");
var packageNameIndex = Array.IndexOf(args, "Aspire.Hosting.Redis");
var versionFlagIndex = Array.IndexOf(args, "--version");
var versionValueIndex = Array.IndexOf(args, "9.2.0");
var projectFlagIndex = Array.IndexOf(args, "--project");
var projectValueIndex = Array.IndexOf(args, projectFile.FullName);
var noRestoreIndex = Array.IndexOf(args, "--no-restore");

Assert.True(addIndex < projectIndex);
Assert.True(projectIndex < packageIndex);
Assert.True(packageIndex < packageNameIndex);
Assert.True(packageIndex < addIndex);
Assert.True(addIndex < packageNameIndex);
Assert.True(packageNameIndex < versionFlagIndex);
Assert.True(versionFlagIndex < versionValueIndex);
Assert.True(packageNameIndex < projectFlagIndex);
Assert.True(projectFlagIndex < projectValueIndex);
Assert.True(versionValueIndex < noRestoreIndex);

// Should NOT contain --file, --source, or the @version format
Expand Down
Loading