コード例 #1
0
        public void WhenRunWithPrereleaseAndPackageVersionItShouldSucceed()
        {
            ParseResult result =
                Parser.Instance.Parse($"dotnet tool install {_packageIdA.ToString()} --prerelease");

            var installLocalCommand = new ToolInstallLocalCommand(
                result,
                GetToolToolPackageInstallerWithPreviewInFeed(),
                _toolManifestFinder,
                _toolManifestEditor,
                _localToolsResolverCache,
                _reporter);

            installLocalCommand.Execute().Should().Be(0);
            var manifestPackages = _toolManifestFinder.Find();

            manifestPackages.Should().HaveCount(1);
            var addedPackage = manifestPackages.Single();

            _localToolsResolverCache.TryLoad(new RestoredCommandIdentifier(
                                                 addedPackage.PackageId,
                                                 new NuGetVersion("2.0.1-preview1"),
                                                 NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                                                 Constants.AnyRid,
                                                 addedPackage.CommandNames.Single()),
                                             out RestoredCommand restoredCommand
                                             ).Should().BeTrue();

            _fileSystem.File.Exists(restoredCommand.Executable.Value);
        }
コード例 #2
0
        private (FilePath, LocalToolsCommandResolver) DefaultSetup(string toolCommand)
        {
            NuGetVersion packageVersionA = NuGetVersion.Parse("1.0.4");

            _fileSystem.File.WriteAllText(Path.Combine(_testDirectoryRoot, ManifestFilename),
                                          _jsonContent.Replace("$TOOLCOMMAND$", toolCommand));
            ToolManifestFinder toolManifest =
                new ToolManifestFinder(new DirectoryPath(_testDirectoryRoot), _fileSystem, new FakeDangerousFileDetector());
            ToolCommandName toolCommandNameA = new ToolCommandName(toolCommand);
            FilePath        fakeExecutable   = _nugetGlobalPackagesFolder.WithFile("fakeExecutable.dll");

            _fileSystem.Directory.CreateDirectory(_nugetGlobalPackagesFolder.Value);
            _fileSystem.File.CreateEmptyFile(fakeExecutable.Value);
            _localToolsResolverCache.Save(
                new Dictionary <RestoredCommandIdentifier, RestoredCommand>
            {
                [new RestoredCommandIdentifier(
                     new PackageId("local.tool.console.a"),
                     packageVersionA,
                     NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                     Constants.AnyRid,
                     toolCommandNameA)]
                    = new RestoredCommand(toolCommandNameA, "dotnet", fakeExecutable)
            });

            var localToolsCommandResolver = new LocalToolsCommandResolver(
                toolManifest,
                _localToolsResolverCache,
                _fileSystem);

            return(fakeExecutable, localToolsCommandResolver);
        }
コード例 #3
0
        public void WhenRunItCanSaveCommandsToCache()
        {
            IToolManifestFinder manifestFinder =
                new MockManifestFinder(new[]
            {
                new ToolManifestPackage(_packageIdA, _packageVersionA,
                                        new[] { _toolCommandNameA },
                                        new DirectoryPath(_temporaryDirectory)),
                new ToolManifestPackage(_packageIdB, _packageVersionB,
                                        new[] { _toolCommandNameB },
                                        new DirectoryPath(_temporaryDirectory))
            });

            ToolRestoreCommand toolRestoreCommand = new ToolRestoreCommand(_parseResult,
                                                                           _toolPackageInstallerMock,
                                                                           manifestFinder,
                                                                           _localToolsResolverCache,
                                                                           _fileSystem,
                                                                           _reporter
                                                                           );

            toolRestoreCommand.Execute().Should().Be(0);

            _localToolsResolverCache.TryLoad(
                new RestoredCommandIdentifier(
                    _packageIdA,
                    _packageVersionA,
                    NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                    Constants.AnyRid,
                    _toolCommandNameA), out RestoredCommand restoredCommand)
            .Should().BeTrue();

            _fileSystem.File.Exists(restoredCommand.Executable.Value)
            .Should().BeTrue($"Cached command should be found at {restoredCommand.Executable.Value}");
        }
コード例 #4
0
        private CommandSpec GetPackageCommandSpecUsingMuxer(CommandResolverArguments arguments,
                                                            ToolCommandName toolCommandName)
        {
            if (!_toolManifest.TryFind(toolCommandName, out var toolManifestPackage))
            {
                return(null);
            }

            if (_localToolsResolverCache.TryLoad(
                    new RestoredCommandIdentifier(
                        toolManifestPackage.PackageId,
                        toolManifestPackage.Version,
                        NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                        Constants.AnyRid,
                        toolCommandName),
                    _nugetGlobalPackagesFolder,
                    out var restoredCommand))
            {
                if (!_fileSystem.File.Exists(restoredCommand.Executable.Value))
                {
                    throw new GracefulException(string.Format(LocalizableStrings.NeedRunToolRestore,
                                                              toolCommandName.ToString()));
                }

                return(MuxerCommandSpecMaker.CreatePackageCommandSpecUsingMuxer(
                           restoredCommand.Executable.Value,
                           arguments.CommandArguments));
            }

            return(null);
        }
