diff --git a/src/Microsoft.Build.Sql/sdk/Sdk.targets b/src/Microsoft.Build.Sql/sdk/Sdk.targets index f23baff..f04531c 100644 --- a/src/Microsoft.Build.Sql/sdk/Sdk.targets +++ b/src/Microsoft.Build.Sql/sdk/Sdk.targets @@ -184,6 +184,22 @@ + + + + + + + %(ProjectReferenceWithConfiguration.DatabaseSqlCmdVariable) + + + %(ProjectReferenceWithConfiguration.ServerSqlCmdVariable) + + + %(ProjectReferenceWithConfiguration.DatabaseVariableLiteralValue) + + + diff --git a/test/Microsoft.Build.Sql.Tests/BuildTests.cs b/test/Microsoft.Build.Sql.Tests/BuildTests.cs index 7e2078f..b07e9ec 100644 --- a/test/Microsoft.Build.Sql.Tests/BuildTests.cs +++ b/test/Microsoft.Build.Sql.Tests/BuildTests.cs @@ -505,5 +505,56 @@ public void VerifyBuildTargetPath() Assert.AreEqual(string.Empty, stdError); StringAssert.Contains($"Target path from PrintTargetPath: {GetDacpacPath()}", stdOutput, "Target path not found in output."); } + + [Test] + // https://github.com/microsoft/DacFx/issues/608 + [Description("Verifies build with transitive project references with DatabaseSqlCmdVariable should not have name collisions.")] + public void VerifyBuildWithTransitiveProjectReferencesWithDatabaseVariables() + { + // Create 3 sqlproj projects like Sql1, Sql2, Sql3 + string projectSql1Dir = Path.Combine(WorkingDirectory, "Sql1"); + string projectSql2Dir = Path.Combine(WorkingDirectory, "Sql2"); + string projectSql3Dir = Path.Combine(WorkingDirectory, "Sql3"); + string projectSql1 = Path.Combine(projectSql1Dir, "Sql1.sqlproj"); + string projectSql2 = Path.Combine(projectSql2Dir, "Sql2.sqlproj"); + string projectSql3 = Path.Combine(projectSql3Dir, "Sql3.sqlproj"); + + // Create identical Table1.sql in all three projects + string table1Sql = "CREATE TABLE Table1 (Id INT);\nGO\n"; + Directory.CreateDirectory(projectSql1Dir); + Directory.CreateDirectory(projectSql2Dir); + Directory.CreateDirectory(projectSql3Dir); + + File.WriteAllText(Path.Combine(projectSql1Dir, "Table1.sql"), table1Sql); + File.WriteAllText(Path.Combine(projectSql2Dir, "Table1.sql"), table1Sql); + File.WriteAllText(Path.Combine(projectSql3Dir, "Table1.sql"), table1Sql); + + // Copy from template to create project files + File.Copy( + Path.Combine(TestContext.CurrentContext.TestDirectory, "Template", "project.sqlproj"), + projectSql1); + File.Copy( + Path.Combine(TestContext.CurrentContext.TestDirectory, "Template", "project.sqlproj"), + projectSql2); + File.Copy( + Path.Combine(TestContext.CurrentContext.TestDirectory, "Template", "project.sqlproj"), + projectSql3); + + // Add references with DatabaseSqlCmdVariable + // Sql2 references Sql1 with DatabaseSqlCmdVariable="Sql1" + ProjectUtils.AddItemGroup(projectSql2, "ProjectReference", new string[] { projectSql1 }, + item => item.AddMetadata("DatabaseSqlCmdVariable", "Sql1")); + + // Sql3 references Sql2 with DatabaseSqlCmdVariable="Sql2" + ProjectUtils.AddItemGroup(projectSql3, "ProjectReference", new string[] { projectSql2 }, + item => item.AddMetadata("DatabaseSqlCmdVariable", "Sql2")); + + // Build Sql3 project + int exitCode = this.RunGenericDotnetCommand($"build {projectSql3}", out string stdOutput, out string stdError); + + // Build should succeed - different databases should not have name collisions + Assert.AreEqual(0, exitCode, "Build failed with error " + stdError); + Assert.AreEqual(string.Empty, stdError); + } } } \ No newline at end of file diff --git a/test/Microsoft.Build.Sql.Tests/Microsoft.Build.Sql.Tests.csproj b/test/Microsoft.Build.Sql.Tests/Microsoft.Build.Sql.Tests.csproj index 75dbe86..0fcbfdd 100644 --- a/test/Microsoft.Build.Sql.Tests/Microsoft.Build.Sql.Tests.csproj +++ b/test/Microsoft.Build.Sql.Tests/Microsoft.Build.Sql.Tests.csproj @@ -3,7 +3,7 @@ - net8.0;net9.0;net10.0 + net8.0 enable false