diff --git a/src/dotnet-ef/Project.cs b/src/dotnet-ef/Project.cs index 7875219d73e..1953c0f1a46 100644 --- a/src/dotnet-ef/Project.cs +++ b/src/dotnet-ef/Project.cs @@ -53,16 +53,35 @@ public static Project FromFile( Directory.CreateDirectory(buildExtensionsDir); + byte[] efTargets; + using (var input = typeof(Resources).Assembly.GetManifestResourceStream( + "Microsoft.EntityFrameworkCore.Tools.Resources.EntityFrameworkCore.targets")!) + { + efTargets = new byte[input.Length]; + input.Read(efTargets); + } + var efTargetsPath = Path.Combine( buildExtensionsDir, Path.GetFileName(file) + ".EntityFrameworkCore.targets"); - using (var input = typeof(Resources).Assembly.GetManifestResourceStream( - "Microsoft.EntityFrameworkCore.Tools.Resources.EntityFrameworkCore.targets")!) - using (var output = File.OpenWrite(efTargetsPath)) + + bool FileMatches() + { + try + { + return !File.ReadAllBytes(efTargetsPath).SequenceEqual(efTargets); + } + catch + { + return false; + } + } + + // Avoid touching the targets file, if it matches what we need, to enable incremental builds + if (!File.Exists(efTargetsPath) || !FileMatches()) { - // NB: Copy always in case it changes Reporter.WriteVerbose(Resources.WritingFile(efTargetsPath)); - input.CopyTo(output); + File.WriteAllBytes(efTargetsPath, efTargets); } IDictionary metadata; diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/ModelCodeGeneratorTestFixture.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/ModelCodeGeneratorTestFixture.cs index 1244b7a15e6..9f6c7752ad8 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/ModelCodeGeneratorTestFixture.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/ModelCodeGeneratorTestFixture.cs @@ -12,14 +12,14 @@ public ModelCodeGeneratorTestFixture() using (var input = typeof(ModelCodeGeneratorTestBase).Assembly.GetManifestResourceStream( "Microsoft.EntityFrameworkCore.Resources.CSharpDbContextGenerator.tt")) - using (var output = File.OpenWrite(Path.Combine(templatesDir, "DbContext.t4"))) + using (var output = File.Create(Path.Combine(templatesDir, "DbContext.t4"))) { input.CopyTo(output); } using (var input = typeof(ModelCodeGeneratorTestBase).Assembly.GetManifestResourceStream( "Microsoft.EntityFrameworkCore.Resources.CSharpEntityTypeGenerator.tt")) - using (var output = File.OpenWrite(Path.Combine(templatesDir, "EntityType.t4"))) + using (var output = File.Create(Path.Combine(templatesDir, "EntityType.t4"))) { input.CopyTo(output); } diff --git a/test/EFCore.Specification.Tests/TestUtilities/BuildSource.cs b/test/EFCore.Specification.Tests/TestUtilities/BuildSource.cs index 4da91e2b178..d484d979912 100644 --- a/test/EFCore.Specification.Tests/TestUtilities/BuildSource.cs +++ b/test/EFCore.Specification.Tests/TestUtilities/BuildSource.cs @@ -60,7 +60,7 @@ public BuildFileResult Build() var targetPath = Path.Combine(TargetDir ?? Path.GetTempPath(), projectName + ".dll"); - using (var stream = File.OpenWrite(targetPath)) + using (var stream = File.Create(targetPath)) { var result = compilation.Emit(stream); if (!result.Success)