private ProjectInstance CreateProjectInstance(string projectPath, string toolsVersion, ProjectCollection projectCollection) { var sdkResolver = SetupSdkResolver(Path.GetDirectoryName(projectPath)); var projectOptions = SdkUtilities.CreateProjectOptionsWithResolver(sdkResolver); projectOptions.ProjectCollection = projectCollection; projectOptions.ToolsVersion = toolsVersion; ProjectRootElement projectRootElement = ProjectRootElement.Open(projectPath, _projectCollection); Project project = Project.FromProjectRootElement(projectRootElement, projectOptions); return(project.CreateProjectInstance(ProjectInstanceSettings.None, projectOptions.EvaluationContext)); }
public void ProjectResolverContextRefersToBuildingProject(string projectFormatString) { string projectInnerContents = _projectInnerContents; File.WriteAllText(_sdkPropsPath, _sdkPropsContent); File.WriteAllText(_sdkTargetsPath, _sdkTargetsContent); // Use custom SDK resolution to ensure resolver context is logged. var mapping = new Dictionary <string, string> { { SdkName, _testSdkDirectory } }; var projectOptions = SdkUtilities.CreateProjectOptionsWithResolver(new SdkUtilities.FileBasedMockSdkResolver(mapping)); // Create a normal project (p1) which imports an SDK style project (p2). var projectFolder = _env.CreateFolder().Path; var p1 = @"<Project> <Import Project=""p2.proj"" /> </Project>"; var p2 = string.Format(projectFormatString, SdkName, projectInnerContents); var p1Path = Path.Combine(projectFolder, "p1.proj"); var p2Path = Path.Combine(projectFolder, "p2.proj"); File.WriteAllText(p1Path, p1); File.WriteAllText(p2Path, p2); var logger = new MockLogger(); var pc = _env.CreateProjectCollection().Collection; pc.RegisterLogger(logger); ProjectRootElement projectRootElement = ProjectRootElement.Open(p1Path, pc); projectOptions.ProjectCollection = pc; var project = Project.FromProjectRootElement(projectRootElement, projectOptions); // ProjectFilePath should be logged with the path to p1 and not the path to p2. logger.AssertLogContains($"ProjectFilePath = {p1Path}"); logger.AssertLogDoesntContain($"ProjectFilePath = {p2Path}"); }
public void ImportedProjectsSdkImportsAreInPreprocessedOutput() { using (TestEnvironment env = TestEnvironment.Create()) { string sdk1 = env.CreateFolder().FolderPath; string sdk2 = env.CreateFolder().FolderPath; var projectOptions = SdkUtilities.CreateProjectOptionsWithResolver(new SdkUtilities.FileBasedMockSdkResolver(new Dictionary <string, string> { { "MSBuildUnitTestSdk1", sdk1 }, { "MSBuildUnitTestSdk2", sdk2 }, })); string sdkPropsPath1 = Path.Combine(sdk1, "Sdk.props"); string sdkTargetsPath1 = Path.Combine(sdk1, "Sdk.targets"); File.WriteAllText(sdkPropsPath1, @"<Project> <PropertyGroup> <SdkProps1Imported>true</SdkProps1Imported> </PropertyGroup> </Project>"); File.WriteAllText(sdkTargetsPath1, @"<Project> <PropertyGroup> <SdkTargets1Imported>true</SdkTargets1Imported> </PropertyGroup> </Project>"); string sdkPropsPath2 = Path.Combine(sdk2, "Sdk.props"); string sdkTargetsPath2 = Path.Combine(sdk2, "Sdk.targets"); File.WriteAllText(sdkPropsPath2, @"<Project> <PropertyGroup> <SdkProps2Imported>true</SdkProps2Imported> </PropertyGroup> </Project>"); File.WriteAllText(sdkTargetsPath2, @"<Project> <PropertyGroup> <SdkTargets2Imported>true</SdkTargets2Imported> </PropertyGroup> </Project>"); TransientTestProjectWithFiles import = env.CreateTestProjectWithFiles(@"<Project Sdk='MSBuildUnitTestSdk2'> <PropertyGroup> <MyImportWasImported>true</MyImportWasImported> </PropertyGroup> </Project>"); string importPath = Path.GetFullPath(import.ProjectFile); string content = $@"<Project Sdk='MSBuildUnitTestSdk1'> <Import Project='{importPath}' /> <PropertyGroup> <p>v1</p> </PropertyGroup> </Project>"; Project project = Project.FromProjectRootElement( ProjectRootElement.Create(XmlReader.Create(new StringReader(content))), projectOptions); StringWriter writer = new StringWriter(); project.SaveLogicalProject(writer); string expected = ObjectModelHelpers.CleanupFileContents( $@"<?xml version=""1.0"" encoding=""utf-16""?> <Project> <!-- ============================================================================================================================================ <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk1""> This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk1"". {sdkPropsPath1.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <SdkProps1Imported>true</SdkProps1Imported> </PropertyGroup> <!-- ============================================================================================================================================ </Import> ============================================================================================================================================ --> <!-- ============================================================================================================================================ <Import Project=""{importPath.Replace("--", "__")}""> {importPath.Replace("--", "__")} ============================================================================================================================================ --> <!-- ============================================================================================================================================ <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk2""> This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk2"". {sdkPropsPath2.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <SdkProps2Imported>true</SdkProps2Imported> </PropertyGroup> <!-- ============================================================================================================================================ </Import> {importPath.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <MyImportWasImported>true</MyImportWasImported> </PropertyGroup> <!-- ============================================================================================================================================ <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk2""> This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk2"". {sdkTargetsPath2.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <SdkTargets2Imported>true</SdkTargets2Imported> </PropertyGroup> <!-- ============================================================================================================================================ </Import> {importPath.Replace("--", "__")} ============================================================================================================================================ --> <!-- ============================================================================================================================================ </Import> ============================================================================================================================================ --> <PropertyGroup> <p>v1</p> </PropertyGroup> <!-- ============================================================================================================================================ <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk1""> This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk1"". {sdkTargetsPath1.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <SdkTargets1Imported>true</SdkTargets1Imported> </PropertyGroup> <!-- ============================================================================================================================================ </Import> ============================================================================================================================================ --> </Project>"); Helpers.VerifyAssertLineByLine(expected, writer.ToString()); } }
public void SdkImportsAreInPreprocessedOutput() { using (TestEnvironment env = TestEnvironment.Create()) { string testSdkDirectory = env.CreateFolder().FolderPath; var projectOptions = SdkUtilities.CreateProjectOptionsWithResolver(new SdkUtilities.FileBasedMockSdkResolver(new Dictionary <string, string> { { "MSBuildUnitTestSdk", testSdkDirectory } })); string sdkPropsPath = Path.Combine(testSdkDirectory, "Sdk.props"); string sdkTargetsPath = Path.Combine(testSdkDirectory, "Sdk.targets"); File.WriteAllText(sdkPropsPath, @"<Project> <PropertyGroup> <SdkPropsImported>true</SdkPropsImported> </PropertyGroup> </Project>"); File.WriteAllText(sdkTargetsPath, @"<Project> <PropertyGroup> <SdkTargetsImported>true</SdkTargetsImported> </PropertyGroup> </Project>"); string content = @"<Project Sdk='MSBuildUnitTestSdk'> <PropertyGroup> <p>v1</p> </PropertyGroup> </Project>"; Project project = Project.FromProjectRootElement( ProjectRootElement.Create(XmlReader.Create(new StringReader(content))), projectOptions); StringWriter writer = new StringWriter(); project.SaveLogicalProject(writer); string expected = ObjectModelHelpers.CleanupFileContents( $@"<?xml version=""1.0"" encoding=""utf-16""?> <Project> <!-- ============================================================================================================================================ <Import Project=""Sdk.props"" Sdk=""MSBuildUnitTestSdk""> This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk"". {sdkPropsPath.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <SdkPropsImported>true</SdkPropsImported> </PropertyGroup> <!-- ============================================================================================================================================ </Import> ============================================================================================================================================ --> <PropertyGroup> <p>v1</p> </PropertyGroup> <!-- ============================================================================================================================================ <Import Project=""Sdk.targets"" Sdk=""MSBuildUnitTestSdk""> This import was added implicitly because the Project element's Sdk attribute specified ""MSBuildUnitTestSdk"". {sdkTargetsPath.Replace("--", "__")} ============================================================================================================================================ --> <PropertyGroup> <SdkTargetsImported>true</SdkTargetsImported> </PropertyGroup> <!-- ============================================================================================================================================ </Import> ============================================================================================================================================ --> </Project>"); Helpers.VerifyAssertLineByLine(expected, writer.ToString()); } }