fix tools when restoring with --packages

This commit is contained in:
Krzysztof Wicher 2016-12-20 12:15:33 -08:00
parent 2d5e40f3ba
commit 59ae0e2d3d
11 changed files with 197 additions and 13 deletions

View file

@ -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>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="test-packages" value="../pkgs" />
</packageSources>
</configuration>

View file

@ -0,0 +1,8 @@
using System;
class Program
{
static void Main(string[] args)
{
}
}

View file

@ -0,0 +1,9 @@
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World from tool!");
}
}

View file

@ -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>

View file

@ -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; }

View file

@ -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

View file

@ -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,33 @@ namespace Microsoft.DotNet.Cli.Utils
return commandSpec; return commandSpec;
} }
private LockFile GetToolLockFile( private IEnumerable<string> GetPossiblePackageRoots(IProject project)
SingleProjectInfo toolLibrary,
string nugetPackagesRoot)
{ {
if (project.TryGetLockFile(out LockFile lockFile))
{
foreach (var packageFolder in lockFile.PackageFolders)
{
yield return packageFolder.Path;
}
}
var nuGetPathContext = NuGetPathContext.Create(project.ProjectRoot);
yield return nuGetPathContext.UserPackageFolder;
}
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 +230,22 @@ namespace Microsoft.DotNet.Cli.Utils
throw ex; throw ex;
} }
return lockFile; return true;
}
private LockFile GetToolLockFile(SingleProjectInfo toolLibrary, 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 string GetToolLockFilePath( private string GetToolLockFilePath(

View file

@ -0,0 +1 @@
https://github.com/Microsoft/msbuild/issues/927

View file

@ -0,0 +1 @@
https://github.com/Microsoft/msbuild/issues/927

View file

@ -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
{ {
@ -138,6 +141,52 @@ namespace Microsoft.DotNet.Tests
.And.HaveStdErrContaining("Version for package `dotnet-nonexistingtool` could not be resolved."); .And.HaveStdErrContaining("Version for package `dotnet-nonexistingtool` could not be resolved.");
} }
[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");
string randomPackageName = Guid.NewGuid().ToString();
// 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)
.ExecuteWithCapturedOutput()
.Should().Pass()
.And.NotHaveStdErr();
new PackCommand()
.WithWorkingDirectory(toolWithRandPkgNameDir)
.ExecuteWithCapturedOutput($"-o \"{pkgsDir.FullName}\"")
.Should().Pass()
.And.NotHaveStdErr();
new RestoreCommand()
.WithWorkingDirectory(appWithDepOnToolDir)
.ExecuteWithCapturedOutput($"--packages \"{pkgsDir.FullName}\"")
.Should().Pass()
.And.NotHaveStdErr();
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
//[Theory(Skip="https://github.com/dotnet/cli/issues/4514")] //[Theory(Skip="https://github.com/dotnet/cli/issues/4514")]
//[MemberData("DependencyToolArguments")] //[MemberData("DependencyToolArguments")]
@ -294,6 +343,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()