From 318c9f3e449c606fa7ae800bc3f12e41d66ade96 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Mon, 10 Oct 2016 17:13:46 -0700 Subject: [PATCH 01/11] 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 --- .../dotnet-invoke-portable/Program.cs | 27 +++ .../dotnet-invoke-portable/project.json | 22 +++ ...SBuildTestAppWithToolInDependencies.csproj | 36 ++++ .../Program.cs | 12 ++ build/test/TestPackageProjects.targets | 17 +- src/Microsoft.DotNet.Cli.Utils/Command.cs | 5 + .../DefaultCommandResolverPolicy.cs | 4 +- .../CommandResolution/DepsJsonBuilder.cs | 2 +- .../CommandResolution/IProject.cs | 8 +- .../LockFileTargetExtensions.cs | 2 +- .../CommandResolution/MSBuildProject.cs | 125 ++++++++++++++ .../CommandResolution/NuGetUtils.cs | 2 +- .../ProjectDependenciesCommandResolver.cs | 61 +++---- .../CommandResolution/ProjectFactory.cs | 92 ++++++++++ .../CommandResolution/ProjectJsonProject.cs | 110 ++++++++++++ .../ProjectToolsCommandResolver.cs | 59 ++++--- .../CommandResolution/ResourceAssemblyInfo.cs | 2 +- .../CommandResolution/SingleProjectInfo.cs | 2 +- src/Microsoft.DotNet.Cli.Utils/CommandSpec.cs | 19 ++- src/Microsoft.DotNet.Cli.Utils/Constants.cs | 1 + .../EnvironmentProvider.cs | 5 + .../IEnvironmentProvider.cs | 2 + src/Microsoft.DotNet.Cli.Utils/project.json | 16 +- .../project.json | 2 +- src/Microsoft.DotNet.Configurer/project.json | 2 +- src/Microsoft.DotNet.Files/project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../Utilities/VersionUtility.cs | 2 +- .../project.json | 2 +- .../CommandResolution/MSBuildProject.cs | 48 ------ .../CommandResolution/ProjectFactory.cs | 50 ------ .../CommandResolution/ProjectJsonProject.cs | 37 ---- .../ProjectToolsCommandResolverPolicy.cs | 21 --- src/dotnet/Program.cs | 3 - test/EndToEnd/GivenDotNetUsesMSBuild.cs | 31 ++++ test/EndToEnd/project.json | 10 +- .../GivenADefaultCommandResolver.cs | 3 +- .../GivenAProjectDependencyCommandResolver.cs | 21 +-- ...encyCommandResolverBeingUsedWithMSBuild.cs | 161 ++++++++++++++++++ .../GivenAProjectToolsCommandResolver.cs | 3 +- .../project.json | 3 +- .../RepoDirectoriesProvider.cs | 75 ++++++++ .../TestBase.cs | 26 +-- .../project.json | 7 - .../BindingRedirectTests.cs | 1 - .../TestSetupFixture.cs | 1 - test/binding-redirects.Tests/project.json | 5 +- ...GivenAProjectToolsCommandResolverPolicy.cs | 39 ----- 49 files changed, 859 insertions(+), 331 deletions(-) create mode 100644 TestAssets/TestPackages/dotnet-invoke-portable/Program.cs create mode 100644 TestAssets/TestPackages/dotnet-invoke-portable/project.json create mode 100644 TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj create mode 100644 TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/Program.cs rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/DepsJsonBuilder.cs (99%) rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/IProject.cs (66%) rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/LockFileTargetExtensions.cs (98%) create mode 100644 src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/NuGetUtils.cs (93%) create mode 100644 src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs create mode 100644 src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/ProjectToolsCommandResolver.cs (82%) rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/ResourceAssemblyInfo.cs (90%) rename src/{dotnet => Microsoft.DotNet.Cli.Utils}/CommandResolution/SingleProjectInfo.cs (93%) delete mode 100644 src/dotnet/CommandResolution/MSBuildProject.cs delete mode 100644 src/dotnet/CommandResolution/ProjectFactory.cs delete mode 100644 src/dotnet/CommandResolution/ProjectJsonProject.cs delete mode 100644 src/dotnet/CommandResolution/ProjectToolsCommandResolverPolicy.cs create mode 100644 test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs rename test/{dotnet.Tests => Microsoft.DotNet.Cli.Utils.Tests}/GivenAProjectToolsCommandResolver.cs (99%) create mode 100644 test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs delete mode 100644 test/dotnet.Tests/GivenAProjectToolsCommandResolverPolicy.cs diff --git a/TestAssets/TestPackages/dotnet-invoke-portable/Program.cs b/TestAssets/TestPackages/dotnet-invoke-portable/Program.cs new file mode 100644 index 000000000..1d7be4391 --- /dev/null +++ b/TestAssets/TestPackages/dotnet-invoke-portable/Program.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using Microsoft.DotNet.Cli.Utils; +using NuGet.Frameworks; + +namespace ConsoleApplication +{ + public class Program + { + public static void Main(string[] args) + { + var environment = new EnvironmentProvider(); + var packagedCommandSpecFactory = new PackagedCommandSpecFactory(); + + var projectDependenciesCommandFactory = new ProjectDependenciesCommandFactory( + FrameworkConstants.CommonFrameworks.NetCoreApp10, + "Debug", + null, + null, + Directory.GetCurrentDirectory()); + + var command = projectDependenciesCommandFactory.Create("dotnet-portable", null); + + command.Execute(); + } + } +} diff --git a/TestAssets/TestPackages/dotnet-invoke-portable/project.json b/TestAssets/TestPackages/dotnet-invoke-portable/project.json new file mode 100644 index 000000000..86cada978 --- /dev/null +++ b/TestAssets/TestPackages/dotnet-invoke-portable/project.json @@ -0,0 +1,22 @@ +{ + "version": "1.0.0-rc-*", + "buildOptions": { + "emitEntryPoint": true + }, + "dependencies": { + "Microsoft.DotNet.Cli.Utils": { + "target": "project" + }, + "NuGet.Frameworks": "3.6.0-rc-1954" + }, + "frameworks": { + "netcoreapp1.0": { + "dependencies": { + "Microsoft.NETCore.App": { + "type": "platform", + "version": "1.0.1" + } + } + } + } +} diff --git a/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj new file mode 100644 index 000000000..b6b8a050d --- /dev/null +++ b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj @@ -0,0 +1,36 @@ + + + + + + Exe + netcoreapp1.0 + bin\$(Configuration) + + + + + + + + + 1.0.1 + + + 1.0.0-alpha-20161010-1 + All + + + 1.0.0 + All + + + + + + 1.0.0-rc-* + + + + + \ No newline at end of file diff --git a/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/Program.cs b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/Program.cs new file mode 100644 index 000000000..8dae6dd9e --- /dev/null +++ b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace MSBuildTestApp +{ + public class Program + { + public static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/build/test/TestPackageProjects.targets b/build/test/TestPackageProjects.targets index 4b1e377c5..a0b4fc311 100644 --- a/build/test/TestPackageProjects.targets +++ b/build/test/TestPackageProjects.targets @@ -142,6 +142,15 @@ True netcoreapp1.0 + + dotnet-invoke-portable + True + True + 1.0.0-rc- + $(TestPackageBuildVersionSuffix) + True + netcoreapp1.0 + dotnet-tool-with-output-name ToolWithOutputName @@ -159,7 +168,7 @@ 1.0.0-preview3- $(TestPackageBuildVersionSuffix) False - netstandard1.3 + netstandard1.5 Microsoft.DotNet.ProjectModel @@ -186,7 +195,7 @@ 1.0.0-preview3- $(TestPackageBuildVersionSuffix) False - netstandard1.3 + netstandard1.5 Microsoft.DotNet.InternalAbstractions @@ -213,7 +222,7 @@ 1.0.0-preview3- $(TestPackageBuildVersionSuffix) False - netstandard1.3 + netstandard1.5 Microsoft.DotNet.Files @@ -222,7 +231,7 @@ 1.0.0-preview3- $(TestPackageBuildVersionSuffix) False - netstandard1.3 + netstandard1.5 diff --git a/src/Microsoft.DotNet.Cli.Utils/Command.cs b/src/Microsoft.DotNet.Cli.Utils/Command.cs index 1024efdb6..6b461e22d 100644 --- a/src/Microsoft.DotNet.Cli.Utils/Command.cs +++ b/src/Microsoft.DotNet.Cli.Utils/Command.cs @@ -29,6 +29,11 @@ namespace Microsoft.DotNet.Cli.Utils UseShellExecute = false }; + foreach(var environmentVariable in commandSpec.EnvironmentVariables) + { + psi.Environment.Add(environmentVariable); + } + _process = new Process { StartInfo = psi diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/DefaultCommandResolverPolicy.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/DefaultCommandResolverPolicy.cs index 689835f7c..ddc3b0a66 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/DefaultCommandResolverPolicy.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/DefaultCommandResolverPolicy.cs @@ -42,13 +42,15 @@ namespace Microsoft.DotNet.Cli.Utils compositeCommandResolver.AddCommandResolver(new MuxerCommandResolver()); compositeCommandResolver.AddCommandResolver(new RootedCommandResolver()); + compositeCommandResolver.AddCommandResolver( + new ProjectToolsCommandResolver(packagedCommandSpecFactory, environment)); compositeCommandResolver.AddCommandResolver(new AppBaseDllCommandResolver()); compositeCommandResolver.AddCommandResolver( new AppBaseCommandResolver(environment, platformCommandSpecFactory)); compositeCommandResolver.AddCommandResolver( new PathCommandResolver(environment, platformCommandSpecFactory)); compositeCommandResolver.AddCommandResolver( - new PublishedPathCommandResolver(environment, publishedPathCommandSpecFactory)); + new PublishedPathCommandResolver(environment, publishedPathCommandSpecFactory)); return compositeCommandResolver; } diff --git a/src/dotnet/CommandResolution/DepsJsonBuilder.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/DepsJsonBuilder.cs similarity index 99% rename from src/dotnet/CommandResolution/DepsJsonBuilder.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/DepsJsonBuilder.cs index 89cfea873..4de9841d5 100644 --- a/src/dotnet/CommandResolution/DepsJsonBuilder.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/DepsJsonBuilder.cs @@ -12,7 +12,7 @@ using NuGet.Packaging; using NuGet.Packaging.Core; using NuGet.ProjectModel; -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { internal class DepsJsonBuilder { diff --git a/src/dotnet/CommandResolution/IProject.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/IProject.cs similarity index 66% rename from src/dotnet/CommandResolution/IProject.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/IProject.cs index 3af564385..640681c18 100644 --- a/src/dotnet/CommandResolution/IProject.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/IProject.cs @@ -4,12 +4,18 @@ using System.Collections.Generic; using NuGet.ProjectModel; -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { internal interface IProject { LockFile GetLockFile(); IEnumerable GetTools(); + + string DepsJsonPath { get; } + + string RuntimeConfigJsonPath { get; } + + Dictionary EnvironmentVariables { get; } } } \ No newline at end of file diff --git a/src/dotnet/CommandResolution/LockFileTargetExtensions.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/LockFileTargetExtensions.cs similarity index 98% rename from src/dotnet/CommandResolution/LockFileTargetExtensions.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/LockFileTargetExtensions.cs index d627021a7..9bb86d314 100644 --- a/src/dotnet/CommandResolution/LockFileTargetExtensions.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/LockFileTargetExtensions.cs @@ -7,7 +7,7 @@ using System.Linq; using NuGet.Packaging.Core; using NuGet.ProjectModel; -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { internal static class LockFileTargetExtensions { diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs new file mode 100644 index 000000000..99054b49c --- /dev/null +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs @@ -0,0 +1,125 @@ +// 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.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.Build.Evaluation; +using NuGet.Frameworks; +using NuGet.ProjectModel; + +namespace Microsoft.DotNet.Cli.Utils +{ + internal class MSBuildProject : IProject + { + private Project _project; + + private string _msBuildExePath; + + public string DepsJsonPath + { + get + { + return _project + .AllEvaluatedProperties + .FirstOrDefault(p => p.Name.Equals("_ProjectDepsFilePath")) + .EvaluatedValue; + } + } + + public string RuntimeConfigJsonPath + { + get + { + return _project + .AllEvaluatedProperties + .FirstOrDefault(p => p.Name.Equals("_ProjectRuntimeConfigFilePath")) + .EvaluatedValue; + } + } + + public Dictionary EnvironmentVariables + { + get + { + return new Dictionary + { + { Constants.MSBUILD_EXE_PATH, _msBuildExePath } + }; + } + } + + public MSBuildProject( + string msBuildProjectPath, + NuGetFramework framework, + string configuration, + string outputPath, + string msBuildExePath) + { + var globalProperties = new Dictionary() + { + { "MSBuildExtensionsPath", Path.GetDirectoryName(msBuildExePath) } + }; + + if(framework != null) + { + globalProperties.Add("TargetFramework", framework.GetShortFolderName()); + } + + if(outputPath != null) + { + globalProperties.Add("OutputPath", outputPath); + } + + if(configuration != null) + { + globalProperties.Add("Configuration", configuration); + } + + _project = ProjectCollection.GlobalProjectCollection.LoadedProjects.FirstOrDefault(p => + p.FullPath == msBuildProjectPath); + + _project = _project ?? new Project(msBuildProjectPath, globalProperties, null); + + _msBuildExePath = msBuildExePath; + } + + public IEnumerable GetTools() + { + var toolsReferences = _project.AllEvaluatedItems.Where(i => i.ItemType.Equals("DotNetCliToolReference")); + var tools = toolsReferences.Select(t => new SingleProjectInfo( + t.EvaluatedInclude, + t.GetMetadataValue("Version"), + Enumerable.Empty())); + + return tools; + } + + public LockFile GetLockFile() + { + var lockFilePath = GetLockFilePathFromProjectLockFileProperty() ?? + GetLockFilePathFromIntermediateBaseOutputPath(); + + return new LockFileFormat().Read(lockFilePath); + } + + private string GetLockFilePathFromProjectLockFileProperty() + { + return _project + .AllEvaluatedProperties + .Where(p => p.Name.Equals("ProjectLockFile")) + .Select(p => p.EvaluatedValue) + .FirstOrDefault(p => File.Exists(p)); + } + + private string GetLockFilePathFromIntermediateBaseOutputPath() + { + var intermediateOutputPath = _project + .AllEvaluatedProperties + .FirstOrDefault(p => p.Name.Equals("BaseIntermediateOutputPath")) + .EvaluatedValue; + return Path.Combine(intermediateOutputPath, "project.assets.json"); + } + } +} \ No newline at end of file diff --git a/src/dotnet/CommandResolution/NuGetUtils.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/NuGetUtils.cs similarity index 93% rename from src/dotnet/CommandResolution/NuGetUtils.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/NuGetUtils.cs index 6e5821451..2c569a8ab 100644 --- a/src/dotnet/CommandResolution/NuGetUtils.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/NuGetUtils.cs @@ -8,7 +8,7 @@ using System.Linq; using NuGet.Packaging.Core; using NuGet.ProjectModel; -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { internal static class NuGetUtils { diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs index 9fa5f7cd7..c3d713147 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; +using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.InternalAbstractions; using Microsoft.DotNet.ProjectModel; using Microsoft.DotNet.Tools.Common; @@ -67,37 +68,41 @@ namespace Microsoft.DotNet.Cli.Utils { var allowedExtensions = GetAllowedCommandExtensionsFromEnvironment(_environment); - var projectContext = GetProjectContextFromDirectory( + var projectFactory = new ProjectFactory(_environment); + var project = projectFactory.GetProject( projectDirectory, - framework); + framework, + configuration, + buildBasePath, + outputPath); - if (projectContext == null) + if (project == null) { return null; } - var depsFilePath = - projectContext.GetOutputPaths(configuration, buildBasePath, outputPath).RuntimeFiles.DepsJson; + var depsFilePath = project.DepsJsonPath; - if (! File.Exists(depsFilePath)) + if (!File.Exists(depsFilePath)) { Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: {depsFilePath} does not exist"); return null; } - var runtimeConfigPath = - projectContext.GetOutputPaths(configuration, buildBasePath, outputPath).RuntimeFiles.RuntimeConfigJson; + var runtimeConfigPath = project.RuntimeConfigJsonPath; - if (! File.Exists(runtimeConfigPath)) + if (!File.Exists(runtimeConfigPath)) { Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: {runtimeConfigPath} does not exist"); return null; } - var toolLibrary = GetToolLibraryForContext(projectContext, commandName); - var normalizedNugetPackagesRoot = PathUtility.EnsureNoTrailingDirectorySeparator(projectContext.PackagesDirectory); + var lockFile = project.GetLockFile(); + var toolLibrary = GetToolLibraryForContext(lockFile, commandName, framework); + var normalizedNugetPackagesRoot = + PathUtility.EnsureNoTrailingDirectorySeparator(lockFile.PackageFolders.First().Path); - return _packagedCommandSpecFactory.CreateCommandSpecFromLibrary( + var commandSpec = _packagedCommandSpecFactory.CreateCommandSpecFromLibrary( toolLibrary, commandName, commandArguments, @@ -106,14 +111,18 @@ namespace Microsoft.DotNet.Cli.Utils s_commandResolutionStrategy, depsFilePath, runtimeConfigPath); + + commandSpec?.AddEnvironmentVariablesFromProject(project); + + return commandSpec; } private LockFileTargetLibrary GetToolLibraryForContext( - ProjectContext projectContext, string commandName) + LockFile lockFile, string commandName, NuGetFramework targetFramework) { - var toolLibraries = projectContext.LockFile.Targets + var toolLibraries = lockFile.Targets .FirstOrDefault(t => t.TargetFramework.GetShortFolderName() - .Equals(projectContext.TargetFramework.GetShortFolderName())) + .Equals(targetFramework.GetShortFolderName())) ?.Libraries.Where(l => l.Name == commandName || l.RuntimeAssemblies.Any(r => Path.GetFileNameWithoutExtension(r.Path) == commandName)).ToList(); @@ -125,26 +134,6 @@ namespace Microsoft.DotNet.Cli.Utils return toolLibraries?.FirstOrDefault(); } - private ProjectContext GetProjectContextFromDirectory(string directory, NuGetFramework framework) - { - if (directory == null || framework == null) - { - return null; - } - - var projectRootPath = directory; - - if (!File.Exists(Path.Combine(projectRootPath, Project.FileName))) - { - return null; - } - - return ProjectContext.Create( - projectRootPath, - framework, - RuntimeEnvironmentRidExtensions.GetAllCandidateRuntimeIdentifiers()); - } - private IEnumerable GetAllowedCommandExtensionsFromEnvironment(IEnvironmentProvider environment) { var allowedCommandExtensions = new List(); diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs new file mode 100644 index 000000000..aa46a2e8b --- /dev/null +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs @@ -0,0 +1,92 @@ +// 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.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.Build.Exceptions; +using Microsoft.DotNet.ProjectModel; +using NuGet.Frameworks; + +namespace Microsoft.DotNet.Cli.Utils +{ + internal class ProjectFactory + { + private IEnvironmentProvider _environment; + + public ProjectFactory(IEnvironmentProvider environment) + { + _environment = environment; + } + + public IProject GetProject( + string projectDirectory, + NuGetFramework framework, + string configuration, + string buildBasePath, + string outputPath) + { + return GetMSBuildProj(projectDirectory, framework, configuration, outputPath) ?? + GetProjectJsonProject(projectDirectory, framework, configuration, buildBasePath, outputPath); + } + + private IProject GetMSBuildProj(string projectDirectory, NuGetFramework framework, string configuration, string outputPath) + { + var msBuildExePath = _environment.GetEnvironmentVariable(Constants.MSBUILD_EXE_PATH); + msBuildExePath = string.IsNullOrEmpty(msBuildExePath) ? + Path.Combine(AppContext.BaseDirectory, "msbuild.exe") : + msBuildExePath; + + string msBuildProjectPath = GetMSBuildProjPath(projectDirectory); + if(msBuildProjectPath == null) + { + return null; + } + + try + { + return new MSBuildProject(msBuildProjectPath, framework, configuration, outputPath, msBuildExePath); + } + catch (InvalidProjectFileException ex) + { + Reporter.Verbose.WriteLine(ex.ToString().Red()); + return null; + } + } + + private IProject GetProjectJsonProject( + string projectDirectory, + NuGetFramework framework, + string configuration, + string buildBasePath, + string outputPath) + { + if (!File.Exists(Path.Combine(projectDirectory, Project.FileName))) + { + return null; + } + + return new ProjectJsonProject(projectDirectory, framework, configuration, buildBasePath, outputPath); + } + + private string GetMSBuildProjPath(string projectDirectory) + { + IEnumerable projectFiles = Directory + .GetFiles(projectDirectory, "*.*proj") + .Where(d => !d.EndsWith(".xproj")); + + if (projectFiles.Count() == 0) + { + return null; + } + else if (projectFiles.Count() > 1) + { + throw new InvalidOperationException( + $"Specify which project file to use because this '{projectDirectory}' contains more than one project file."); + } + + return projectFiles.First(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs new file mode 100644 index 000000000..410e52c40 --- /dev/null +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs @@ -0,0 +1,110 @@ +// 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.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.InternalAbstractions; +using Microsoft.DotNet.ProjectModel; +using NuGet.Frameworks; +using NuGet.ProjectModel; + +namespace Microsoft.DotNet.Cli.Utils +{ + internal class ProjectJsonProject : IProject + { + private LockFile _lockFile; + + private ProjectContext _projectContext; + + private string _projectDirectory; + + private string _configuration; + + private string _outputPath; + + private string _buildBasePath; + + private NuGetFramework _framework; + + private ProjectContext ProjectContext + { + get + { + if(_projectContext == null) + { + _projectContext = ProjectContext.Create( + _projectDirectory, + _framework, + DotnetRuntimeIdentifiers.InferCurrentRuntimeIdentifiers(DotnetFiles.VersionFileObject)); + } + + return _projectContext; + } + } + + public string DepsJsonPath + { + get + { + return ProjectContext.GetOutputPaths( + _configuration, + _buildBasePath, + _outputPath).RuntimeFiles.DepsJson; + } + } + + public string RuntimeConfigJsonPath + { + get + { + return ProjectContext.GetOutputPaths( + _configuration, + _buildBasePath, + _outputPath).RuntimeFiles.RuntimeConfigJson; + } + } + + public Dictionary EnvironmentVariables + { + get + { + return new Dictionary(); + } + } + + public ProjectJsonProject( + string projectDirectory, + NuGetFramework framework, + string configuration, + string buildBasePath, + string outputPath) + { + var lockFilePath = Path.Combine(projectDirectory, LockFileFormat.LockFileName); + _lockFile = new LockFileFormat().Read(lockFilePath); + + _projectDirectory = projectDirectory; + _framework = framework; + _configuration = configuration; + _buildBasePath = buildBasePath; + _outputPath = outputPath; + } + + public LockFile GetLockFile() + { + return _lockFile; + } + + public IEnumerable GetTools() + { + var tools = _lockFile.Tools.Where(t => t.Name.Contains(".NETCoreApp")).SelectMany(t => t.Libraries); + + return tools.Select(t => new SingleProjectInfo( + t.Name, + t.Version.ToFullString(), + Enumerable.Empty())); + } + } +} \ No newline at end of file diff --git a/src/dotnet/CommandResolution/ProjectToolsCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs similarity index 82% rename from src/dotnet/CommandResolution/ProjectToolsCommandResolver.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs index 3517a11e7..fce36d55e 100644 --- a/src/dotnet/CommandResolution/ProjectToolsCommandResolver.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs @@ -5,8 +5,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using Microsoft.DotNet.Cli.Utils; -using Microsoft.DotNet.InternalAbstractions; using Microsoft.DotNet.ProjectModel; using Microsoft.DotNet.Tools.Common; using Microsoft.Extensions.DependencyModel; @@ -15,7 +13,7 @@ using NuGet.ProjectModel; using NuGet.Versioning; using FileFormatException = Microsoft.DotNet.ProjectModel.FileFormatException; -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { public class ProjectToolsCommandResolver : ICommandResolver { @@ -27,9 +25,14 @@ namespace Microsoft.DotNet.Cli.CommandResolution private List _allowedCommandExtensions; private IPackagedCommandSpecFactory _packagedCommandSpecFactory; - public ProjectToolsCommandResolver(IPackagedCommandSpecFactory packagedCommandSpecFactory) + private IEnvironmentProvider _environment; + + public ProjectToolsCommandResolver( + IPackagedCommandSpecFactory packagedCommandSpecFactory, + IEnvironmentProvider environment) { _packagedCommandSpecFactory = packagedCommandSpecFactory; + _environment = environment; _allowedCommandExtensions = new List() { @@ -45,37 +48,43 @@ namespace Microsoft.DotNet.Cli.CommandResolution return null; } - return ResolveFromProjectTools( - commandResolverArguments.CommandName, - commandResolverArguments.CommandArguments.OrEmptyIfNull(), - commandResolverArguments.ProjectDirectory); + return ResolveFromProjectTools(commandResolverArguments); } - private CommandSpec ResolveFromProjectTools( - string commandName, - IEnumerable args, - string projectDirectory) + private CommandSpec ResolveFromProjectTools(CommandResolverArguments commandResolverArguments) { - var projectFactory = new ProjectFactory(); - var project = projectFactory.GetProject(projectDirectory); + var projectFactory = new ProjectFactory(_environment); + var project = projectFactory.GetProject( + commandResolverArguments.ProjectDirectory, + commandResolverArguments.Framework, + commandResolverArguments.Configuration, + commandResolverArguments.BuildBasePath, + commandResolverArguments.OutputPath); var tools = project.GetTools(); return ResolveCommandSpecFromAllToolLibraries( tools, - commandName, - args, - project.GetLockFile()); + commandResolverArguments.CommandName, + commandResolverArguments.CommandArguments.OrEmptyIfNull(), + project.GetLockFile(), + project); } private CommandSpec ResolveCommandSpecFromAllToolLibraries( IEnumerable toolsLibraries, string commandName, IEnumerable args, - LockFile lockFile) + LockFile lockFile, + IProject project) { foreach (var toolLibrary in toolsLibraries) { - var commandSpec = ResolveCommandSpecFromToolLibrary(toolLibrary, commandName, args, lockFile); + var commandSpec = ResolveCommandSpecFromToolLibrary( + toolLibrary, + commandName, + args, + lockFile, + project); if (commandSpec != null) { @@ -90,7 +99,8 @@ namespace Microsoft.DotNet.Cli.CommandResolution SingleProjectInfo toolLibraryRange, string commandName, IEnumerable args, - LockFile lockFile) + LockFile lockFile, + IProject project) { var nugetPackagesRoot = lockFile.PackageFolders.First().Path; @@ -111,7 +121,7 @@ namespace Microsoft.DotNet.Cli.CommandResolution var normalizedNugetPackagesRoot = PathUtility.EnsureNoTrailingDirectorySeparator(nugetPackagesRoot); - return _packagedCommandSpecFactory.CreateCommandSpecFromLibrary( + var commandSpec = _packagedCommandSpecFactory.CreateCommandSpecFromLibrary( toolLibrary, commandName, args, @@ -120,6 +130,10 @@ namespace Microsoft.DotNet.Cli.CommandResolution s_commandResolutionStrategy, depsFilePath, null); + + commandSpec?.AddEnvironmentVariablesFromProject(project); + + return commandSpec; } private LockFile GetToolLockFile( @@ -155,7 +169,7 @@ namespace Microsoft.DotNet.Cli.CommandResolution return toolPathCalculator.GetBestLockFilePath( toolLibrary.Name, - new VersionRange(new NuGetVersion(toolLibrary.Version)), + VersionRange.Parse(toolLibrary.Version), s_toolPackageFramework); } @@ -184,7 +198,6 @@ namespace Microsoft.DotNet.Cli.CommandResolution } } - // Need to unit test this, so public internal void GenerateDepsJsonFile( LockFile toolLockFile, string depsPath, diff --git a/src/dotnet/CommandResolution/ResourceAssemblyInfo.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ResourceAssemblyInfo.cs similarity index 90% rename from src/dotnet/CommandResolution/ResourceAssemblyInfo.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/ResourceAssemblyInfo.cs index c69b0a037..80346aae2 100644 --- a/src/dotnet/CommandResolution/ResourceAssemblyInfo.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ResourceAssemblyInfo.cs @@ -1,7 +1,7 @@ // 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. -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { internal class ResourceAssemblyInfo { diff --git a/src/dotnet/CommandResolution/SingleProjectInfo.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/SingleProjectInfo.cs similarity index 93% rename from src/dotnet/CommandResolution/SingleProjectInfo.cs rename to src/Microsoft.DotNet.Cli.Utils/CommandResolution/SingleProjectInfo.cs index 917680abb..fa15442d6 100644 --- a/src/dotnet/CommandResolution/SingleProjectInfo.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/SingleProjectInfo.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.DotNet.Cli.CommandResolution +namespace Microsoft.DotNet.Cli.Utils { internal class SingleProjectInfo { diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandSpec.cs b/src/Microsoft.DotNet.Cli.Utils/CommandSpec.cs index 5b941515c..bf7d7fb3b 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandSpec.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandSpec.cs @@ -1,18 +1,35 @@ +using System.Collections.Generic; + namespace Microsoft.DotNet.Cli.Utils { public class CommandSpec { - public CommandSpec(string path, string args, CommandResolutionStrategy resolutionStrategy) + public CommandSpec( + string path, + string args, + CommandResolutionStrategy resolutionStrategy, + Dictionary environmentVariables = null) { Path = path; Args = args; ResolutionStrategy = resolutionStrategy; + EnvironmentVariables = environmentVariables ?? new Dictionary(); } public string Path { get; } public string Args { get; } + public Dictionary EnvironmentVariables { get; } + public CommandResolutionStrategy ResolutionStrategy { get; } + + internal void AddEnvironmentVariablesFromProject(IProject project) + { + foreach (var environmentVariable in project.EnvironmentVariables) + { + EnvironmentVariables.Add(environmentVariable.Key, environmentVariable.Value); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.DotNet.Cli.Utils/Constants.cs b/src/Microsoft.DotNet.Cli.Utils/Constants.cs index e3f6c195a..444693f8f 100644 --- a/src/Microsoft.DotNet.Cli.Utils/Constants.cs +++ b/src/Microsoft.DotNet.Cli.Utils/Constants.cs @@ -47,5 +47,6 @@ namespace Microsoft.DotNet.Cli.Utils "libcoreclr.dylib" }; + public static readonly string MSBUILD_EXE_PATH = "MSBUILD_EXE_PATH"; } } diff --git a/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs b/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs index e3f0ba663..2280f8e8b 100644 --- a/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs +++ b/src/Microsoft.DotNet.Cli.Utils/EnvironmentProvider.cs @@ -93,6 +93,11 @@ namespace Microsoft.DotNet.Cli.Utils return GetCommandPathFromRootPath(rootPath, commandName, extensionsArr); } + public string GetEnvironmentVariable(string name) + { + return Environment.GetEnvironmentVariable(name); + } + public bool GetEnvironmentVariableAsBool(string name, bool defaultValue) { var str = Environment.GetEnvironmentVariable(name); diff --git a/src/Microsoft.DotNet.Cli.Utils/IEnvironmentProvider.cs b/src/Microsoft.DotNet.Cli.Utils/IEnvironmentProvider.cs index e9cc613c7..25124153e 100644 --- a/src/Microsoft.DotNet.Cli.Utils/IEnvironmentProvider.cs +++ b/src/Microsoft.DotNet.Cli.Utils/IEnvironmentProvider.cs @@ -13,5 +13,7 @@ namespace Microsoft.DotNet.Cli.Utils string GetCommandPathFromRootPath(string rootPath, string commandName, IEnumerable extensions); bool GetEnvironmentVariableAsBool(string name, bool defaultValue); + + string GetEnvironmentVariable(string name); } } diff --git a/src/Microsoft.DotNet.Cli.Utils/project.json b/src/Microsoft.DotNet.Cli.Utils/project.json index 8f8450bab..df1aa8a4b 100644 --- a/src/Microsoft.DotNet.Cli.Utils/project.json +++ b/src/Microsoft.DotNet.Cli.Utils/project.json @@ -2,20 +2,30 @@ "version": "1.0.0-preview3-*", "buildOptions": { "keyFile": "../../tools/Key.snk", - "warningsAsErrors": true + "warningsAsErrors": true, + "compile": { + "include": [ + "**/*.cs", + "../../src/dotnet/DotnetFiles.cs" + ] + } }, "dependencies": { "Microsoft.DotNet.ProjectModel": { "target": "project" }, "Microsoft.DotNet.PlatformAbstractions": "1.0.1-beta-000933", + "NuGet.Versioning": "3.6.0-rc-1984", "NuGet.Packaging": "3.6.0-rc-1984", "NuGet.Frameworks": "3.6.0-rc-1984", - "NuGet.ProjectModel": "3.6.0-rc-1984" + "NuGet.ProjectModel": "3.6.0-rc-1984", + + "Microsoft.Build": "15.1.316-preview5", + "Microsoft.Build.Utilities.Core": "15.1.316-preview5" }, "frameworks": { - "netstandard1.3": { + "netstandard1.5": { "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50" ], diff --git a/src/Microsoft.DotNet.Compiler.Common/project.json b/src/Microsoft.DotNet.Compiler.Common/project.json index 168364905..c740966e1 100644 --- a/src/Microsoft.DotNet.Compiler.Common/project.json +++ b/src/Microsoft.DotNet.Compiler.Common/project.json @@ -17,7 +17,7 @@ "NuGet.ProjectModel": "3.6.0-rc-1984" }, "frameworks": { - "netstandard1.3": { + "netstandard1.5": { "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50" ] diff --git a/src/Microsoft.DotNet.Configurer/project.json b/src/Microsoft.DotNet.Configurer/project.json index cc3e093c3..2479637f5 100644 --- a/src/Microsoft.DotNet.Configurer/project.json +++ b/src/Microsoft.DotNet.Configurer/project.json @@ -19,7 +19,7 @@ } }, "frameworks": { - "netstandard1.6": { + "netstandard1.5": { "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50" ] diff --git a/src/Microsoft.DotNet.Files/project.json b/src/Microsoft.DotNet.Files/project.json index 11b38863b..a78ab145f 100644 --- a/src/Microsoft.DotNet.Files/project.json +++ b/src/Microsoft.DotNet.Files/project.json @@ -14,7 +14,7 @@ "System.Linq.Expressions": "4.1.0" }, "frameworks": { - "netstandard1.3": { + "netstandard1.5": { "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50" ] diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/project.json b/src/Microsoft.DotNet.ProjectJsonMigration/project.json index 4132eb784..596c51c48 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/project.json +++ b/src/Microsoft.DotNet.ProjectJsonMigration/project.json @@ -14,7 +14,7 @@ "Microsoft.DotNet.ProjectModel": { "target": "project" }, - "Microsoft.Build": "0.1.0-preview-00034-160909" + "Microsoft.Build": "15.1.316-preview5" }, "frameworks": { "netcoreapp1.0": { diff --git a/src/Microsoft.DotNet.ProjectModel.Workspaces/project.json b/src/Microsoft.DotNet.ProjectModel.Workspaces/project.json index f82f0fa23..ef434e125 100644 --- a/src/Microsoft.DotNet.ProjectModel.Workspaces/project.json +++ b/src/Microsoft.DotNet.ProjectModel.Workspaces/project.json @@ -14,7 +14,7 @@ "Microsoft.DotNet.PlatformAbstractions": "1.0.1-beta-000933" }, "frameworks": { - "netstandard1.3": { + "netstandard1.5": { "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50", "portable-net45+win8" diff --git a/src/Microsoft.DotNet.ProjectModel/Utilities/VersionUtility.cs b/src/Microsoft.DotNet.ProjectModel/Utilities/VersionUtility.cs index e64709546..69072d3b3 100644 --- a/src/Microsoft.DotNet.ProjectModel/Utilities/VersionUtility.cs +++ b/src/Microsoft.DotNet.ProjectModel/Utilities/VersionUtility.cs @@ -120,4 +120,4 @@ namespace Microsoft.DotNet.ProjectModel.Utilities return sb.ToString(); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.TestFramework/project.json b/src/Microsoft.DotNet.TestFramework/project.json index be391ed6e..144b0b3a8 100644 --- a/src/Microsoft.DotNet.TestFramework/project.json +++ b/src/Microsoft.DotNet.TestFramework/project.json @@ -10,7 +10,7 @@ } }, "frameworks": { - "netstandard1.3": { + "netstandard1.5": { "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50" ] diff --git a/src/dotnet/CommandResolution/MSBuildProject.cs b/src/dotnet/CommandResolution/MSBuildProject.cs deleted file mode 100644 index 459dc4081..000000000 --- a/src/dotnet/CommandResolution/MSBuildProject.cs +++ /dev/null @@ -1,48 +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; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.Build.Evaluation; -using NuGet.ProjectModel; - -namespace Microsoft.DotNet.Cli.CommandResolution -{ - internal class MSBuildProject : IProject - { - private Project _project; - - public MSBuildProject(string msBuildProjectPath) - { - var globalProperties = new Dictionary() - { - { "MSBuildExtensionsPath", AppContext.BaseDirectory } - }; - - _project = new Project(msBuildProjectPath, globalProperties, null); - } - - public LockFile GetLockFile() - { - var intermediateOutputPath = _project - .AllEvaluatedProperties - .FirstOrDefault(p => p.Name.Equals("BaseIntermediateOutputPath")) - .EvaluatedValue; - var lockFilePath = Path.Combine(intermediateOutputPath, "project.assets.json"); - return new LockFileFormat().Read(lockFilePath); - } - - public IEnumerable GetTools() - { - var toolsReferences = _project.AllEvaluatedItems.Where(i => i.ItemType.Equals("DotNetCliToolReference")); - var tools = toolsReferences.Select(t => new SingleProjectInfo( - t.EvaluatedInclude, - t.GetMetadataValue("Version"), - Enumerable.Empty())); - - return tools; - } - } -} \ No newline at end of file diff --git a/src/dotnet/CommandResolution/ProjectFactory.cs b/src/dotnet/CommandResolution/ProjectFactory.cs deleted file mode 100644 index 4021d042f..000000000 --- a/src/dotnet/CommandResolution/ProjectFactory.cs +++ /dev/null @@ -1,50 +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; -using System.IO; - -namespace Microsoft.DotNet.Cli.CommandResolution -{ - internal class ProjectFactory - { - public IProject GetProject(string projectDirectory) - { - return GetMSBuildProj(projectDirectory) ?? - GetProjectJsonProject(projectDirectory); - } - - private IProject GetMSBuildProj(string projectDirectory) - { - string msBuildProjectPath = GetMSBuildProjPath(projectDirectory); - if(msBuildProjectPath == null) - { - return null; - } - - return new MSBuildProject(msBuildProjectPath); - } - - private IProject GetProjectJsonProject(string projectDirectory) - { - return new ProjectJsonProject(projectDirectory); - } - - private string GetMSBuildProjPath(string projectDirectory) - { - string[] projectFiles = Directory.GetFiles(projectDirectory, "*.*proj"); - - if (projectFiles.Length == 0) - { - return null; - } - else if (projectFiles.Length > 1) - { - throw new InvalidOperationException( - $"Specify which project file to use because this '{projectDirectory}' contains more than one project file."); - } - - return projectFiles[0]; - } - } -} \ No newline at end of file diff --git a/src/dotnet/CommandResolution/ProjectJsonProject.cs b/src/dotnet/CommandResolution/ProjectJsonProject.cs deleted file mode 100644 index 5b97413bc..000000000 --- a/src/dotnet/CommandResolution/ProjectJsonProject.cs +++ /dev/null @@ -1,37 +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; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using NuGet.ProjectModel; - -namespace Microsoft.DotNet.Cli.CommandResolution -{ - internal class ProjectJsonProject : IProject - { - private LockFile _lockFile; - - public ProjectJsonProject(string projectDirectory) - { - var lockFilePath = Path.Combine(projectDirectory, LockFileFormat.LockFileName); - _lockFile = new LockFileFormat().Read(lockFilePath); - } - - public LockFile GetLockFile() - { - return _lockFile; - } - - public IEnumerable GetTools() - { - var tools = _lockFile.Tools.Where(t => t.Name.Contains(".NETCoreApp")).SelectMany(t => t.Libraries); - - return tools.Select(t => new SingleProjectInfo( - t.Name, - t.Version.ToFullString(), - Enumerable.Empty())); - } - } -} \ No newline at end of file diff --git a/src/dotnet/CommandResolution/ProjectToolsCommandResolverPolicy.cs b/src/dotnet/CommandResolution/ProjectToolsCommandResolverPolicy.cs deleted file mode 100644 index 2afef5ffa..000000000 --- a/src/dotnet/CommandResolution/ProjectToolsCommandResolverPolicy.cs +++ /dev/null @@ -1,21 +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 Microsoft.DotNet.Cli.Utils; - -namespace Microsoft.DotNet.Cli.CommandResolution -{ - public class ProjectToolsCommandResolverPolicy : ICommandResolverPolicy - { - public CompositeCommandResolver CreateCommandResolver() - { - var defaultCommandResolverPolicy = new DefaultCommandResolverPolicy(); - var compositeCommandResolver = defaultCommandResolverPolicy.CreateCommandResolver(); - var packagedCommandSpecFactory = new PackagedCommandSpecFactory(); - - compositeCommandResolver.AddCommandResolver(new ProjectToolsCommandResolver(packagedCommandSpecFactory)); - - return compositeCommandResolver; - } - } -} \ No newline at end of file diff --git a/src/dotnet/Program.cs b/src/dotnet/Program.cs index 27582cea7..9117e2fd0 100644 --- a/src/dotnet/Program.cs +++ b/src/dotnet/Program.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; -using Microsoft.DotNet.Cli.CommandResolution; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Configurer; using Microsoft.DotNet.PlatformAbstractions; @@ -193,9 +192,7 @@ namespace Microsoft.DotNet.Cli } else { - var projectToolsCommandResolver = new ProjectToolsCommandResolverPolicy(); CommandResult result = Command.Create( - projectToolsCommandResolver, "dotnet-" + command, appArgs, FrameworkConstants.CommonFrameworks.NetStandardApp15) diff --git a/test/EndToEnd/GivenDotNetUsesMSBuild.cs b/test/EndToEnd/GivenDotNetUsesMSBuild.cs index 393538592..a88e4b0f3 100644 --- a/test/EndToEnd/GivenDotNetUsesMSBuild.cs +++ b/test/EndToEnd/GivenDotNetUsesMSBuild.cs @@ -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!");; + } } } diff --git a/test/EndToEnd/project.json b/test/EndToEnd/project.json index 6fe000820..d11d3d249 100644 --- a/test/EndToEnd/project.json +++ b/test/EndToEnd/project.json @@ -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": { diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenADefaultCommandResolver.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenADefaultCommandResolver.cs index 2a09e9d47..b2e354e30 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenADefaultCommandResolver.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenADefaultCommandResolver.cs @@ -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), diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs index ebf2362f5..8582826bd 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolver.cs @@ -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(); diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs new file mode 100644 index 000000000..eef0b9f76 --- /dev/null +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -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; + } + } +} diff --git a/test/dotnet.Tests/GivenAProjectToolsCommandResolver.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs similarity index 99% rename from test/dotnet.Tests/GivenAProjectToolsCommandResolver.cs rename to test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs index 78fb78c11..bd9cb98cc 100644 --- a/test/dotnet.Tests/GivenAProjectToolsCommandResolver.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectToolsCommandResolver.cs @@ -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; } diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/project.json b/test/Microsoft.DotNet.Cli.Utils.Tests/project.json index 9a96903d8..1ded66215 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/project.json +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/project.json @@ -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": { diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs new file mode 100644 index 000000000..b4b75b8b1 --- /dev/null +++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs @@ -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"); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs index dce3e7e54..bc134816d 100644 --- a/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs +++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/TestBase.cs @@ -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; } } diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json b/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json index 7c562d133..1e6be6860 100644 --- a/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json +++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json @@ -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" - } - } } } } diff --git a/test/binding-redirects.Tests/BindingRedirectTests.cs b/test/binding-redirects.Tests/BindingRedirectTests.cs index 566b48060..e4da31af4 100644 --- a/test/binding-redirects.Tests/BindingRedirectTests.cs +++ b/test/binding-redirects.Tests/BindingRedirectTests.cs @@ -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 diff --git a/test/binding-redirects.Tests/TestSetupFixture.cs b/test/binding-redirects.Tests/TestSetupFixture.cs index e0c29f6e3..b6ac63d99 100644 --- a/test/binding-redirects.Tests/TestSetupFixture.cs +++ b/test/binding-redirects.Tests/TestSetupFixture.cs @@ -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 { diff --git a/test/binding-redirects.Tests/project.json b/test/binding-redirects.Tests/project.json index 4ef020d2b..8603be7a5 100644 --- a/test/binding-redirects.Tests/project.json +++ b/test/binding-redirects.Tests/project.json @@ -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": { diff --git a/test/dotnet.Tests/GivenAProjectToolsCommandResolverPolicy.cs b/test/dotnet.Tests/GivenAProjectToolsCommandResolverPolicy.cs deleted file mode 100644 index 915be7f2f..000000000 --- a/test/dotnet.Tests/GivenAProjectToolsCommandResolverPolicy.cs +++ /dev/null @@ -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) - }); - } - } -} From d779ab3e3ff9e0116639ce23ab1874480c00f140 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Wed, 12 Oct 2016 23:24:31 -0700 Subject: [PATCH 02/11] Fixing the tool used in the test that I changed when trying things out and fixing the code that sets environment variables in the command to check if the environment variable already exists before adding it. --- .../MSBuildTestAppWithToolInDependencies.csproj | 2 +- src/Microsoft.DotNet.Cli.Utils/Command.cs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj index b6b8a050d..6bed7f3ab 100644 --- a/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj +++ b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj @@ -27,7 +27,7 @@ - + 1.0.0-rc-* diff --git a/src/Microsoft.DotNet.Cli.Utils/Command.cs b/src/Microsoft.DotNet.Cli.Utils/Command.cs index 6b461e22d..67cec543e 100644 --- a/src/Microsoft.DotNet.Cli.Utils/Command.cs +++ b/src/Microsoft.DotNet.Cli.Utils/Command.cs @@ -31,7 +31,10 @@ namespace Microsoft.DotNet.Cli.Utils foreach(var environmentVariable in commandSpec.EnvironmentVariables) { - psi.Environment.Add(environmentVariable); + if (!psi.Environment.ContainsKey(environmentVariable.Key)) + { + psi.Environment.Add(environmentVariable.Key, environmentVariable.Value); + } } _process = new Process From d8a10024e50ad4f5696a75fcde66bb39e392c4da Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Thu, 13 Oct 2016 21:42:19 -0700 Subject: [PATCH 03/11] Addressing code review comments by removing unnecessary test artifacts. --- .../dotnet-dependency-tool-invoker/Program.cs | 80 ++++++++++++++----- .../project.json | 3 +- .../dotnet-invoke-portable/Program.cs | 27 ------- .../dotnet-invoke-portable/project.json | 22 ----- ...SBuildTestAppWithToolInDependencies.csproj | 4 +- build/test/TestPackageProjects.targets | 9 --- test/EndToEnd/GivenDotNetUsesMSBuild.cs | 2 +- 7 files changed, 66 insertions(+), 81 deletions(-) delete mode 100644 TestAssets/TestPackages/dotnet-invoke-portable/Program.cs delete mode 100644 TestAssets/TestPackages/dotnet-invoke-portable/project.json diff --git a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/Program.cs b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/Program.cs index 53e103eaa..9db2e07b3 100644 --- a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/Program.cs +++ b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/Program.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.DotNet.ProjectModel; using Microsoft.DotNet.Cli.Utils; +using NuGet.Frameworks; namespace Microsoft.DotNet.Tools.DependencyInvoker { @@ -36,32 +37,73 @@ namespace Microsoft.DotNet.Tools.DependencyInvoker dotnetParams.Config, dotnetParams.Output, dotnetParams.BuildBasePath, - projectContexts.First().ProjectDirectory); - + dotnetParams.ProjectPath); + + var result = 0; + if(projectContexts.Any()) + { + result = InvokeDependencyToolForProjectJson(projectContexts, commandFactory, dotnetParams); + } + else + { + result = InvokeDependencyToolForMSBuild(commandFactory, dotnetParams); + } + + return result; + } + + private static int InvokeDependencyToolForMSBuild( + ProjectDependenciesCommandFactory commandFactory, + DotnetBaseParams dotnetParams) + { + Console.WriteLine($"Invoking '{dotnetParams.Command}' for '{dotnetParams.Framework.GetShortFolderName()}'."); + + return InvokeDependencyTool(commandFactory, dotnetParams, dotnetParams.Framework); + } + + private static int InvokeDependencyToolForProjectJson( + IEnumerable projectContexts, + ProjectDependenciesCommandFactory commandFactory, + DotnetBaseParams dotnetParams) + { foreach (var projectContext in projectContexts) { Console.WriteLine($"Invoking '{dotnetParams.Command}' for '{projectContext.TargetFramework}'."); - try + if (InvokeDependencyTool(commandFactory, dotnetParams, projectContext.TargetFramework) != 0) { - var exitCode = commandFactory.Create( - $"dotnet-{dotnetParams.Command}", - dotnetParams.RemainingArguments, - projectContext.TargetFramework, - dotnetParams.Config) - .ForwardStdErr() - .ForwardStdOut() - .Execute() - .ExitCode; - - Console.WriteLine($"Command returned {exitCode}"); - } - catch (CommandUnknownException) - { - Console.WriteLine($"Command not found"); return 1; } } + + return 0; + } + + private static int InvokeDependencyTool( + ProjectDependenciesCommandFactory commandFactory, + DotnetBaseParams dotnetParams, + NuGetFramework framework) + { + try + { + var exitCode = commandFactory.Create( + $"dotnet-{dotnetParams.Command}", + dotnetParams.RemainingArguments, + framework, + dotnetParams.Config) + .ForwardStdErr() + .ForwardStdOut() + .Execute() + .ExitCode; + + Console.WriteLine($"Command returned {exitCode}"); + } + catch (CommandUnknownException) + { + Console.WriteLine($"Command not found"); + return 1; + } + return 0; } @@ -76,7 +118,7 @@ namespace Microsoft.DotNet.Tools.DependencyInvoker if (!File.Exists(projectPath)) { - throw new InvalidOperationException($"{projectPath} does not exist."); + return Enumerable.Empty(); } return ProjectContext.CreateContextForEachFramework(projectPath); diff --git a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json index 8bf2cd784..f02530564 100644 --- a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json +++ b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json @@ -22,7 +22,8 @@ }, "Microsoft.DotNet.Compiler.Common": { "target": "project" - } + }, + "NuGet.Frameworks": "3.6.0-rc-1979" }, "frameworks": { "netcoreapp1.0": { diff --git a/TestAssets/TestPackages/dotnet-invoke-portable/Program.cs b/TestAssets/TestPackages/dotnet-invoke-portable/Program.cs deleted file mode 100644 index 1d7be4391..000000000 --- a/TestAssets/TestPackages/dotnet-invoke-portable/Program.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.IO; -using Microsoft.DotNet.Cli.Utils; -using NuGet.Frameworks; - -namespace ConsoleApplication -{ - public class Program - { - public static void Main(string[] args) - { - var environment = new EnvironmentProvider(); - var packagedCommandSpecFactory = new PackagedCommandSpecFactory(); - - var projectDependenciesCommandFactory = new ProjectDependenciesCommandFactory( - FrameworkConstants.CommonFrameworks.NetCoreApp10, - "Debug", - null, - null, - Directory.GetCurrentDirectory()); - - var command = projectDependenciesCommandFactory.Create("dotnet-portable", null); - - command.Execute(); - } - } -} diff --git a/TestAssets/TestPackages/dotnet-invoke-portable/project.json b/TestAssets/TestPackages/dotnet-invoke-portable/project.json deleted file mode 100644 index 86cada978..000000000 --- a/TestAssets/TestPackages/dotnet-invoke-portable/project.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": "1.0.0-rc-*", - "buildOptions": { - "emitEntryPoint": true - }, - "dependencies": { - "Microsoft.DotNet.Cli.Utils": { - "target": "project" - }, - "NuGet.Frameworks": "3.6.0-rc-1954" - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.1" - } - } - } - } -} diff --git a/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj index 6bed7f3ab..7d998ff6b 100644 --- a/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj +++ b/TestAssets/TestProjects/MSBuildTestAppWithToolInDependencies/MSBuildTestAppWithToolInDependencies.csproj @@ -27,8 +27,8 @@ - - 1.0.0-rc-* + + 1.0.0-* diff --git a/build/test/TestPackageProjects.targets b/build/test/TestPackageProjects.targets index a0b4fc311..a22571df6 100644 --- a/build/test/TestPackageProjects.targets +++ b/build/test/TestPackageProjects.targets @@ -142,15 +142,6 @@ True netcoreapp1.0 - - dotnet-invoke-portable - True - True - 1.0.0-rc- - $(TestPackageBuildVersionSuffix) - True - netcoreapp1.0 - dotnet-tool-with-output-name ToolWithOutputName diff --git a/test/EndToEnd/GivenDotNetUsesMSBuild.cs b/test/EndToEnd/GivenDotNetUsesMSBuild.cs index a88e4b0f3..3f20ec23b 100644 --- a/test/EndToEnd/GivenDotNetUsesMSBuild.cs +++ b/test/EndToEnd/GivenDotNetUsesMSBuild.cs @@ -108,7 +108,7 @@ namespace Microsoft.DotNet.Tests.EndToEnd new DotnetCommand() .WithWorkingDirectory(testProjectDirectory) - .ExecuteWithCapturedOutput("invoke-portable") + .ExecuteWithCapturedOutput("dependency-tool-invoker -f netcoreapp1.0 portable") .Should() .Pass() .And From 99d6b1fd6d21067e8fffd495c415a7d140ead345 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Fri, 14 Oct 2016 00:23:49 -0700 Subject: [PATCH 04/11] Adding some more tracing to tools command resolvers. --- .../CommandResolution/ProjectDependenciesCommandResolver.cs | 3 +++ .../CommandResolution/ProjectFactory.cs | 3 +++ test/EndToEnd/GivenDotNetUsesMSBuild.cs | 2 +- ...venAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs index c3d713147..29d40a042 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs @@ -78,6 +78,7 @@ namespace Microsoft.DotNet.Cli.Utils if (project == null) { + Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: Didn't find a matching project {projectDirectory}."); return null; } @@ -131,6 +132,8 @@ namespace Microsoft.DotNet.Cli.Utils throw new InvalidOperationException($"Ambiguous command name: {commandName}"); } + Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: tool library found {toolLibraries?.Count() > 0}"); + return toolLibraries?.FirstOrDefault(); } diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs index aa46a2e8b..934694c8a 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs @@ -38,7 +38,10 @@ namespace Microsoft.DotNet.Cli.Utils Path.Combine(AppContext.BaseDirectory, "msbuild.exe") : msBuildExePath; + Reporter.Verbose.WriteLine($"projetfactory: MSBUILD_EXE_PATH = {msBuildExePath}"); + string msBuildProjectPath = GetMSBuildProjPath(projectDirectory); + Reporter.Verbose.WriteLine($"projetfactory: MSBuild project path = {msBuildProjectPath}"); if(msBuildProjectPath == null) { return null; diff --git a/test/EndToEnd/GivenDotNetUsesMSBuild.cs b/test/EndToEnd/GivenDotNetUsesMSBuild.cs index 3f20ec23b..4cbb5f0f5 100644 --- a/test/EndToEnd/GivenDotNetUsesMSBuild.cs +++ b/test/EndToEnd/GivenDotNetUsesMSBuild.cs @@ -108,7 +108,7 @@ namespace Microsoft.DotNet.Tests.EndToEnd new DotnetCommand() .WithWorkingDirectory(testProjectDirectory) - .ExecuteWithCapturedOutput("dependency-tool-invoker -f netcoreapp1.0 portable") + .ExecuteWithCapturedOutput("-v dependency-tool-invoker -f netcoreapp1.0 portable") .Should() .Pass() .And diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs index eef0b9f76..8633c0753 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -41,6 +41,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests Environment.SetEnvironmentVariable( Constants.MSBUILD_EXE_PATH, Path.Combine(_repoDirectoriesProvider.Stage2Sdk, "msbuild.exe")); + Environment.SetEnvironmentVariable("DOTNET_CLI_CONTEXT_VERBOSE", "true"); } [Fact] From 58bc3b58535b3ed35b1d1d4d1a43c3189374b2a8 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Fri, 14 Oct 2016 10:23:50 -0700 Subject: [PATCH 05/11] Making the tests aware of the Configuration used in the build. --- test/EndToEnd/GivenDotNetUsesMSBuild.cs | 5 ++++- ...ctDependencyCommandResolverBeingUsedWithMSBuild.cs | 11 +++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/test/EndToEnd/GivenDotNetUsesMSBuild.cs b/test/EndToEnd/GivenDotNetUsesMSBuild.cs index 4cbb5f0f5..1cf20cdb7 100644 --- a/test/EndToEnd/GivenDotNetUsesMSBuild.cs +++ b/test/EndToEnd/GivenDotNetUsesMSBuild.cs @@ -1,6 +1,7 @@ // 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 Microsoft.DotNet.Tools.Test.Utilities; using Xunit; @@ -91,6 +92,7 @@ namespace Microsoft.DotNet.Tests.EndToEnd var testAppName = "MSBuildTestAppWithToolInDependencies"; var testInstance = TestAssetsManager .CreateTestInstance(testAppName); + var configuration = Environment.GetEnvironmentVariable("Configuration") ?? "Debug"; var testProjectDirectory = testInstance.TestRoot; @@ -108,7 +110,8 @@ namespace Microsoft.DotNet.Tests.EndToEnd new DotnetCommand() .WithWorkingDirectory(testProjectDirectory) - .ExecuteWithCapturedOutput("-v dependency-tool-invoker -f netcoreapp1.0 portable") + .ExecuteWithCapturedOutput( + $"-v dependency-tool-invoker -c {configuration} -f netcoreapp1.0 portable") .Should() .Pass() .And diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs index 8633c0753..e73b8b77f 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -19,6 +19,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests { private TestInstance MSBuildTestProjectInstance; private RepoDirectoriesProvider _repoDirectoriesProvider; + private string _configuration; public GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild() { @@ -38,6 +39,8 @@ namespace Microsoft.DotNet.Cli.Utils.Tests .Should() .Pass(); + _configuration = Environment.GetEnvironmentVariable("Configuration") ?? "Debug"; + Environment.SetEnvironmentVariable( Constants.MSBUILD_EXE_PATH, Path.Combine(_repoDirectoriesProvider.Stage2Sdk, "msbuild.exe")); @@ -54,7 +57,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests CommandName = "dotnet-portable", CommandArguments = null, ProjectDirectory = MSBuildTestProjectInstance.Path, - Configuration = "Debug", + Configuration = _configuration, Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10 }; @@ -79,7 +82,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests CommandName = "dotnet-portable", CommandArguments = null, ProjectDirectory = MSBuildTestProjectInstance.Path, - Configuration = "Debug", + Configuration = _configuration, Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10 }; @@ -99,7 +102,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests CommandName = "nonexistent-command", CommandArguments = null, ProjectDirectory = MSBuildTestProjectInstance.Path, - Configuration = "Debug", + Configuration = _configuration, Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10 }; @@ -122,7 +125,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests CommandName = "dotnet-portable", CommandArguments = null, ProjectDirectory = testInstance.Path, - Configuration = "Debug", + Configuration = _configuration, Framework = FrameworkConstants.CommonFrameworks.NetCoreApp10, OutputPath = outputDir }; From 8ad198201341fc8b8fe592e719a7744ce6521948 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Fri, 14 Oct 2016 12:45:04 -0700 Subject: [PATCH 06/11] Handling configuration when the env variable is not set. --- test/EndToEnd/GivenDotNetUsesMSBuild.cs | 5 +++-- ...ProjectDependencyCommandResolverBeingUsedWithMSBuild.cs | 7 +++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/EndToEnd/GivenDotNetUsesMSBuild.cs b/test/EndToEnd/GivenDotNetUsesMSBuild.cs index 1cf20cdb7..e1c4a7463 100644 --- a/test/EndToEnd/GivenDotNetUsesMSBuild.cs +++ b/test/EndToEnd/GivenDotNetUsesMSBuild.cs @@ -92,7 +92,8 @@ namespace Microsoft.DotNet.Tests.EndToEnd var testAppName = "MSBuildTestAppWithToolInDependencies"; var testInstance = TestAssetsManager .CreateTestInstance(testAppName); - var configuration = Environment.GetEnvironmentVariable("Configuration") ?? "Debug"; + + var configuration = "Debug"; var testProjectDirectory = testInstance.TestRoot; @@ -104,7 +105,7 @@ namespace Microsoft.DotNet.Tests.EndToEnd new Build3Command() .WithWorkingDirectory(testProjectDirectory) - .Execute() + .Execute($"-c {configuration}") .Should() .Pass(); diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs index e73b8b77f..f1a94b036 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -26,6 +26,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests MSBuildTestProjectInstance = TestAssetsManager.CreateTestInstance("MSBuildTestAppWithToolInDependencies"); _repoDirectoriesProvider = new RepoDirectoriesProvider(); + _configuration = "Debug"; new Restore3Command() .WithWorkingDirectory(MSBuildTestProjectInstance.Path) @@ -35,11 +36,9 @@ namespace Microsoft.DotNet.Cli.Utils.Tests new Build3Command() .WithWorkingDirectory(MSBuildTestProjectInstance.Path) - .Execute() + .Execute($"-c {_configuration}") .Should() - .Pass(); - - _configuration = Environment.GetEnvironmentVariable("Configuration") ?? "Debug"; + .Pass(); Environment.SetEnvironmentVariable( Constants.MSBUILD_EXE_PATH, From dab19ce57c00e55b45ab9018af1d1e576c6bf816 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Fri, 14 Oct 2016 14:58:36 -0700 Subject: [PATCH 07/11] Fixing msbuild.exe casing --- .../CommandResolution/ProjectFactory.cs | 2 +- ...ivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs index 934694c8a..951d21913 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs @@ -35,7 +35,7 @@ namespace Microsoft.DotNet.Cli.Utils { var msBuildExePath = _environment.GetEnvironmentVariable(Constants.MSBUILD_EXE_PATH); msBuildExePath = string.IsNullOrEmpty(msBuildExePath) ? - Path.Combine(AppContext.BaseDirectory, "msbuild.exe") : + Path.Combine(AppContext.BaseDirectory, "MSBuild.exe") : msBuildExePath; Reporter.Verbose.WriteLine($"projetfactory: MSBUILD_EXE_PATH = {msBuildExePath}"); diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs index f1a94b036..37435663a 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -42,7 +42,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests Environment.SetEnvironmentVariable( Constants.MSBUILD_EXE_PATH, - Path.Combine(_repoDirectoriesProvider.Stage2Sdk, "msbuild.exe")); + Path.Combine(_repoDirectoriesProvider.Stage2Sdk, "MSBuild.exe")); Environment.SetEnvironmentVariable("DOTNET_CLI_CONTEXT_VERBOSE", "true"); } From ce812a64c245a78d4edd66015cc96a5b1dd5133c Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Fri, 14 Oct 2016 15:46:52 -0700 Subject: [PATCH 08/11] Removing DotnetFiles from Cli.Utils. --- .../CommandResolution/ProjectJsonProject.cs | 2 +- src/Microsoft.DotNet.Cli.Utils/project.json | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs index 410e52c40..e6170da68 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectJsonProject.cs @@ -38,7 +38,7 @@ namespace Microsoft.DotNet.Cli.Utils _projectContext = ProjectContext.Create( _projectDirectory, _framework, - DotnetRuntimeIdentifiers.InferCurrentRuntimeIdentifiers(DotnetFiles.VersionFileObject)); + RuntimeEnvironmentRidExtensions.GetAllCandidateRuntimeIdentifiers()); } return _projectContext; diff --git a/src/Microsoft.DotNet.Cli.Utils/project.json b/src/Microsoft.DotNet.Cli.Utils/project.json index df1aa8a4b..146c552e9 100644 --- a/src/Microsoft.DotNet.Cli.Utils/project.json +++ b/src/Microsoft.DotNet.Cli.Utils/project.json @@ -2,13 +2,7 @@ "version": "1.0.0-preview3-*", "buildOptions": { "keyFile": "../../tools/Key.snk", - "warningsAsErrors": true, - "compile": { - "include": [ - "**/*.cs", - "../../src/dotnet/DotnetFiles.cs" - ] - } + "warningsAsErrors": true }, "dependencies": { "Microsoft.DotNet.ProjectModel": { @@ -20,7 +14,7 @@ "NuGet.Packaging": "3.6.0-rc-1984", "NuGet.Frameworks": "3.6.0-rc-1984", "NuGet.ProjectModel": "3.6.0-rc-1984", - + "Microsoft.Build": "15.1.316-preview5", "Microsoft.Build.Utilities.Core": "15.1.316-preview5" }, From 7601f6632833fa7efed7200b535bc218a58455e1 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Sun, 16 Oct 2016 18:42:57 -0700 Subject: [PATCH 09/11] Reducing the test method name sizes in an attempt to get it passing on Windows. --- ...tDependencyCommandResolverBeingUsedWithMSBuild.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs index 37435663a..f5852ead5 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -47,7 +47,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests } [Fact] - public void It_returns_a_CommandSpec_with_Dotnet_as_FileName_and_CommandName_in_Args_when_CommandName_exists_in_MSBuild_ProjectDependencies() + public void ItReturnsACommandSpecWithDotnetAsFileNameAndCommandNameInArgsWhenCommandNameExistsInMSBuildProjectDependencies() { var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver(); @@ -72,7 +72,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests } [Fact] - public void It_passes_depsfile_arg_to_host_when_returning_a_CommandSpec_for_MSBuild_project() + public void ItPassesDepsfileArgToHostWhenReturningACommandSpecForMSBuildProject() { var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver(); @@ -92,7 +92,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests } [Fact] - public void It_returns_null_when_CommandName_does_not_exist_in_ProjectDependencies_for_MSBuild_project() + public void ItReturnsNullWhenCommandNameDoesNotExistInProjectDependenciesForMSBuildProject() { var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver(); @@ -111,13 +111,13 @@ namespace Microsoft.DotNet.Cli.Utils.Tests } [Fact] - public void It_sets_depsfile_in_output_path_in_commandspec_for_MSBuild_project() + public void ItSetsDepsfileToOutputInCommandspecForMSBuild() { var projectDependenciesCommandResolver = SetupProjectDependenciesCommandResolver(); var testInstance = TestAssetsManager.CreateTestInstance("MSBuildTestAppWithToolInDependencies"); - var outputDir = Path.Combine(testInstance.Path, "outdir"); + var outputDir = Path.Combine(testInstance.Path, "out"); var commandResolverArguments = new CommandResolverArguments() { @@ -137,7 +137,7 @@ namespace Microsoft.DotNet.Cli.Utils.Tests new Build3Command() .WithWorkingDirectory(testInstance.Path) - .Execute($"-o {outputDir}") + .Execute($"-c {_configuration} -o {outputDir}") .Should() .Pass(); From 391d04c67a0721decb0a271ac268cdff6b653072 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Sat, 15 Oct 2016 18:34:03 -0700 Subject: [PATCH 10/11] Adding net46 to some of our libraries back, so that we can run binding-redirect tests again. We need those tests for tool and we need to keep them running. --- .../dotnet-dependency-tool-invoker/project.json | 2 +- build_projects/dotnet-cli-build/dotnet-cli-build.csproj | 2 +- src/Microsoft.DotNet.Cli.Utils/project.json | 2 ++ src/Microsoft.DotNet.TestFramework/project.json | 2 ++ ...ProjectDependencyCommandResolverBeingUsedWithMSBuild.cs | 1 - .../RepoDirectoriesProvider.cs | 3 ++- test/Microsoft.DotNet.Tools.Tests.Utilities/project.json | 7 +++++++ test/binding-redirects.Tests/BindingRedirectTests.cs | 1 + test/binding-redirects.Tests/TestSetupFixture.cs | 1 + test/binding-redirects.Tests/project.json | 5 ++++- 10 files changed, 21 insertions(+), 5 deletions(-) diff --git a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json index f02530564..5540f2d1d 100644 --- a/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json +++ b/TestAssets/TestPackages/dotnet-dependency-tool-invoker/project.json @@ -23,7 +23,7 @@ "Microsoft.DotNet.Compiler.Common": { "target": "project" }, - "NuGet.Frameworks": "3.6.0-rc-1979" + "NuGet.Frameworks": "3.6.0-rc-1984" }, "frameworks": { "netcoreapp1.0": { diff --git a/build_projects/dotnet-cli-build/dotnet-cli-build.csproj b/build_projects/dotnet-cli-build/dotnet-cli-build.csproj index fd7a3dce1..c246e4c04 100644 --- a/build_projects/dotnet-cli-build/dotnet-cli-build.csproj +++ b/build_projects/dotnet-cli-build/dotnet-cli-build.csproj @@ -39,7 +39,7 @@ 6.2.2-preview - 3.6.0-rc-1979 + 3.6.0-rc-1984 0.1.0-preview-00043-160929 diff --git a/src/Microsoft.DotNet.Cli.Utils/project.json b/src/Microsoft.DotNet.Cli.Utils/project.json index 146c552e9..91bdf7f93 100644 --- a/src/Microsoft.DotNet.Cli.Utils/project.json +++ b/src/Microsoft.DotNet.Cli.Utils/project.json @@ -26,6 +26,8 @@ "dependencies": { "System.Diagnostics.Process": "4.1.0" } + }, + "net46": { } } } diff --git a/src/Microsoft.DotNet.TestFramework/project.json b/src/Microsoft.DotNet.TestFramework/project.json index 144b0b3a8..d2fc22f88 100644 --- a/src/Microsoft.DotNet.TestFramework/project.json +++ b/src/Microsoft.DotNet.TestFramework/project.json @@ -14,6 +14,8 @@ "imports": [ "portable-net45+wp80+win8+wpa81+dnxcore50" ] + }, + "net46": { } }, "packOptions": { diff --git a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs index f5852ead5..8cf2fd547 100644 --- a/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs +++ b/test/Microsoft.DotNet.Cli.Utils.Tests/GivenAProjectDependencyCommandResolverBeingUsedWithMSBuild.cs @@ -43,7 +43,6 @@ namespace Microsoft.DotNet.Cli.Utils.Tests Environment.SetEnvironmentVariable( Constants.MSBUILD_EXE_PATH, Path.Combine(_repoDirectoriesProvider.Stage2Sdk, "MSBuild.exe")); - Environment.SetEnvironmentVariable("DOTNET_CLI_CONTEXT_VERBOSE", "true"); } [Fact] diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs index b4b75b8b1..ab5ccb5ec 100644 --- a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs +++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using Microsoft.DotNet.PlatformAbstractions; namespace Microsoft.DotNet.Tools.Test.Utilities { @@ -61,7 +62,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities string corehostPackages = null, string corehostDummyPackages = null) { - var currentRid = DotnetLegacyRuntimeIdentifiers.InferLegacyRestoreRuntimeIdentifier(); + var currentRid = RuntimeEnvironment.GetRuntimeIdentifier(); _artifacts = artifacts ?? Path.Combine(RepoRoot, "artifacts", currentRid); _nugetPackages = nugetPackages ?? Path.Combine(RepoRoot, ".nuget", "packages"); diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json b/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json index 1e6be6860..7c562d133 100644 --- a/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json +++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/project.json @@ -36,6 +36,13 @@ "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" + } + } } } } diff --git a/test/binding-redirects.Tests/BindingRedirectTests.cs b/test/binding-redirects.Tests/BindingRedirectTests.cs index e4da31af4..566b48060 100644 --- a/test/binding-redirects.Tests/BindingRedirectTests.cs +++ b/test/binding-redirects.Tests/BindingRedirectTests.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Xml.Linq; using FluentAssertions; +using Microsoft.DotNet.Tools.Test.Utilities; using Xunit; namespace Microsoft.DotNet.Tests diff --git a/test/binding-redirects.Tests/TestSetupFixture.cs b/test/binding-redirects.Tests/TestSetupFixture.cs index b6ac63d99..e0c29f6e3 100644 --- a/test/binding-redirects.Tests/TestSetupFixture.cs +++ b/test/binding-redirects.Tests/TestSetupFixture.cs @@ -4,6 +4,7 @@ using System.IO; using Microsoft.DotNet.InternalAbstractions; using Microsoft.DotNet.TestFramework; +using Microsoft.DotNet.Tools.Test.Utilities; namespace Microsoft.DotNet.Tests { diff --git a/test/binding-redirects.Tests/project.json b/test/binding-redirects.Tests/project.json index 8603be7a5..4ef020d2b 100644 --- a/test/binding-redirects.Tests/project.json +++ b/test/binding-redirects.Tests/project.json @@ -3,7 +3,10 @@ "dependencies": { "xunit": "2.2.0-beta3-build3330", "dotnet-test-xunit": "1.0.0-rc2-350904-49", - "Microsoft.NETCore.Platforms": "1.0.1" + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.DotNet.Tools.Tests.Utilities": { + "target": "project" + } }, "frameworks": { "net46": { From 37981020358f6437a71dd3fc5ef67918422851f3 Mon Sep 17 00:00:00 2001 From: Livar Cunha Date: Mon, 17 Oct 2016 08:43:47 -0700 Subject: [PATCH 11/11] Changing the API to create the MSBuild project to LoadProject and removing some non-existing paths from the RepoDirectoriesProvider. --- .../CommandResolution/MSBuildProject.cs | 8 ++++---- .../RepoDirectoriesProvider.cs | 6 ------ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs index 99054b49c..e658ff9f9 100644 --- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs +++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/MSBuildProject.cs @@ -77,10 +77,10 @@ namespace Microsoft.DotNet.Cli.Utils globalProperties.Add("Configuration", configuration); } - _project = ProjectCollection.GlobalProjectCollection.LoadedProjects.FirstOrDefault(p => - p.FullPath == msBuildProjectPath); - - _project = _project ?? new Project(msBuildProjectPath, globalProperties, null); + _project = ProjectCollection.GlobalProjectCollection.LoadProject( + msBuildProjectPath, + globalProperties, + null); _msBuildExePath = msBuildExePath; } diff --git a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs index ab5ccb5ec..038c6cfad 100644 --- a/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs +++ b/test/Microsoft.DotNet.Tools.Tests.Utilities/RepoDirectoriesProvider.cs @@ -12,8 +12,6 @@ namespace Microsoft.DotNet.Tools.Test.Utilities private string _artifacts; private string _builtDotnet; private string _nugetPackages; - private string _corehostPackages; - private string _corehostDummyPackages; private string _stage2Sdk; private string _testPackages; @@ -50,8 +48,6 @@ namespace Microsoft.DotNet.Tools.Test.Utilities 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; @@ -66,8 +62,6 @@ namespace Microsoft.DotNet.Tools.Test.Utilities _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");