Making ProjectDependenciesCommandResolver handle msbuild projects as well by using the ProjectFactory and IProject.

Moving the CommandResolution classes that depend on msbuild back into Cli.Utils.

Updating the src projects to a netstandard compatible with Cli.Utils moving to netstandard1.5
This commit is contained in:
Livar Cunha 2016-10-10 17:13:46 -07:00
parent a97d44eded
commit 318c9f3e44
49 changed files with 859 additions and 331 deletions

View file

@ -83,5 +83,36 @@ namespace Microsoft.DotNet.Tests.EndToEnd
.And
.HaveStdOutContaining("Hello Portable World!");;
}
[Fact]
public void ItCanRunAToolThatInvokesADependencyToolInACSProj()
{
var repoDirectoriesProvider = new RepoDirectoriesProvider();
var testAppName = "MSBuildTestAppWithToolInDependencies";
var testInstance = TestAssetsManager
.CreateTestInstance(testAppName);
var testProjectDirectory = testInstance.TestRoot;
new Restore3Command()
.WithWorkingDirectory(testProjectDirectory)
.Execute($"-s {repoDirectoriesProvider.TestPackages}")
.Should()
.Pass();
new Build3Command()
.WithWorkingDirectory(testProjectDirectory)
.Execute()
.Should()
.Pass();
new DotnetCommand()
.WithWorkingDirectory(testProjectDirectory)
.ExecuteWithCapturedOutput("invoke-portable")
.Should()
.Pass()
.And
.HaveStdOutContaining("Hello Portable World!");;
}
}
}

View file

