Merge pull request #5102 from krwq/i1494tools
fix tools when restoring with --packages
This commit is contained in:
commit
a65d857f73
11 changed files with 194 additions and 12 deletions
|
@ -0,0 +1,21 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp1.0</TargetFramework>
|
||||||
|
<GeneratedPackageId>random-name</GeneratedPackageId>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="**\*.cs" />
|
||||||
|
<EmbeddedResource Include="**\*.resx" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NETCore.App" Version="1.0.1" />
|
||||||
|
<DotNetCliToolReference Include="$(GeneratedPackageId)">
|
||||||
|
<Version>1.0.0</Version>
|
||||||
|
</DotNetCliToolReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<packageSources>
|
||||||
|
<add key="test-packages" value="../pkgs" />
|
||||||
|
</packageSources>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,8 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Hello World from tool!");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp1.0</TargetFramework>
|
||||||
|
<GeneratedPackageId>random-name</GeneratedPackageId>
|
||||||
|
<PackageId>$(GeneratedPackageId)</PackageId>
|
||||||
|
<AssemblyName>dotnet-randompackage</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="**\*.cs" />
|
||||||
|
<EmbeddedResource Include="**\*.resx" />
|
||||||
|
<Content Include="$(OutputPath)\$(AssemblyName).runtimeconfig.json">
|
||||||
|
<Pack>true</Pack>
|
||||||
|
<PackagePath>lib\$(TargetFramework)</PackagePath>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NETCore.App" Version="1.0.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -10,6 +10,8 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
{
|
{
|
||||||
LockFile GetLockFile();
|
LockFile GetLockFile();
|
||||||
|
|
||||||
|
bool TryGetLockFile(out LockFile lockFile);
|
||||||
|
|
||||||
IEnumerable<SingleProjectInfo> GetTools();
|
IEnumerable<SingleProjectInfo> GetTools();
|
||||||
|
|
||||||
string DepsJsonPath { get; }
|
string DepsJsonPath { get; }
|
||||||
|
|
|
@ -129,6 +129,29 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
.Result;
|
.Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool TryGetLockFile(out LockFile lockFile)
|
||||||
|
{
|
||||||
|
lockFile = null;
|
||||||
|
|
||||||
|
var lockFilePath = GetLockFilePathFromProjectLockFileProperty() ??
|
||||||
|
GetLockFilePathFromIntermediateBaseOutputPath();
|
||||||
|
|
||||||
|
if (lockFilePath == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(lockFilePath))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lockFile = new LockFileFormat()
|
||||||
|
.ReadWithLock(lockFilePath)
|
||||||
|
.Result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private string GetLockFilePathFromProjectLockFileProperty()
|
private string GetLockFilePathFromProjectLockFileProperty()
|
||||||
{
|
{
|
||||||
return _project
|
return _project
|
||||||
|
|
|
@ -127,16 +127,19 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
ProjectToolsCommandResolverName,
|
ProjectToolsCommandResolverName,
|
||||||
toolLibraryRange.Name));
|
toolLibraryRange.Name));
|
||||||
|
|
||||||
var nuGetPathContext = NuGetPathContext.Create(project.ProjectRoot);
|
var possiblePackageRoots = GetPossiblePackageRoots(project).ToList();
|
||||||
|
|
||||||
var nugetPackagesRoot = nuGetPathContext.UserPackageFolder;
|
|
||||||
|
|
||||||
Reporter.Verbose.WriteLine(string.Format(
|
Reporter.Verbose.WriteLine(string.Format(
|
||||||
LocalizableStrings.NuGetPackagesRoot,
|
LocalizableStrings.NuGetPackagesRoot,
|
||||||
ProjectToolsCommandResolverName,
|
ProjectToolsCommandResolverName,
|
||||||
nugetPackagesRoot));
|
string.Join(Environment.NewLine, possiblePackageRoots.Select((p) => $"- {p}"))));
|
||||||
|
|
||||||
var toolLockFile = GetToolLockFile(toolLibraryRange, nugetPackagesRoot);
|
string nugetPackagesRoot;
|
||||||
|
var toolLockFile = GetToolLockFile(toolLibraryRange, possiblePackageRoots, out nugetPackagesRoot);
|
||||||
|
|
||||||
|
if (toolLockFile == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Reporter.Verbose.WriteLine(string.Format(
|
Reporter.Verbose.WriteLine(string.Format(
|
||||||
LocalizableStrings.FoundToolLockFile,
|
LocalizableStrings.FoundToolLockFile,
|
||||||
|
@ -189,19 +192,47 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
return commandSpec;
|
return commandSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IEnumerable<string> GetPossiblePackageRoots(IProject project)
|
||||||
|
{
|
||||||
|
if (project.TryGetLockFile(out LockFile lockFile))
|
||||||
|
{
|
||||||
|
return lockFile.PackageFolders.Select((packageFolder) => packageFolder.Path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Enumerable.Empty<string>();
|
||||||
|
}
|
||||||
|
|
||||||
private LockFile GetToolLockFile(
|
private LockFile GetToolLockFile(
|
||||||
SingleProjectInfo toolLibrary,
|
SingleProjectInfo toolLibrary,
|
||||||
string nugetPackagesRoot)
|
IEnumerable<string> possibleNugetPackagesRoot,
|
||||||
|
out string nugetPackagesRoot)
|
||||||
{
|
{
|
||||||
|
foreach (var packagesRoot in possibleNugetPackagesRoot)
|
||||||
|
{
|
||||||
|
if (TryGetToolLockFile(toolLibrary, packagesRoot, out LockFile lockFile))
|
||||||
|
{
|
||||||
|
nugetPackagesRoot = packagesRoot;
|
||||||
|
return lockFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nugetPackagesRoot = null;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryGetToolLockFile(
|
||||||
|
SingleProjectInfo toolLibrary,
|
||||||
|
string nugetPackagesRoot,
|
||||||
|
out LockFile lockFile)
|
||||||
|
{
|
||||||
|
lockFile = null;
|
||||||
var lockFilePath = GetToolLockFilePath(toolLibrary, nugetPackagesRoot);
|
var lockFilePath = GetToolLockFilePath(toolLibrary, nugetPackagesRoot);
|
||||||
|
|
||||||
if (!File.Exists(lockFilePath))
|
if (!File.Exists(lockFilePath))
|
||||||
{
|
{
|
||||||
return null;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
LockFile lockFile = null;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
lockFile = new LockFileFormat()
|
lockFile = new LockFileFormat()
|
||||||
|
@ -213,7 +244,7 @@ namespace Microsoft.DotNet.Cli.Utils
|
||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
return lockFile;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetToolLockFilePath(
|
private string GetToolLockFilePath(
|
||||||
|
|
1
test/dotnet.Tests/MSBuild.exe
Normal file
1
test/dotnet.Tests/MSBuild.exe
Normal file
|
@ -0,0 +1 @@
|
||||||
|
https://github.com/Microsoft/msbuild/issues/927
|
1
test/dotnet.Tests/MSBuild.exe.config
Normal file
1
test/dotnet.Tests/MSBuild.exe.config
Normal file
|
@ -0,0 +1 @@
|
||||||
|
https://github.com/Microsoft/msbuild/issues/927
|
|
@ -13,6 +13,9 @@ using Microsoft.DotNet.Tools.Test.Utilities;
|
||||||
using Microsoft.DotNet.InternalAbstractions;
|
using Microsoft.DotNet.InternalAbstractions;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
|
using Microsoft.Build.Construction;
|
||||||
|
using System.Linq;
|
||||||
|
using Microsoft.Build.Evaluation;
|
||||||
|
|
||||||
namespace Microsoft.DotNet.Tests
|
namespace Microsoft.DotNet.Tests
|
||||||
{
|
{
|
||||||
|
@ -135,7 +138,52 @@ namespace Microsoft.DotNet.Tests
|
||||||
.WithWorkingDirectory(testInstance.Root)
|
.WithWorkingDirectory(testInstance.Root)
|
||||||
.ExecuteWithCapturedOutput("nonexistingtool")
|
.ExecuteWithCapturedOutput("nonexistingtool")
|
||||||
.Should().Fail()
|
.Should().Fail()
|
||||||
.And.HaveStdErrContaining("Version for package `dotnet-nonexistingtool` could not be resolved.");
|
.And.HaveStdErrContaining("No executable found matching command \"dotnet-nonexistingtool\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItRunsToolRestoredToSpecificPackageDir()
|
||||||
|
{
|
||||||
|
var testInstance = TestAssets.Get("NonRestoredTestProjects", "ToolWithRandomPackageName")
|
||||||
|
.CreateInstance()
|
||||||
|
.WithSourceFiles();
|
||||||
|
|
||||||
|
var appWithDepOnToolDir = testInstance.Root.Sub("AppWithDepOnTool");
|
||||||
|
var toolWithRandPkgNameDir = testInstance.Root.Sub("ToolWithRandomPackageName");
|
||||||
|
var pkgsDir = testInstance.Root.CreateSubdirectory("pkgs");
|
||||||
|
|
||||||
|
// 3ebdd4f1-a194-470a-b01a-4515672791d1
|
||||||
|
// ^-- index = 24
|
||||||
|
string randomPackageName = Guid.NewGuid().ToString().Substring(24);
|
||||||
|
|
||||||
|
// TODO: This is a workround for https://github.com/dotnet/cli/issues/5020
|
||||||
|
SetGeneratedPackageName(appWithDepOnToolDir.GetFile("AppWithDepOnTool.csproj"),
|
||||||
|
randomPackageName);
|
||||||
|
|
||||||
|
SetGeneratedPackageName(toolWithRandPkgNameDir.GetFile("ToolWithRandomPackageName.csproj"),
|
||||||
|
randomPackageName);
|
||||||
|
|
||||||
|
new RestoreCommand()
|
||||||
|
.WithWorkingDirectory(toolWithRandPkgNameDir)
|
||||||
|
.Execute()
|
||||||
|
.Should().Pass();
|
||||||
|
|
||||||
|
new PackCommand()
|
||||||
|
.WithWorkingDirectory(toolWithRandPkgNameDir)
|
||||||
|
.Execute($"-o \"{pkgsDir.FullName}\"")
|
||||||
|
.Should().Pass();
|
||||||
|
|
||||||
|
new RestoreCommand()
|
||||||
|
.WithWorkingDirectory(appWithDepOnToolDir)
|
||||||
|
.Execute($"--packages \"{pkgsDir.FullName}\"")
|
||||||
|
.Should().Pass();
|
||||||
|
|
||||||
|
new TestCommand("dotnet")
|
||||||
|
.WithWorkingDirectory(appWithDepOnToolDir)
|
||||||
|
.ExecuteWithCapturedOutput("randompackage")
|
||||||
|
.Should().Pass()
|
||||||
|
.And.HaveStdOutContaining("Hello World from tool!")
|
||||||
|
.And.NotHaveStdErr();
|
||||||
}
|
}
|
||||||
|
|
||||||
// need conditional theories so we can skip on non-Windows
|
// need conditional theories so we can skip on non-Windows
|
||||||
|
@ -294,6 +342,14 @@ namespace Microsoft.DotNet.Tests
|
||||||
stopWatch.ElapsedMilliseconds.Should().BeGreaterThan(1000, "Because dotnet should respect the NuGet lock");
|
stopWatch.ElapsedMilliseconds.Should().BeGreaterThan(1000, "Because dotnet should respect the NuGet lock");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetGeneratedPackageName(FileInfo project, string packageName)
|
||||||
|
{
|
||||||
|
const string propertyName = "GeneratedPackageId";
|
||||||
|
var p = ProjectRootElement.Open(project.FullName, new ProjectCollection(), true);
|
||||||
|
p.AddProperty(propertyName, packageName);
|
||||||
|
p.Save();
|
||||||
|
}
|
||||||
|
|
||||||
class HelloCommand : TestCommand
|
class HelloCommand : TestCommand
|
||||||
{
|
{
|
||||||
public HelloCommand()
|
public HelloCommand()
|
||||||
|
|
Loading…
Add table
Reference in a new issue