コード例 #5
0
        public ToolInstallLocalInstaller(
            ParseResult parseResult,
            IToolPackageInstaller toolPackageInstaller = null)
        {
            _parseResult    = parseResult;
            _packageId      = new PackageId(parseResult.GetValueForArgument(ToolInstallCommandParser.PackageIdArgument));
            _packageVersion = parseResult.GetValueForOption(ToolInstallCommandParser.VersionOption);
            _configFilePath = parseResult.GetValueForOption(ToolInstallCommandParser.ConfigOption);
            _sources        = parseResult.GetValueForOption(ToolInstallCommandParser.AddSourceOption);
            _verbosity      = Enum.GetName(parseResult.GetValueForOption(ToolInstallCommandParser.VerbosityOption));

            if (toolPackageInstaller == null)
            {
                (IToolPackageStore,
                 IToolPackageStoreQuery,
                 IToolPackageInstaller installer)toolPackageStoresAndInstaller
                    = ToolPackageFactory.CreateToolPackageStoresAndInstaller(
                          additionalRestoreArguments: parseResult.OptionValuesToBeForwarded(ToolInstallCommandParser.GetCommand()));
                _toolPackageInstaller = toolPackageStoresAndInstaller.installer;
            }
            else
            {
                _toolPackageInstaller = toolPackageInstaller;
            }

            TargetFrameworkToInstall = BundledTargetFramework.GetTargetFrameworkMoniker();
        }
コード例 #6
0
ファイル: ToolPackageInstaller.cs プロジェクト: yunly/cli
        public IToolPackage InstallPackageToExternalManagedLocation(PackageLocation packageLocation,
                                                                    PackageId packageId,
                                                                    VersionRange versionRange = null,
                                                                    string targetFramework    = null,
                                                                    string verbosity          = null)
        {
            var tempDirectoryForAssetJson = new DirectoryPath(Path.GetTempPath())
                                            .WithSubDirectories(Path.GetRandomFileName());

            Directory.CreateDirectory(tempDirectoryForAssetJson.Value);

            var tempProject = CreateTempProject(
                packageId: packageId,
                versionRange: versionRange,
                targetFramework: targetFramework ?? BundledTargetFramework.GetTargetFrameworkMoniker(),
                assetJsonOutputDirectory: tempDirectoryForAssetJson,
                restoreDirectory: null,
                rootConfigDirectory: packageLocation.RootConfigDirectory,
                additionalFeeds: packageLocation.AdditionalFeeds);

            try
            {
                _projectRestorer.Restore(
                    tempProject,
                    packageLocation,
                    verbosity: verbosity);
            }
            finally
            {
                File.Delete(tempProject.Value);
            }

            return(ToolPackageInstance.CreateFromAssetFile(packageId, tempDirectoryForAssetJson));
        }
コード例 #7
0
        public void GivenManifestFileConflictItShouldNotAddToCache()
        {
            _toolManifestEditor.Add(
                new FilePath(_manifestFilePath),
                _packageIdA,
                new NuGetVersion(1, 1, 1),
                new[] { _toolCommandNameA });

            var toolInstallLocalCommand = GetDefaultTestToolInstallLocalCommand();

            Action a = () => toolInstallLocalCommand.Execute();

            a.ShouldThrow <GracefulException>();

            _localToolsResolverCache.TryLoad(new RestoredCommandIdentifier(
                                                 _packageIdA,
                                                 _packageVersionA,
                                                 NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                                                 Constants.AnyRid,
                                                 _toolCommandNameA),
                                             _nugetGlobalPackagesFolder,
                                             out RestoredCommand restoredCommand
                                             ).Should().BeFalse("it should not add to cache if add to manifest failed. " +
                                                                "But restore do not need to 'revert' since it just set in nuget global directory");
        }
コード例 #8
0
        public ToolInstallLocalInstaller(
            AppliedOption appliedOption,
            IToolPackageInstaller toolPackageInstaller = null)
        {
            if (appliedOption == null)
            {
                throw new ArgumentNullException(nameof(appliedOption));
            }

            _packageId      = new PackageId(appliedOption.Arguments.Single());
            _packageVersion = appliedOption.ValueOrDefault <string>("version");
            _configFilePath = appliedOption.ValueOrDefault <string>("configfile");
            _sources        = appliedOption.ValueOrDefault <string[]>("add-source");
            _verbosity      = appliedOption.SingleArgumentOrDefault("verbosity");

            if (toolPackageInstaller == null)
            {
                (IToolPackageStore,
                 IToolPackageStoreQuery,
                 IToolPackageInstaller installer)toolPackageStoresAndInstaller
                    = ToolPackageFactory.CreateToolPackageStoresAndInstaller(
                          additionalRestoreArguments: appliedOption.OptionValuesToBeForwarded());
                _toolPackageInstaller = toolPackageStoresAndInstaller.installer;
            }
            else
            {
                _toolPackageInstaller = toolPackageInstaller;
            }

            TargetFrameworkToInstall = BundledTargetFramework.GetTargetFrameworkMoniker();
        }
