diff --git a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs index 7721153da981..befee307df5c 100644 --- a/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs +++ b/src/Cli/dotnet/Commands/Run/VirtualProjectBuildingCommand.cs @@ -756,6 +756,12 @@ private bool NeedsToBuild(out CacheInfo cache) { cache = ComputeCacheEntry(); + if (Directives.Any(static d => d is CSharpDirective.Project)) + { + Reporter.Verbose.WriteLine("Building because there are project directives."); + return true; + } + // Check cache files. string artifactsDirectory = ArtifactsPath; diff --git a/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs b/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs index ebe57115cb42..6af43351e143 100644 --- a/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs +++ b/test/dotnet.Tests/CommandTests/Run/RunFileTests.cs @@ -3403,6 +3403,64 @@ public void UpToDate_InvalidOptions() .And.HaveStdErrContaining(string.Format(CliCommandStrings.CannotCombineOptions, RunCommandParser.NoCacheOption.Name, RunCommandParser.NoBuildOption.Name)); } + /// + /// optimization currently does not support #:project references and hence is disabled if those are present. + /// See . + /// + [Fact] + public void UpToDate_ProjectReferences() + { + var testInstance = _testAssetsManager.CreateTestDirectory(); + + var libDir = Path.Join(testInstance.Path, "Lib"); + Directory.CreateDirectory(libDir); + + File.WriteAllText(Path.Join(libDir, "Lib.csproj"), $""" + + + {ToolsetInfo.CurrentTargetFramework} + + + """); + + var libPath = Path.Join(libDir, "Lib.cs"); + var libCode = """ + namespace Lib; + public class LibClass + { + public static string GetMessage() => "Hello from Lib v1"; + } + """; + File.WriteAllText(libPath, libCode); + + var appDir = Path.Join(testInstance.Path, "App"); + Directory.CreateDirectory(appDir); + + var code = """ + #:project ../Lib + Console.WriteLine("v1 " + Lib.LibClass.GetMessage()); + """; + + var programPath = Path.Join(appDir, "Program.cs"); + File.WriteAllText(programPath, code); + + // Remove artifacts from possible previous runs of this test. + var artifactsDir = VirtualProjectBuildingCommand.GetArtifactsPath(programPath); + if (Directory.Exists(artifactsDir)) Directory.Delete(artifactsDir, recursive: true); + + var programFileName = "App/Program.cs"; + + Build(testInstance, BuildLevel.All, expectedOutput: "v1 Hello from Lib v1", programFileName: programFileName); + + // We cannot detect changes in referenced projects, so we always rebuild. + Build(testInstance, BuildLevel.All, expectedOutput: "v1 Hello from Lib v1", programFileName: programFileName); + + libCode = libCode.Replace("v1", "v2"); + File.WriteAllText(libPath, libCode); + + Build(testInstance, BuildLevel.All, expectedOutput: "v1 Hello from Lib v2", programFileName: programFileName); + } + /// /// Up-to-date checks and optimizations currently don't support other included files. ///