@ -1,7 +1,15 @@
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
"emitEntryPoint": true,
"copyToOutput": {
"include": [
"../../artifacts/*/stage2/sdk/*/.version"
],
"mappings": {
".version": "../../artifacts/*/stage2/sdk/*/.version"
}
}
},
"dependencies": {
"Microsoft.NETCore.App": {

View file

@ -17,7 +17,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
var resolvers = defaultCommandResolver.OrderedCommandResolvers;
resolvers.Should().HaveCount(6);
resolvers.Should().HaveCount(7);
resolvers.Select(r => r.GetType())
.Should()
@ -25,6 +25,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
new []{
typeof(MuxerCommandResolver),
typeof(RootedCommandResolver),
typeof(ProjectToolsCommandResolver),
typeof(AppBaseDllCommandResolver),
typeof(AppBaseCommandResolver),
typeof(PathCommandResolver),

View file

@ -8,6 +8,7 @@ using Microsoft.DotNet.Cli;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.InternalAbstractions;
using Microsoft.DotNet.ProjectModel;
using Microsoft.DotNet.TestFramework;
using Microsoft.DotNet.Tools.Test.Utilities;
using NuGet.Frameworks;
using Xunit;
@ -17,7 +18,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
public class GivenAProjectDependenciesCommandResolver : TestBase
{
private const string TestProjectName = "AppWithDirectDep";
private const string ProjectJsonTestProjectName = "AppWithDirectDep";
[Fact]
public void It_returns_null_when_CommandName_is_null()
@ -62,7 +63,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithLockFiles();
var commandResolverArguments = new CommandResolverArguments()
@ -84,7 +85,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithLockFiles();
var commandResolverArguments = new CommandResolverArguments()
@ -106,7 +107,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithLockFiles();
var commandResolverArguments = new CommandResolverArguments()
@ -128,7 +129,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithBuildArtifacts()
.WithLockFiles();
@ -157,7 +158,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithBuildArtifacts()
.WithLockFiles();
@ -181,7 +182,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithBuildArtifacts()
.WithLockFiles();
@ -205,7 +206,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithLockFiles();
var outputDir = Path.Combine(testInstance.Path, "outdir");
@ -245,7 +246,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithLockFiles();
var buildBasePath = Path.Combine(testInstance.Path, "basedir");
@ -285,7 +286,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance(TestProjectName)
var testInstance = TestAssetsManager.CreateTestInstance(ProjectJsonTestProjectName)
.WithBuildArtifacts()
.WithLockFiles();

View file

@ -0,0 +1,161 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.IO;
using FluentAssertions;
using Microsoft.DotNet.Cli;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.InternalAbstractions;
using Microsoft.DotNet.ProjectModel;
using Microsoft.DotNet.TestFramework;
using Microsoft.DotNet.Tools.Test.Utilities;
using NuGet.Frameworks;
using Xunit;
namespace Microsoft.DotNet.Cli.Utils.Tests
{
public class GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild : TestBase
{
private TestInstance MSBuildTestProjectInstance;
private RepoDirectoriesProvider _repoDirectoriesProvider;
public GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild()
{
MSBuildTestProjectInstance =
TestAssetsManager.CreateTestInstance("MSBuildTestAppWithToolInDependencies");
_repoDirectoriesProvider = new RepoDirectoriesProvider();
new Restore3Command()
.WithWorkingDirectory(MSBuildTestProjectInstance.Path)
.Execute($"-s {_repoDirectoriesProvider.TestPackages}")
.Should()
.Pass();
new Build3Command()
.WithWorkingDirectory(MSBuildTestProjectInstance.Path)
.Execute()
.Should()
.Pass();
Environment.SetEnvironmentVariable(
Constants.MSBUILD_EXE_PATH,
Path.Combine(_repoDirectoriesProvider.Stage2Sdk, "msbuild.exe"));
}
[Fact]
public void It_returns_a_CommandSpec_with_Dotnet_as_FileName_and_CommandName_in_Args_when_CommandName_exists_in_MSBuild_ProjectDependencies()
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var commandResolverArguments = new CommandResolverArguments()
{
CommandName = "dotnet-portable",
CommandArguments = null,
ProjectDirectory = MSBuildTestProjectInstance.Path,
Configuration = "Debug",
Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10
};
var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
result.Should().NotBeNull();
var commandFile = Path.GetFileNameWithoutExtension(result.Path);
commandFile.Should().Be("dotnet");
result.Args.Should().Contain(commandResolverArguments.CommandName);
}
[Fact]
public void It_passes_depsfile_arg_to_host_when_returning_a_CommandSpec_for_MSBuild_project()
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var commandResolverArguments = new CommandResolverArguments()
{
CommandName = "dotnet-portable",
CommandArguments = null,
ProjectDirectory = MSBuildTestProjectInstance.Path,
Configuration = "Debug",
Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10
};
var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
result.Should().NotBeNull();
result.Args.Should().Contain("--depsfile");
}
[Fact]
public void It_returns_null_when_CommandName_does_not_exist_in_ProjectDependencies_for_MSBuild_project()
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var commandResolverArguments = new CommandResolverArguments()
{
CommandName = "nonexistent-command",
CommandArguments = null,
ProjectDirectory = MSBuildTestProjectInstance.Path,
Configuration = "Debug",
Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10
};
var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
result.Should().BeNull();
}
[Fact]
public void It_sets_depsfile_in_output_path_in_commandspec_for_MSBuild_project()
{
var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver();
var testInstance = TestAssetsManager.CreateTestInstance("MSBuildTestAppWithToolInDependencies");
var outputDir = Path.Combine(testInstance.Path, "outdir");
var commandResolverArguments = new CommandResolverArguments()
{
CommandName = "dotnet-portable",
CommandArguments = null,
ProjectDirectory = testInstance.Path,
Configuration = "Debug",
Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10,
OutputPath = outputDir
};
new Restore3Command()
.WithWorkingDirectory(testInstance.Path)
.Execute($"-s {_repoDirectoriesProvider.TestPackages}")
.Should()
.Pass();
new Build3Command()
.WithWorkingDirectory(testInstance.Path)
.Execute($"-o {outputDir}")
.Should()
.Pass();
var result = projectDependenciesCommandResolver.Resolve(commandResolverArguments);
var depsFilePath = Path.Combine(outputDir, "MSBuildTestAppWithToolInDependencies.deps.json");
result.Should().NotBeNull();
result.Args.Should().Contain($"--depsfile {depsFilePath}");
}
private ProjectDependenciesCommandResolver SetupProjectDependenciesCommandResolver(
IEnvironmentProvider environment = null,
IPackagedCommandSpecFactory packagedCommandSpecFactory = null)
{
environment = environment ?? new EnvironmentProvider();
packagedCommandSpecFactory = packagedCommandSpecFactory ?? new PackagedCommandSpecFactory();
var projectDependenciesCommandResolver = new ProjectDependenciesCommandResolver(environment, packagedCommandSpecFactory);
return projectDependenciesCommandResolver;
}
}
}

View file

@ -4,7 +4,6 @@
using System.IO;
using System.Linq;
using FluentAssertions;
using Microsoft.DotNet.Cli.CommandResolution;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.ProjectModel;
using Microsoft.DotNet.TestFramework;
@ -236,7 +235,7 @@ namespace Microsoft.DotNet.Tests
{
packagedCommandSpecFactory = packagedCommandSpecFactory ?? new PackagedCommandSpecFactory();
var projectToolsCommandResolver = new ProjectToolsCommandResolver(packagedCommandSpecFactory);
var projectToolsCommandResolver = new ProjectToolsCommandResolver(packagedCommandSpecFactory, new EnvironmentProvider());
return projectToolsCommandResolver;
}

View file

@ -46,7 +46,8 @@
"moq.netcore": "4.4.0-beta8",
"xunit": "2.2.0-beta3-build3330",
"dotnet-test-xunit": "1.0.0-rc2-350904-49",
"Microsoft.DotNet.PlatformAbstractions": "1.0.1-beta-000933"
"Microsoft.DotNet.PlatformAbstractions": "1.0.1-beta-000933",
"Microsoft.Build.Runtime": "15.1.316-preview5"
},
"frameworks": {
"netcoreapp1.0": {

View file

@ -0,0 +1,75 @@
using System;
using System.IO;
using System.Linq;
namespace Microsoft.DotNet.Tools.Test.Utilities
{
public class RepoDirectoriesProvider
{
private static string s_repoRoot;
private string _artifacts;
private string _builtDotnet;
private string _nugetPackages;
private string _corehostPackages;
private string _corehostDummyPackages;
private string _stage2Sdk;
private string _testPackages;
public static string RepoRoot
{
get
{
if (!string.IsNullOrEmpty(s_repoRoot))
{
return s_repoRoot;
}
#if NET451
string directory = AppDomain.CurrentDomain.BaseDirectory;
#else
string directory = AppContext.BaseDirectory;
#endif
while (!Directory.Exists(Path.Combine(directory, ".git")) && directory != null)
{
directory = Directory.GetParent(directory).FullName;
}
if (directory == null)
{
throw new Exception("Cannot find the git repository root");
}
s_repoRoot = directory;
return s_repoRoot;
}
}
public string Artifacts => _artifacts;
public string BuiltDotnet => _builtDotnet;
public string NugetPackages => _nugetPackages;
public string CorehostPackages => _corehostPackages;
public string CorehostDummyPackages => _corehostDummyPackages;
public string Stage2Sdk => _stage2Sdk;
public string TestPackages => _testPackages;
public RepoDirectoriesProvider(
string artifacts = null,
string builtDotnet = null,
string nugetPackages = null,
string corehostPackages = null,
string corehostDummyPackages = null)
{
var currentRid = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier();
_artifacts = artifacts ?? Path.Combine(RepoRoot, "artifacts", currentRid);
_nugetPackages = nugetPackages ?? Path.Combine(RepoRoot, ".nuget", "packages");
_corehostPackages = corehostPackages ?? Path.Combine(_artifacts, "corehost");
_corehostDummyPackages = corehostDummyPackages ?? Path.Combine(_artifacts, "corehostdummypackages");
_builtDotnet = builtDotnet ?? Path.Combine(_artifacts, "intermediate", "sharedFrameworkPublish");
_stage2Sdk = Directory.EnumerateDirectories(Path.Combine(_artifacts, "stage2", "sdk")).First();
_testPackages = Path.Combine(_artifacts, "tests", "packages");
}
}
}

View file

@ -22,35 +22,13 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
protected const string DefaultLibraryFramework = "netstandard1.5";
private TempRoot _temp;
private static TestAssetsManager s_testsAssetsMgr;
private static string s_repoRoot;
protected static string RepoRoot
{
get
{
if (!string.IsNullOrEmpty(s_repoRoot))
{
return s_repoRoot;
}
#if NET451
string directory = AppDomain.CurrentDomain.BaseDirectory;
#else
string directory = AppContext.BaseDirectory;
#endif
while (!Directory.Exists(Path.Combine(directory, ".git")) && directory != null)
{
directory = Directory.GetParent(directory).FullName;
}
if (directory == null)
{
throw new Exception("Cannot find the git repository root");
}
s_repoRoot = directory;
return s_repoRoot;
return RepoDirectoriesProvider.RepoRoot;
}
}

View file

@ -36,13 +36,6 @@
"System.Runtime.Serialization.Primitives": "4.1.1-rc2-24022",
"System.Collections.Immutable": "1.2.0-rc2-24022",
"System.Net.NetworkInformation": "4.1.0-rc2-24022"
},
"net46": {
"frameworkAssemblies": {
"System.Runtime": {
"type": "build"
}
}
}
}
}