コード例 #9
0
ファイル: ToolPackageObtainerTests.cs プロジェクト: wei12/cli
        public void GivenAllButNoTargetFrameworkItCanDownloadThePackage()
        {
            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
            var toolsPath       = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());

            var packageObtainer =
                new ToolPackageObtainer(
                    new DirectoryPath(toolsPath),
                    GetUniqueTempProjectPathEachTest,
                    new Lazy <string>(() => BundledTargetFramework.GetTargetFrameworkMoniker()),
                    new PackageToProjectFileAdder(),
                    new ProjectRestorer());
            ToolConfigurationAndExecutableDirectory toolConfigurationAndExecutableDirectory =
                packageObtainer.ObtainAndReturnExecutablePath(
                    packageId: TestPackageId,
                    packageVersion: TestPackageVersion,
                    nugetconfig: nugetConfigPath);

            var executable = toolConfigurationAndExecutableDirectory
                             .ExecutableDirectory
                             .WithFile(
                toolConfigurationAndExecutableDirectory
                .Configuration
                .ToolAssemblyEntryPoint);

            File.Exists(executable.Value)
            .Should()
            .BeTrue(executable + " should have the executable");
        }
コード例 #10
0
        private ToolRestoreResult InstallPackages(
            ToolManifestPackage package,
            FilePath?configFile)
        {
            string targetFramework = BundledTargetFramework.GetTargetFrameworkMoniker();

            if (PackageHasBeenRestored(package, targetFramework))
            {
                return(ToolRestoreResult.Success(
                           saveToCache: Array.Empty <(RestoredCommandIdentifier, RestoredCommand)>(),
                           message: string.Format(
                               LocalizableStrings.RestoreSuccessful, package.PackageId,
                               package.Version.ToNormalizedString(), string.Join(", ", package.CommandNames))));
            }

            try
            {
                IToolPackage toolPackage =
                    _toolPackageInstaller.InstallPackageToExternalManagedLocation(
                        new PackageLocation(
                            nugetConfig: configFile,
                            additionalFeeds: _sources,
                            rootConfigDirectory: package.FirstEffectDirectory),
                        package.PackageId, ToVersionRangeWithOnlyOneVersion(package.Version), targetFramework,
                        verbosity: _verbosity);

                if (!ManifestCommandMatchesActualInPackage(package.CommandNames, toolPackage.Commands))
                {
                    return(ToolRestoreResult.Failure(
                               string.Format(LocalizableStrings.CommandsMismatch,
                                             JoinBySpaceWithQuote(package.CommandNames.Select(c => c.Value.ToString())),
                                             package.PackageId,
                                             JoinBySpaceWithQuote(toolPackage.Commands.Select(c => c.Name.ToString())))));
                }

                return(ToolRestoreResult.Success(
                           saveToCache: toolPackage.Commands.Select(command => (
                                                                        new RestoredCommandIdentifier(
                                                                            toolPackage.Id,
                                                                            toolPackage.Version,
                                                                            NuGetFramework.Parse(targetFramework),
                                                                            Constants.AnyRid,
                                                                            command.Name),
                                                                        command)).ToArray(),
                           message: string.Format(
                               LocalizableStrings.RestoreSuccessful,
                               package.PackageId,
                               package.Version.ToNormalizedString(),
                               string.Join(" ", package.CommandNames))));
            }
            catch (ToolPackageException e)
            {
                return(ToolRestoreResult.Failure(package.PackageId, e));
            }
        }
コード例 #11
0
        public void GivenAllButNoTargetFrameworkItCanDownloadThePackage(bool testMockBehaviorIsInSync)
        {
            var reporter        = new BufferedReporter();
            var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed();
            var toolsPath       = Path.Combine(Directory.GetCurrentDirectory(), Path.GetRandomFileName());

            IToolPackageObtainer packageObtainer;

            if (testMockBehaviorIsInSync)
            {
                packageObtainer = new ToolPackageObtainerMock(additionalFeeds:
                                                              new List <MockFeed>
                {
                    new MockFeed
                    {
                        Type     = MockFeedType.ExplicitNugetConfig,
                        Uri      = nugetConfigPath.Value,
                        Packages = new List <MockFeedPackage>
                        {
                            new MockFeedPackage
                            {
                                PackageId = TestPackageId,
                                Version   = "1.0.4"
                            }
                        }
                    }
                },
                                                              toolsPath: toolsPath);
            }
            else
            {
                packageObtainer = new ToolPackageObtainer(
                    new DirectoryPath(toolsPath),
                    new DirectoryPath("no such path"),
                    GetUniqueTempProjectPathEachTest,
                    new Lazy <string>(() => BundledTargetFramework.GetTargetFrameworkMoniker()),
                    new ProjectRestorer(reporter));
            }
            ToolConfigurationAndExecutablePath toolConfigurationAndExecutablePath =
                packageObtainer.ObtainAndReturnExecutablePath(
                    packageId: TestPackageId,
                    packageVersion: TestPackageVersion,
                    nugetconfig: nugetConfigPath);

            reporter.Lines.Should().BeEmpty();

            var executable = toolConfigurationAndExecutablePath.Executable;

            File.Exists(executable.Value)
            .Should()
            .BeTrue(executable + " should have the executable");

            File.Delete(executable.Value);
        }
コード例 #12
0
        public void VersionCommandDisplaysCorrectVersion()
        {
            var filePath = Path.Combine(
                AppContext.BaseDirectory,
                "ExpectedTargetFrameworkMoniker.txt");
            var targetFrameworkMoniker = GetTargetFrameworkMonikerFromFile(filePath);
            var shortFolderName        = NuGetFramework
                                         .Parse(targetFrameworkMoniker)
                                         .GetShortFolderName();

            BundledTargetFramework
            .GetTargetFrameworkMoniker()
            .Should().Be(shortFolderName);
        }
