New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Toolset configuration net5.0 #6220
Changes from 18 commits
d3e8516
d9a316d
046e0a6
9a541e4
d0d0e7e
f3d2d22
82a23fc
7570c02
ab9d9ed
8ec091f
b9d7dba
f2e10bd
4b1343b
1616a36
fd7a68f
da88865
dbc1236
7e4ab72
a5d1939
6989bc1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,6 @@ | ||
// Copyright (c) Microsoft. All rights reserved. | ||
// Licensed under the MIT license. See LICENSE file in the project root for full license information. | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
|
||
using System.Configuration; | ||
using Microsoft.Win32; | ||
using Microsoft.Build.Collections; | ||
using Microsoft.Build.Evaluation; | ||
using Microsoft.Build.Exceptions; | ||
|
@@ -15,7 +11,6 @@ | |
using System; | ||
using System.Collections.Generic; | ||
using System.IO; | ||
using Microsoft.Build.UnitTests; | ||
|
||
namespace Microsoft.Build.UnitTests.Evaluation | ||
{ | ||
|
@@ -52,7 +47,11 @@ public void ImportFromExtensionsPathNotFound() | |
extnDir1 = GetNewExtensionsPathAndCreateFile("extensions1", Path.Combine("foo", "extn.proj"), GetExtensionTargetsFileContent1()); | ||
mainProjectPath = ObjectModelHelpers.CreateFileInTempProjectDirectory("main.proj", GetMainTargetFileContent()); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projColln = new ProjectCollection(); | ||
#else | ||
var projColln = new ProjectCollection(ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would it be possible to extract this to a new method There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oops forgot to reply to this one but this is a good call I made this change as well 😃 |
||
projColln.ResetToolsetsForTests(WriteConfigFileAndGetReader("MSBuildExtensionsPath", extnDir1, Path.Combine("tmp", "nonexistent"))); | ||
var logger = new MockLogger(); | ||
projColln.RegisterLogger(logger); | ||
|
@@ -297,7 +296,11 @@ public void ImportFromExtensionsPathInvalidFile() | |
extnDir1 = GetNewExtensionsPathAndCreateFile("extensions1", Path.Combine("foo", "extn.proj"), extnTargetsFileContent); | ||
mainProjectPath = ObjectModelHelpers.CreateFileInTempProjectDirectory("main.proj", GetMainTargetFileContent()); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projColln = new ProjectCollection(); | ||
#else | ||
var projColln = new ProjectCollection(ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
projColln.ResetToolsetsForTests(WriteConfigFileAndGetReader("MSBuildExtensionsPath", extnDir1, | ||
Path.Combine("tmp", "nonexistent"))); | ||
var logger = new MockLogger(); | ||
|
@@ -396,7 +399,11 @@ public void ImportFromExtensionsPathSearchOrder2() | |
|
||
// MSBuildExtensionsPath* property value has highest priority for the lookups | ||
try { | ||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projColln = new ProjectCollection(); | ||
#else | ||
var projColln = new ProjectCollection(ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
projColln.ResetToolsetsForTests(WriteConfigFileAndGetReader("MSBuildExtensionsPath", Path.Combine("tmp", "non-existent"), extnDir1)); | ||
var logger = new MockLogger(); | ||
projColln.RegisterLogger(logger); | ||
|
@@ -485,7 +492,12 @@ public void ImportFromExtensionsPathAnd32And64() | |
ToolsetConfigurationReaderTestHelper.WriteConfigFile(String.Format(configFileContents, extnDir1, extnDir2, extnDir3)); | ||
var reader = GetStandardConfigurationReader(); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projColln = new ProjectCollection(); | ||
#else | ||
var projColln = new ProjectCollection(ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
|
||
projColln.ResetToolsetsForTests(reader); | ||
var logger = new MockLogger(); | ||
projColln.RegisterLogger(logger); | ||
|
@@ -559,7 +571,11 @@ public void ExpandExtensionsPathFallback() | |
ToolsetConfigurationReaderTestHelper.WriteConfigFile(configFileContents); | ||
var reader = GetStandardConfigurationReader(); | ||
|
||
var projectCollection = new ProjectCollection(new Dictionary<string, string> {["FallbackExpandDir1"] = extnDir1}); | ||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }); | ||
#else | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }, null, ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
|
||
projectCollection.ResetToolsetsForTests(reader); | ||
var logger = new MockLogger(); | ||
|
@@ -620,7 +636,11 @@ public void ExpandExtensionsPathFallbackInErrorMessage() | |
ToolsetConfigurationReaderTestHelper.WriteConfigFile(configFileContents); | ||
var reader = GetStandardConfigurationReader(); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }); | ||
#else | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }, null, ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
|
||
projectCollection.ResetToolsetsForTests(reader); | ||
var logger = new MockLogger(); | ||
|
@@ -690,7 +710,11 @@ public void FallbackImportWithIndirectReference() | |
ToolsetConfigurationReaderTestHelper.WriteConfigFile(configFileContents); | ||
var reader = GetStandardConfigurationReader(); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }); | ||
#else | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }, null, ToolsetDefinitionLocations.ConfigurationFile); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should add the argument name before There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's true, I added the argument name in the GetProjectCollection function |
||
#endif | ||
|
||
projectCollection.ResetToolsetsForTests(reader); | ||
var logger = new MockLogger(); | ||
|
@@ -755,7 +779,11 @@ public void FallbackImportWithUndefinedProperty() | |
ToolsetConfigurationReaderTestHelper.WriteConfigFile(configFileContents); | ||
var reader = GetStandardConfigurationReader(); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }); | ||
#else | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }, null, ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
|
||
projectCollection.ResetToolsetsForTests(reader); | ||
var logger = new MockLogger(); | ||
|
@@ -814,7 +842,11 @@ public void FallbackImportWithFileNotFoundWhenPropertyNotDefined() | |
ToolsetConfigurationReaderTestHelper.WriteConfigFile(configFileContents); | ||
var reader = GetStandardConfigurationReader(); | ||
|
||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }); | ||
#else | ||
var projectCollection = new ProjectCollection(new Dictionary<string, string> { ["FallbackExpandDir1"] = extnDir1 }, null, ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
|
||
projectCollection.ResetToolsetsForTests(reader); | ||
var logger = new MockLogger(); | ||
|
@@ -865,7 +897,11 @@ void CreateAndBuildProjectForImportFromExtensionsPath(string extnPathPropertyNam | |
Action<Project, MockLogger> action) | ||
{ | ||
try { | ||
#if FEATURE_SYSTEM_CONFIGURATION | ||
var projColln = new ProjectCollection(); | ||
#else | ||
var projColln = new ProjectCollection(ToolsetDefinitionLocations.ConfigurationFile); | ||
#endif | ||
projColln.ResetToolsetsForTests(WriteConfigFileAndGetReader(extnPathPropertyName, extnDirs)); | ||
var logger = new MockLogger(); | ||
projColln.RegisterLogger(logger); | ||
|
@@ -977,4 +1013,3 @@ private ToolsetConfigurationReader GetStandardConfigurationReader() | |
} | ||
} | ||
} | ||
#endif |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// Copyright (c) Microsoft. All rights reserved. | ||
// Licensed under the MIT license. See LICENSE file in the project root for full license information. | ||
|
||
#if !FEATURE_SYSTEM_CONFIGURATION | ||
/* This test is designed especially to test Configuration parsing in net5.0 | ||
* which means it WON'T work in net472 and thus we don't run it in net472 */ | ||
|
||
using Microsoft.Build.Evaluation; | ||
using Microsoft.Build.Execution; | ||
|
||
using Xunit; | ||
using System.Collections.Generic; | ||
|
||
namespace Microsoft.Build.UnitTests.Evaluation | ||
{ | ||
/// <summary> | ||
/// Unit tests for MSBuild Net5.0 Configuration Parsing | ||
/// </summary> | ||
public class ToolsetConfigurationNet5Test | ||
{ | ||
[Fact] | ||
// The default ToolsetDefintionLocations is None, which results in only the local which results in only the several included | ||
// paths such as SDK path and RoslynTargetPath and nothing else. This behavior is expected and the exact same as before. | ||
public void ToolsetDefinitionLocationsIsDefault() | ||
{ | ||
var projectCollection = new ProjectCollection(); | ||
IDictionary<string, string> toolsetProperties | ||
= new Dictionary<string, string>(); | ||
|
||
foreach (Toolset toolset in projectCollection.Toolsets) | ||
{ | ||
foreach (KeyValuePair<string, ProjectPropertyInstance> properties in toolset.Properties) | ||
{ | ||
toolsetProperties[properties.Value.Name] = properties.Value.EvaluatedValue; | ||
} | ||
} | ||
|
||
Assert.True(toolsetProperties.ContainsKey("MSBuildSDKsPath")); | ||
Assert.True(toolsetProperties.ContainsKey("RoslynTargetsPath")); | ||
Assert.NotEqual(string.Empty, toolsetProperties["MSBuildSDKsPath"]); | ||
Assert.NotEqual(string.Empty, toolsetProperties["RoslynTargetsPath"]); | ||
|
||
Assert.False(toolsetProperties.ContainsKey("VCTargetsPath")); | ||
Assert.False(toolsetProperties.ContainsKey("MSBuildToolsRoot")); | ||
Assert.False(toolsetProperties.ContainsKey("MSBuildExtensionsPath")); | ||
} | ||
|
||
[Fact] | ||
// With ToolsetDefintionLocations set to ConfigurationFile (Which would only happen in net5.0 if the user decides to set it). | ||
// Most toolsets are available and the MsBuildTools and SDK paths are all in the net5.0 runtime. | ||
public void ToolsetDefinitionLocationsIsConfiguration() | ||
{ | ||
var projectCollection = new ProjectCollection(ToolsetDefinitionLocations.ConfigurationFile); | ||
IDictionary<string, string> toolsetProperties | ||
= new Dictionary<string, string>(); | ||
|
||
foreach (Toolset toolset in projectCollection.Toolsets) | ||
{ | ||
foreach (KeyValuePair<string, ProjectPropertyInstance> properties in toolset.Properties) | ||
{ | ||
toolsetProperties[properties.Value.Name] = properties.Value.EvaluatedValue; | ||
} | ||
} | ||
|
||
Assert.True(toolsetProperties.ContainsKey("MSBuildSDKsPath")); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have you looked into using Shouldly? Some other tests use Shouldly, if you just search for it for examples. It's better than the standard asserts. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated to Shouldly |
||
Assert.True(toolsetProperties.ContainsKey("RoslynTargetsPath")); | ||
Assert.NotEqual(string.Empty, toolsetProperties["MSBuildSDKsPath"]); | ||
Assert.NotEqual(string.Empty, toolsetProperties["RoslynTargetsPath"]); | ||
|
||
Assert.True(toolsetProperties.ContainsKey("VCTargetsPath")); | ||
Assert.True(toolsetProperties.ContainsKey("MSBuildToolsRoot")); | ||
Assert.True(toolsetProperties.ContainsKey("MSBuildExtensionsPath")); | ||
Assert.NotEqual(string.Empty, toolsetProperties["VCTargetsPath"]); | ||
Assert.NotEqual(string.Empty, toolsetProperties["MSBuildToolsRoot"]); | ||
Assert.NotEqual(string.Empty, toolsetProperties["MSBuildExtensionsPath"]); | ||
} | ||
} | ||
} | ||
#endif |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hyper-Nit: Is this a BOM change from a text editor? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yep seems like it... Though I thought I only opened it in VS so it's odd but it should be fixed now 👍 |
||
|
||
<PropertyGroup> | ||
<TargetFrameworks>$(RuntimeOutputTargetFrameworks)</TargetFrameworks> | ||
|
@@ -16,6 +16,7 @@ | |
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="System.Configuration.ConfigurationManager" /> | ||
<PackageReference Include="Shouldly" /> | ||
<PackageReference Include="Microsoft.CodeAnalysis.Build.Tasks" /> | ||
<PackageReference Include="NuGet.Frameworks" > | ||
|
@@ -44,17 +45,12 @@ | |
<SetTargetFramework Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework' and '$(MonoBuild)' == 'true'">TargetFramework=$(FullFrameworkTFM)</SetTargetFramework> | ||
<SetTargetFramework Condition="'$(TargetFrameworkIdentifier)' != '.NETFramework'">TargetFramework=net5.0</SetTargetFramework> | ||
</ProjectReference> | ||
|
||
<Reference Include="System.Configuration" Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'" /> | ||
</ItemGroup> | ||
|
||
<ItemGroup> | ||
<Compile Include="..\Shared\FxCopExclusions\Microsoft.Build.Shared.Suppressions.cs"> | ||
<ExcludeFromStyleCop>true</ExcludeFromStyleCop> | ||
</Compile> | ||
|
||
<Compile Remove="Definition\ToolsetConfigurationReaderTestHelper.cs" /> | ||
<Compile Include="Definition\ToolsetConfigurationReaderTestHelper.cs" Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'" /> | ||
|
||
<Compile Include="..\Shared\UnitTests\BuildEventArgsExtension.cs"> | ||
<!-- Extension methods --> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we own this? Also thinking we should try running this through RPS.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry this is my first time making a PR in MSBuild so I'm not familiar with the process. Mihai created an exp/* branch for me here and it triggered an VS insertion and that passed. Is that RPS or do we need to run something else for it?
And I do think we own the package as shown here. The package is owned by Microsoft and dotnetframework.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great! That is what I was thinking of with RPS. It failed symbol check, but I'm assuming that was innocuous.
I should have clarified that I was wondering if MSBuild owns S.C.CM. I hit a problem at one point when MSBuild updated a package that Roslyn owned, and we had mismatching versions with them. I think that sort of problem would have been caught by RPS, so I think this is good? But I don't feel very confident about that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Following up to our convo this morning: I talked to @cdmihai and he's not sure about who owns this package exactly either, but believes it should be fine since it is not referenced in VS's config.corext.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found AssemblyVersions.tt, and it isn't referenced there either.