diff --git a/src/Aspire.Cli/Projects/ProjectLocator.cs b/src/Aspire.Cli/Projects/ProjectLocator.cs index 3f202ed818d..a7f2506a6e7 100644 --- a/src/Aspire.Cli/Projects/ProjectLocator.cs +++ b/src/Aspire.Cli/Projects/ProjectLocator.cs @@ -22,6 +22,8 @@ internal interface IProjectLocator internal sealed class ProjectLocator(ILogger logger, IDotNetCliRunner runner, CliExecutionContext executionContext, IInteractionService interactionService, IConfigurationService configurationService, AspireCliTelemetry telemetry, IFeatures features) : IProjectLocator { + private static readonly HashSet s_supportedProjectFileExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) { ".csproj", ".fsproj", ".vbproj" }; + public async Task> FindAppHostProjectFilesAsync(string searchDirectory, CancellationToken cancellationToken) { var allCandidates = await FindAppHostProjectFilesAsync(new DirectoryInfo(searchDirectory), cancellationToken); @@ -345,8 +347,8 @@ await Parallel.ForEachAsync(appHostFiles, parallelOptions, async (candidateFile, throw new ProjectLocatorException(ErrorStrings.ProjectFileDoesntExist); } } - // Handle .csproj files - else if (projectFile.Extension.Equals(".csproj", StringComparison.OrdinalIgnoreCase)) + // Handle .cs|fs|vbproj files + else if (s_supportedProjectFileExtensions.Contains(projectFile.Extension)) { logger.LogDebug("Using project file {ProjectFile}", projectFile.FullName); return projectFile; diff --git a/tests/Aspire.Cli.Tests/Projects/ProjectLocatorTests.cs b/tests/Aspire.Cli.Tests/Projects/ProjectLocatorTests.cs index 99b120a63a6..d66feaf3255 100644 --- a/tests/Aspire.Cli.Tests/Projects/ProjectLocatorTests.cs +++ b/tests/Aspire.Cli.Tests/Projects/ProjectLocatorTests.cs @@ -244,12 +244,15 @@ public async Task UseOrFindAppHostProjectFileThrowsIfNoProjectWasFound() Assert.Equal("No project file found.", ex.Message); } - [Fact] - public async Task UseOrFindAppHostProjectFileReturnsExplicitProjectIfExistsAndProvided() + [Theory] + [InlineData(".csproj")] + [InlineData(".fsproj")] + [InlineData(".vbproj")] + public async Task UseOrFindAppHostProjectFileReturnsExplicitProjectIfExistsAndProvided(string projectFileExtension) { var logger = NullLogger.Instance; using var workspace = TemporaryWorkspace.Create(outputHelper); - var projectFile = new FileInfo(Path.Combine(workspace.WorkspaceRoot.FullName, "AppHost.csproj")); + var projectFile = new FileInfo(Path.Combine(workspace.WorkspaceRoot.FullName, $"AppHost{projectFileExtension}")); await File.WriteAllTextAsync(projectFile.FullName, "Not a real project file."); var runner = new TestDotNetCliRunner(); @@ -1170,3 +1173,4 @@ public async Task FindExecutableProjectsAsync_FindsMultipleExecutableProjects() Assert.Contains(executableProjects, p => p.FullName == winExeFile.FullName); } } +