コード例 #13
0
        public void ItCanResolveAmbiguityCausedByPrefixDotnetDash()
        {
            _fileSystem.File.WriteAllText(Path.Combine(_testDirectoryRoot, ManifestFilename),
                                          _jsonContentWithDotnetDash);
            ToolManifestFinder toolManifest =
                new ToolManifestFinder(new DirectoryPath(_testDirectoryRoot), _fileSystem);

            var fakeExecutableA       = _nugetGlobalPackagesFolder.WithFile("fakeExecutable-a.dll");
            var fakeExecutableDotnetA = _nugetGlobalPackagesFolder.WithFile("fakeExecutable-a.dll");

            _fileSystem.Directory.CreateDirectory(_nugetGlobalPackagesFolder.Value);
            _fileSystem.File.CreateEmptyFile(fakeExecutableA.Value);
            _fileSystem.File.CreateEmptyFile(fakeExecutableDotnetA.Value);
            _localToolsResolverCache.Save(
                new Dictionary <RestoredCommandIdentifier, RestoredCommand>
            {
                [new RestoredCommandIdentifier(
                     new PackageId("local.tool.console.a"),
                     NuGetVersion.Parse("1.0.4"),
                     NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                     Constants.AnyRid,
                     new ToolCommandName("a"))]
                    = new RestoredCommand(new ToolCommandName("a"), "dotnet", fakeExecutableA),
                [new RestoredCommandIdentifier(
                     new PackageId("local.tool.console.dotnet.a"),
                     NuGetVersion.Parse("1.0.4"),
                     NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                     Constants.AnyRid,
                     new ToolCommandName("dotnet-a"))]
                    = new RestoredCommand(new ToolCommandName("dotnet-a"), "dotnet", fakeExecutableDotnetA)
            }, _nugetGlobalPackagesFolder);

            var localToolsCommandResolver = new LocalToolsCommandResolver(
                toolManifest,
                _localToolsResolverCache,
                _fileSystem,
                _nugetGlobalPackagesFolder);

            localToolsCommandResolver.Resolve(new CommandResolverArguments()
            {
                CommandName = "dotnet-a",
            }).Args.Trim('"').Should().Be(fakeExecutableA.Value);

            localToolsCommandResolver.Resolve(new CommandResolverArguments()
            {
                CommandName = "dotnet-dotnet-a",
            }).Args.Trim('"').Should().Be(fakeExecutableDotnetA.Value);
        }
コード例 #14
0
        public void WhenManifestPackageAreFromDifferentDirectoryItCanFindTheRightNugetConfigAndSaveToCache()
        {
            IToolManifestFinder manifestFileFinder =
                new MockManifestFileFinder(new[]
            {
                new ToolManifestPackage(_packageIdA, _packageVersionA,
                                        new[] { _toolCommandNameA },
                                        new DirectoryPath(Path.GetDirectoryName(_nugetConfigUnderTestRoot))),
                new ToolManifestPackage(_packageIdB, _packageVersionB,
                                        new[] { _toolCommandNameB },
                                        new DirectoryPath(Path.GetDirectoryName(_nugetConfigUnderSubDir)))
            });

            ToolRestoreCommand toolRestoreCommand = new ToolRestoreCommand(_appliedCommand,
                                                                           _parseResult,
                                                                           _toolPackageInstallerMock,
                                                                           manifestFileFinder,
                                                                           _localToolsResolverCache,
                                                                           _fileSystem,
                                                                           _nugetGlobalPackagesFolder,
                                                                           _reporter
                                                                           );

            toolRestoreCommand.Execute().Should()
            .Be(0, "if nuget probed from sub dir, it will find only the nuget.config under sub dir. " +
                "And it does not have the feed to package A. However, since package A is set in " +
                "manifest file under repository root, nuget should prob from manifest file directory " +
                "and there is another nuget.config set beside the manifest file under repository root");

            _localToolsResolverCache.TryLoad(
                new RestoredCommandIdentifier(
                    _packageIdA,
                    _packageVersionA,
                    NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                    Constants.AnyRid,
                    _toolCommandNameA), _nugetGlobalPackagesFolder, out RestoredCommand _)
            .Should().BeTrue();

            _localToolsResolverCache.TryLoad(
                new RestoredCommandIdentifier(
                    _packageIdB,
                    _packageVersionB,
                    NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                    Constants.AnyRid,
                    _toolCommandNameB), _nugetGlobalPackagesFolder, out RestoredCommand _)
            .Should().BeTrue();
        }
コード例 #15
0
        private void AssertDefaultInstallSuccess()
        {
            var manifestPackages = _toolManifestFinder.Find();

            manifestPackages.Should().HaveCount(1);
            var addedPackage = manifestPackages.Single();

            _localToolsResolverCache.TryLoad(new RestoredCommandIdentifier(
                                                 addedPackage.PackageId,
                                                 addedPackage.Version,
                                                 NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                                                 Constants.AnyRid,
                                                 addedPackage.CommandNames.Single()),
                                             out RestoredCommand restoredCommand
                                             ).Should().BeTrue();

            _fileSystem.File.Exists(restoredCommand.Executable.Value);
        }