View file

@ -8,7 +8,6 @@ using System.IO;
using System.Linq;
using System.Xml.Linq;
using FluentAssertions;
using Microsoft.DotNet.Tools.Test.Utilities;
using Xunit;
namespace Microsoft.DotNet.Tests

View file

@ -4,7 +4,6 @@
using System.IO;
using Microsoft.DotNet.InternalAbstractions;
using Microsoft.DotNet.TestFramework;
using Microsoft.DotNet.Tools.Test.Utilities;
namespace Microsoft.DotNet.Tests
{

View file

@ -3,10 +3,7 @@
"dependencies": {
"xunit": "2.2.0-beta3-build3330",
"dotnet-test-xunit": "1.0.0-rc2-350904-49",
"Microsoft.NETCore.Platforms": "1.0.1",
"Microsoft.DotNet.Tools.Tests.Utilities": {
"target": "project"
}
"Microsoft.NETCore.Platforms": "1.0.1"
},
"frameworks": {
"net46": {

View file

@ -1,39 +0,0 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Linq;
using FluentAssertions;
using Microsoft.DotNet.Cli.CommandResolution;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.Tools.Test.Utilities;
using Xunit;
namespace Microsoft.DotNet.Tests
{
public class GivenAProjectToolsCommandResolverPolicy
{
[Fact]
public void It_contains_resolvers_in_the_right_order()
{
var projectToolsCommandResolverPolicy = new ProjectToolsCommandResolverPolicy();
var defaultCommandResolver = projectToolsCommandResolverPolicy.CreateCommandResolver();
var resolvers = defaultCommandResolver.OrderedCommandResolvers;
resolvers.Should().HaveCount(7);
resolvers.Select(r => r.GetType())
.Should()
.ContainInOrder(
new []{
typeof(MuxerCommandResolver),
typeof(RootedCommandResolver),
typeof(AppBaseDllCommandResolver),
typeof(AppBaseCommandResolver),
typeof(PathCommandResolver),
typeof(PublishedPathCommandResolver),
typeof(ProjectToolsCommandResolver)
});
}
}
}