コード例 #16
0
        public void ItCanFindToolExecutable()
        {
            var          toolCommand     = "a";
            NuGetVersion packageVersionA = NuGetVersion.Parse("1.0.4");

            _fileSystem.File.WriteAllText(Path.Combine(_testDirectoryRoot, ManifestFilename),
                                          _jsonContent.Replace("$TOOLCOMMAND$", toolCommand));
            ToolManifestFinder toolManifest =
                new ToolManifestFinder(new DirectoryPath(_testDirectoryRoot), _fileSystem);
            ToolCommandName toolCommandNameA = new ToolCommandName(toolCommand);
            var             fakeExecutable   = _nugetGlobalPackagesFolder.WithFile("fakeExecutable.dll");

            _fileSystem.Directory.CreateDirectory(_nugetGlobalPackagesFolder.Value);
            _fileSystem.File.CreateEmptyFile(fakeExecutable.Value);
            _localToolsResolverCache.Save(
                new Dictionary <RestoredCommandIdentifier, RestoredCommand>
            {
                [new RestoredCommandIdentifier(
                     new PackageId("local.tool.console.a"),
                     packageVersionA,
                     NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                     Constants.AnyRid,
                     toolCommandNameA)]
                    = new RestoredCommand(toolCommandNameA, "dotnet", fakeExecutable)
            }, _nugetGlobalPackagesFolder);

            var localToolsCommandResolver = new LocalToolsCommandResolver(
                toolManifest,
                _localToolsResolverCache,
                _fileSystem,
                _nugetGlobalPackagesFolder);

            var result = localToolsCommandResolver.Resolve(new CommandResolverArguments()
            {
                CommandName = "dotnet-a",
            });

            result.Should().NotBeNull();

            var commandPath = result.Args.Trim('"');

            _fileSystem.File.Exists(commandPath).Should().BeTrue("the following path exists: " + commandPath);
            commandPath.Should().Be(fakeExecutable.Value);
        }
コード例 #17
0
        public void WhenNuGetGlobalPackageLocationIsCleanedAfterRestoreItShowError()
        {
            ToolCommandName toolCommandNameA = new ToolCommandName("a");
            NuGetVersion    packageVersionA  = NuGetVersion.Parse("1.0.4");

            _fileSystem.File.WriteAllText(Path.Combine(_testDirectoryRoot, ManifestFilename),
                                          _jsonContent.Replace("$TOOLCOMMAND$", toolCommandNameA.Value));
            ToolManifestFinder toolManifest =
                new ToolManifestFinder(new DirectoryPath(_testDirectoryRoot), _fileSystem);

            var fakeExecutable = _nugetGlobalPackagesFolder.WithFile("fakeExecutable.dll");

            _fileSystem.Directory.CreateDirectory(_nugetGlobalPackagesFolder.Value);
            _fileSystem.File.CreateEmptyFile(fakeExecutable.Value);
            _localToolsResolverCache.Save(
                new Dictionary <RestoredCommandIdentifier, RestoredCommand>
            {
                [new RestoredCommandIdentifier(
                     new PackageId("local.tool.console.a"),
                     packageVersionA,
                     NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                     Constants.AnyRid,
                     toolCommandNameA)]
                    = new RestoredCommand(toolCommandNameA, "dotnet", fakeExecutable)
            }, _nugetGlobalPackagesFolder);

            var localToolsCommandResolver = new LocalToolsCommandResolver(
                toolManifest,
                _localToolsResolverCache,
                _fileSystem,
                _nugetGlobalPackagesFolder);

            _fileSystem.File.Delete(fakeExecutable.Value);

            Action action = () => localToolsCommandResolver.Resolve(new CommandResolverArguments()
            {
                CommandName = $"dotnet-{toolCommandNameA.ToString()}",
            });

            action.ShouldThrow <GracefulException>(string.Format(CommandFactory.LocalizableStrings.NeedRunToolRestore,
                                                                 toolCommandNameA.ToString()));
        }
コード例 #18
0
        public void WhenSomePackageFailedToRestoreItCanRestorePartiallySuccessful()
        {
            IToolManifestFinder manifestFinder =
                new MockManifestFinder(new[]
            {
                new ToolManifestPackage(_packageIdA, _packageVersionA,
                                        new[] { _toolCommandNameA },
                                        new DirectoryPath(_temporaryDirectory)),
                new ToolManifestPackage(new PackageId("non-exists"), NuGetVersion.Parse("1.0.0"),
                                        new[] { new ToolCommandName("non-exists") },
                                        new DirectoryPath(_temporaryDirectory))
            });

            ToolRestoreCommand toolRestoreCommand = new ToolRestoreCommand(_appliedCommand,
                                                                           _parseResult,
                                                                           _toolPackageInstallerMock,
                                                                           manifestFinder,
                                                                           _localToolsResolverCache,
                                                                           _fileSystem,
                                                                           _nugetGlobalPackagesFolder,
                                                                           _reporter
                                                                           );

            int executeResult = toolRestoreCommand.Execute();

            _reporter.Lines.Should()
            .Contain(l => l.Contains(string.Format(LocalizableStrings.PackageFailedToRestore,
                                                   "non-exists", "")));

            _reporter.Lines.Should().Contain(l => l.Contains(LocalizableStrings.RestorePartiallyFailed));

            executeResult.Should().Be(1);

            _localToolsResolverCache.TryLoad(
                new RestoredCommandIdentifier(
                    _packageIdA,
                    _packageVersionA,
                    NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                    Constants.AnyRid,
                    _toolCommandNameA), _nugetGlobalPackagesFolder, out _)
            .Should().BeTrue("Existing package will succeed despite other package failed");
        }
コード例 #19
0
        private void AssertUpdateSuccess(FilePath?manifestFile = null, NuGetVersion packageVersion = null)
        {
            packageVersion ??= _packageNewVersionA;
            IReadOnlyCollection <ToolManifestPackage> manifestPackages = _toolManifestFinder.Find(manifestFile);

            manifestPackages.Should().HaveCount(1);
            ToolManifestPackage addedPackage = manifestPackages.Single();

            addedPackage.Version.Should().Be(packageVersion);
            _localToolsResolverCache.TryLoad(new RestoredCommandIdentifier(
                                                 addedPackage.PackageId,
                                                 addedPackage.Version,
                                                 NuGetFramework.Parse(BundledTargetFramework.GetTargetFrameworkMoniker()),
                                                 Constants.AnyRid,
                                                 addedPackage.CommandNames.Single()),
                                             out RestoredCommand restoredCommand
                                             ).Should().BeTrue();

            _fileSystem.File.Exists(restoredCommand.Executable.Value);
        }
コード例 #20
0
        public override int Execute()
        {
            if (_configFilePath != null && !File.Exists(_configFilePath))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.NuGetConfigurationFileDoesNotExist,
                              Path.GetFullPath(_configFilePath)));
            }

            VersionRange versionRange = null;

            if (!string.IsNullOrEmpty(_packageVersion) && !VersionRange.TryParse(_packageVersion, out versionRange))
            {
                throw new GracefulException(
                          string.Format(
                              LocalizableStrings.InvalidNuGetVersionRange,
                              _packageVersion));
            }

            FilePath?configFile = null;

            if (_configFilePath != null)
            {
                configFile = new FilePath(_configFilePath);
            }

            string targetFramework = BundledTargetFramework.GetTargetFrameworkMoniker();

            try
            {
                FilePath manifestFile = GetManifestFilePath();

                IToolPackage toolDownloadedPackage =
                    _toolPackageInstaller.InstallPackageToExternalManagedLocation(
                        new PackageLocation(
                            nugetConfig: configFile,
                            additionalFeeds: _sources,
                            rootConfigDirectory: manifestFile.GetDirectoryPath()),
                        _packageId,
                        versionRange,
                        targetFramework,
                        verbosity: _verbosity);

                _toolManifestEditor.Add(
                    manifestFile,
                    toolDownloadedPackage.Id,
                    toolDownloadedPackage.Version,
                    toolDownloadedPackage.Commands.Select(c => c.Name).ToArray());

                foreach (var restoredCommand in toolDownloadedPackage.Commands)
                {
                    _localToolsResolverCache.Save(
                        new Dictionary <RestoredCommandIdentifier, RestoredCommand>
                    {
                        [new RestoredCommandIdentifier(
                             toolDownloadedPackage.Id,
                             toolDownloadedPackage.Version,
                             NuGetFramework.Parse(targetFramework),
                             Constants.AnyRid,
                             restoredCommand.Name)] =
                            restoredCommand
                    });
                }

                _reporter.WriteLine(
                    string.Format(
                        LocalizableStrings.LocalToolInstallationSucceeded,
                        string.Join(", ", toolDownloadedPackage.Commands.Select(c => c.Name)),
                        toolDownloadedPackage.Id,
                        toolDownloadedPackage.Version.ToNormalizedString(),
                        manifestFile.Value).Green());

                return(0);
            }
            catch (Exception ex) when(InstallToolCommandLowLevelErrorConverter.ShouldConvertToUserFacingError(ex))
            {
                throw new GracefulException(
                          messages: InstallToolCommandLowLevelErrorConverter.GetUserFacingMessages(ex, _packageId),
                          verboseMessages: new[] { ex.ToString() },
                          isUserError: false);
            }
        }
コード例 #21
0
ファイル: ToolPackageInstaller.cs プロジェクト: mikkelbu/cli
        public IToolPackage InstallPackage(
            string packageId,
            string packageVersion  = null,
            string targetFramework = null,
            FilePath?nugetConfig   = null,
            string source          = null,
            string verbosity       = null)
        {
            if (packageId == null)
            {
                throw new ArgumentNullException(nameof(packageId));
            }

            var    packageRootDirectory = _store.Root.WithSubDirectories(packageId);
            string rollbackDirectory    = null;

            return(TransactionalAction.Run <IToolPackage>(
                       action: () => {
                try
                {
                    var stageDirectory = _store.Root.WithSubDirectories(StagingDirectory, Path.GetRandomFileName());
                    Directory.CreateDirectory(stageDirectory.Value);
                    rollbackDirectory = stageDirectory.Value;

                    var tempProject = CreateTempProject(
                        packageId: packageId,
                        packageVersion: packageVersion,
                        targetFramework: targetFramework ?? BundledTargetFramework.GetTargetFrameworkMoniker(),
                        restoreDirectory: stageDirectory);

                    try
                    {
                        _projectRestorer.Restore(
                            tempProject,
                            stageDirectory,
                            nugetConfig,
                            source,
                            verbosity);
                    }
                    finally
                    {
                        File.Delete(tempProject.Value);
                    }

                    packageVersion = Path.GetFileName(
                        Directory.EnumerateDirectories(
                            stageDirectory.WithSubDirectories(packageId).Value).Single());

                    var packageDirectory = packageRootDirectory.WithSubDirectories(packageVersion);
                    if (Directory.Exists(packageDirectory.Value))
                    {
                        throw new ToolPackageException(
                            string.Format(
                                CommonLocalizableStrings.ToolPackageConflictPackageId,
                                packageId,
                                packageVersion));
                    }

                    Directory.CreateDirectory(packageRootDirectory.Value);
                    Directory.Move(stageDirectory.Value, packageDirectory.Value);
                    rollbackDirectory = packageDirectory.Value;

                    return new ToolPackageInstance(
                        _store,
                        packageId,
                        packageVersion,
                        packageDirectory);
                }
                catch (Exception ex) when(ex is UnauthorizedAccessException || ex is IOException)
                {
                    throw new ToolPackageException(
                        string.Format(
                            CommonLocalizableStrings.FailedToInstallToolPackage,
                            packageId,
                            ex.Message),
                        ex);
                }
            },
                       rollback: () => {
                if (!string.IsNullOrEmpty(rollbackDirectory) && Directory.Exists(rollbackDirectory))
                {
                    Directory.Delete(rollbackDirectory, true);
                }

                // Delete the root if it is empty
                if (Directory.Exists(packageRootDirectory.Value) &&
                    !Directory.EnumerateFileSystemEntries(packageRootDirectory.Value).Any())
                {
                    Directory.Delete(packageRootDirectory.Value, false);
                }
            }));
        }
コード例 #22
0
        public override int Execute()
        {
            FilePath?customManifestFileLocation = GetCustomManifestFileLocation();

            FilePath?configFile = null;

            if (_configFilePath != null)
            {
                configFile = new FilePath(_configFilePath);
            }

            IReadOnlyCollection <ToolManifestPackage> packagesFromManifest;

            try
            {
                packagesFromManifest = _toolManifestFinder.Find(customManifestFileLocation);
            }
            catch (ToolManifestCannotBeFoundException e)
            {
                _reporter.WriteLine(e.Message.Yellow());
                return(0);
            }

            Dictionary <RestoredCommandIdentifier, RestoredCommand> dictionary =
                new Dictionary <RestoredCommandIdentifier, RestoredCommand>();

            Dictionary <PackageId, ToolPackageException> toolPackageExceptions =
                new Dictionary <PackageId, ToolPackageException>();

            List <string> errorMessages   = new List <string>();
            List <string> successMessages = new List <string>();

            foreach (var package in packagesFromManifest)
            {
                string targetFramework = BundledTargetFramework.GetTargetFrameworkMoniker();

                if (PackageHasBeenRestored(package, targetFramework))
                {
                    successMessages.Add(string.Format(
                                            LocalizableStrings.RestoreSuccessful, package.PackageId,
                                            package.Version.ToNormalizedString(), string.Join(", ", package.CommandNames)));
                    continue;
                }

                try
                {
                    IToolPackage toolPackage =
                        _toolPackageInstaller.InstallPackageToExternalManagedLocation(
                            new PackageLocation(
                                nugetConfig: configFile,
                                additionalFeeds: _sources,
                                rootConfigDirectory: package.FirstEffectDirectory),
                            package.PackageId, ToVersionRangeWithOnlyOneVersion(package.Version), targetFramework,
                            verbosity: _verbosity);

                    if (!ManifestCommandMatchesActualInPackage(package.CommandNames, toolPackage.Commands))
                    {
                        errorMessages.Add(
                            string.Format(LocalizableStrings.CommandsMismatch,
                                          JoinBySpaceWithQuote(package.CommandNames.Select(c => c.Value.ToString())),
                                          package.PackageId,
                                          JoinBySpaceWithQuote(toolPackage.Commands.Select(c => c.Name.ToString()))));
                    }

                    foreach (RestoredCommand command in toolPackage.Commands)
                    {
                        dictionary.Add(
                            new RestoredCommandIdentifier(
                                toolPackage.Id,
                                toolPackage.Version,
                                NuGetFramework.Parse(targetFramework),
                                Constants.AnyRid,
                                command.Name),
                            command);
                    }

                    successMessages.Add(string.Format(
                                            LocalizableStrings.RestoreSuccessful, package.PackageId,
                                            package.Version.ToNormalizedString(), string.Join(" ", package.CommandNames)));
                }
                catch (ToolPackageException e)
                {
                    toolPackageExceptions.Add(package.PackageId, e);
                }
            }

            EnsureNoCommandNameCollision(dictionary);

            _localToolsResolverCache.Save(dictionary, _nugetGlobalPackagesFolder);

            return(PrintConclusionAndReturn(dictionary.Count() > 0, toolPackageExceptions, errorMessages, successMessages));
        }
コード例 #23
0
        public IToolPackage InstallPackage(
            PackageLocation packageLocation,
            PackageId packageId,
            VersionRange versionRange = null,
            string targetFramework    = null,
            string verbosity          = null)
        {
            var    packageRootDirectory = _store.GetRootPackageDirectory(packageId);
            string rollbackDirectory    = null;

            return(TransactionalAction.Run <IToolPackage>(
                       action: () => {
                try
                {
                    var stageDirectory = _store.GetRandomStagingDirectory();
                    Directory.CreateDirectory(stageDirectory.Value);
                    rollbackDirectory = stageDirectory.Value;

                    var tempProject = CreateTempProject(
                        packageId: packageId,
                        versionRange: versionRange,
                        targetFramework: targetFramework ?? BundledTargetFramework.GetTargetFrameworkMoniker(),
                        restoreDirectory: stageDirectory,
                        assetJsonOutputDirectory: stageDirectory,
                        rootConfigDirectory: packageLocation.RootConfigDirectory,
                        additionalFeeds: packageLocation.AdditionalFeeds);

                    try
                    {
                        _projectRestorer.Restore(
                            tempProject,
                            packageLocation,
                            verbosity: verbosity);
                    }
                    finally
                    {
                        File.Delete(tempProject.Value);
                    }

                    var version = _store.GetStagedPackageVersion(stageDirectory, packageId);
                    var packageDirectory = _store.GetPackageDirectory(packageId, version);
                    if (Directory.Exists(packageDirectory.Value))
                    {
                        throw new ToolPackageException(
                            string.Format(
                                CommonLocalizableStrings.ToolPackageConflictPackageId,
                                packageId,
                                version.ToNormalizedString()));
                    }

                    Directory.CreateDirectory(packageRootDirectory.Value);
                    FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(stageDirectory.Value, packageDirectory.Value));
                    rollbackDirectory = packageDirectory.Value;

                    return new ToolPackageInstance(packageId, version, packageDirectory);
                }
                catch (Exception ex) when(ex is UnauthorizedAccessException || ex is IOException)
                {
                    throw new ToolPackageException(
                        string.Format(
                            CommonLocalizableStrings.FailedToInstallToolPackage,
                            packageId,
                            ex.Message),
                        ex);
                }
            },
                       rollback: () => {
                if (!string.IsNullOrEmpty(rollbackDirectory) && Directory.Exists(rollbackDirectory))
                {
                    Directory.Delete(rollbackDirectory, true);
                }

                // Delete the root if it is empty
                if (Directory.Exists(packageRootDirectory.Value) &&
                    !Directory.EnumerateFileSystemEntries(packageRootDirectory.Value).Any())
                {
                    Directory.Delete(packageRootDirectory.Value, false);
                }
            }));
        }
コード例 #24
0
        public override int Execute()
        {
            FilePath?customManifestFileLocation = GetCustomManifestFileLocation();

            FilePath?configFile = null;

            if (_configFilePath != null)
            {
                configFile = new FilePath(_configFilePath);
            }

            IReadOnlyCollection <ToolManifestPackage> packagesFromManifest;

            try
            {
                packagesFromManifest = _toolManifestFinder.Find(customManifestFileLocation);
            }
            catch (ToolManifestCannotFindException e)
            {
                _reporter.WriteLine(e.Message.Yellow());
                return(0);
            }

            Dictionary <RestoredCommandIdentifier, RestoredCommand> dictionary =
                new Dictionary <RestoredCommandIdentifier, RestoredCommand>();

            Dictionary <PackageId, ToolPackageException> toolPackageExceptions =
                new Dictionary <PackageId, ToolPackageException>();
            List <string> errorMessages = new List <string>();

            foreach (var package in packagesFromManifest)
            {
                string targetFramework = BundledTargetFramework.GetTargetFrameworkMoniker();

                try
                {
                    IToolPackage toolPackage =
                        _toolPackageInstaller.InstallPackageToExternalManagedLocation(
                            new PackageLocation(
                                nugetConfig: configFile,
                                additionalFeeds: _sources),
                            package.PackageId, ToVersionRangeWithOnlyOneVersion(package.Version), targetFramework,
                            verbosity: _verbosity);

                    if (!ManifestCommandMatchesActualInPackage(package.CommandNames, toolPackage.Commands))
                    {
                        errorMessages.Add(
                            string.Format(LocalizableStrings.CommandsMismatch,
                                          package.PackageId,
                                          JoinBySpaceWithQuote(toolPackage.Commands.Select(c => c.Name.ToString())),
                                          JoinBySpaceWithQuote(package.CommandNames.Select(c => c.Value.ToString()))));
                    }

                    foreach (RestoredCommand command in toolPackage.Commands)
                    {
                        dictionary.Add(
                            new RestoredCommandIdentifier(
                                toolPackage.Id,
                                toolPackage.Version,
                                NuGetFramework.Parse(targetFramework),
                                "any",
                                command.Name),
                            command);
                    }
                }
                catch (ToolPackageException e)
                {
                    toolPackageExceptions.Add(package.PackageId, e);
                }
            }

            EnsureNoCommandNameCollision(dictionary);

            _localToolsResolverCache.Save(dictionary, _nugetGlobalPackagesFolder);

            if (toolPackageExceptions.Any() || errorMessages.Any())
            {
                var partialOrTotalFailed = dictionary.Count() > 0
                    ? LocalizableStrings.RestorePartiallySuccessful
                    : LocalizableStrings.RestoreFailed;

                _errorReporter.WriteLine(partialOrTotalFailed +
                                         Environment.NewLine +
                                         string.Join(
                                             Environment.NewLine,
                                             CreateErrorMessage(toolPackageExceptions).Concat(errorMessages)));

                return(1);
            }

            return(0);
        }