/// <summary> /// Restore a DependencyGraphSpec /// </summary> public static async Task <List <RestoreSummary> > RunRestore(DependencyGraphSpec input, SimpleTestPathContext pathContext, ILogger logger) { var providerCache = new RestoreCommandProvidersCache(); var sources = new List <string>() { pathContext.PackageSource }; using (var cacheContext = new SourceCacheContext()) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = false, GlobalPackagesFolder = pathContext.UserPackagesFolder, Sources = sources, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources.Select(s => new PackageSource(s)))), PreLoadedRequestProviders = new List <IPreLoadedRestoreRequestProvider>() { new DependencyGraphSpecRequestProvider(providerCache, input) } }; var summaries = await RestoreRunner.Run(restoreContext); return(summaries.ToList()); } }
public static async Task <IReadOnlyList <RestoreSummary> > RunRestore( SimpleTestPathContext pathContext, TestLogger logger, List <PackageSource> sources, DependencyGraphSpec dgFile, SourceCacheContext cacheContext) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = true, GlobalPackagesFolder = pathContext.UserPackagesFolder, Sources = new List <string>() { pathContext.PackageSource }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), PreLoadedRequestProviders = new List <IPreLoadedRestoreRequestProvider>() { new DependencyGraphSpecRequestProvider(new RestoreCommandProvidersCache(), dgFile) } }; return(await RestoreRunner.Run(restoreContext)); }
public async Task RestoreRunner_WarnIfNoProject() { // If an input folder is provided to RestoreRunner that doesn't contain a project, // it should report an error. using (var workingDir = TestFileSystemUtility.CreateRandomTestFolder()) { // Arrange var logger = new TestLogger(); var providerCache = new RestoreCommandProvidersCache(); var restoreContext = new RestoreArgs() { CacheContext = new SourceCacheContext(), DisableParallel = true, Inputs = new List <string>() { workingDir }, Log = logger, RequestProviders = new List <IRestoreRequestProvider>() { new ProjectJsonRestoreRequestProvider(providerCache) } }; // Act var summaries = await RestoreRunner.Run(restoreContext); // Assert Assert.Equal(0, summaries.Count); var matchingError = logger.Messages.ToList().Find(error => error.Contains(workingDir)); Assert.NotNull(matchingError); } }
public override bool Execute() { var args = new RestoreArgs { Inputs = Inputs.Select(item => item.ItemSpec).ToList(), ConfigFile = ConfigFile, GlobalPackagesFolder = PackagesDir, Sources = new List <string>(), FallbackSources = new List <string>(), CacheContext = new SourceCacheContext(), RequestProviders = new List <IRestoreRequestProvider> { new ProjectJsonRestoreRequestProvider(new RestoreCommandProvidersCache()) }, Log = new NugetMsBuildLogger(new TaskLoggingHelper(this)) }; RestoreRunner.Run(args).Wait(); return(!Log.HasLoggedErrors); }
private async Task <bool> ExecuteAsync(Common.ILogger log) { if (RestoreGraphItems.Length < 1) { log.LogWarning(Strings.NoProjectsProvidedToTask); return(true); } // Set user agent and connection settings. ConfigureProtocol(); // Convert to the internal wrapper var wrappedItems = RestoreGraphItems.Select(MSBuildUtility.WrapMSBuildItem); //var graphLines = RestoreGraphItems; var providerCache = new RestoreCommandProvidersCache(); using (var cacheContext = new SourceCacheContext()) { cacheContext.NoCache = RestoreNoCache; cacheContext.IgnoreFailedSources = RestoreIgnoreFailedSources; // Pre-loaded request provider containing the graph file var providers = new List <IPreLoadedRestoreRequestProvider>(); var dgFile = MSBuildRestoreUtility.GetDependencySpec(wrappedItems); if (dgFile.Restore.Count < 1) { // Restore will fail if given no inputs, but here we should skip it and provide a friendly message. log.LogMinimal(Strings.NoProjectsToRestore); return(true); } // Add all child projects if (RestoreRecursive) { BuildTasksUtility.AddAllProjectsForRestore(dgFile); } providers.Add(new DependencyGraphSpecRequestProvider(providerCache, dgFile)); var defaultSettings = Settings.LoadDefaultSettings(root: null, configFileName: null, machineWideSettings: null); var sourceProvider = new CachingSourceProvider(new PackageSourceProvider(defaultSettings)); var restoreContext = new RestoreArgs() { CacheContext = cacheContext, LockFileVersion = LockFileFormat.Version, ConfigFile = MSBuildStringUtility.TrimAndGetNullForEmpty(RestoreConfigFile), DisableParallel = RestoreDisableParallel, GlobalPackagesFolder = RestorePackagesPath, Log = log, MachineWideSettings = new XPlatMachineWideSetting(), PreLoadedRequestProviders = providers, CachingSourceProvider = sourceProvider }; if (!string.IsNullOrEmpty(RestoreSources)) { var sources = MSBuildStringUtility.Split(RestoreSources); restoreContext.Sources.AddRange(sources); } if (restoreContext.DisableParallel) { HttpSourceResourceProvider.Throttle = SemaphoreSlimThrottle.CreateBinarySemaphore(); } var restoreSummaries = await RestoreRunner.Run(restoreContext); // Summary RestoreSummary.Log(log, restoreSummaries); return(restoreSummaries.All(x => x.Success)); } }
public async Task RestoreRunner_RestoreWithRuntime() { // Arrange var sources = new List <PackageSource>(); var project1Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { } } }"; using (var workingDir = TestDirectory.Create()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); packagesDir.Create(); packageSource.Create(); project1.Create(); sources.Add(new PackageSource(packageSource.FullName)); File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json); var specPath1 = Path.Combine(project1.FullName, "project.json"); var spec1 = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1); var logger = new TestLogger(); var lockPath1 = Path.Combine(project1.FullName, "project.lock.json"); var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList(); var providerCache = new RestoreCommandProvidersCache(); using (var cacheContext = new SourceCacheContext()) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, Sources = new List <string>() { packageSource.FullName }, Inputs = new List <string>() { specPath1 }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), RequestProviders = new List <IRestoreRequestProvider>() { new ProjectJsonRestoreRequestProvider(providerCache) } }; restoreContext.Runtimes.Add("linux-x86"); // Act var summaries = await RestoreRunner.Run(restoreContext); var success = summaries.All(s => s.Success); var lockFormat = new LockFileFormat(); var lockFile = lockFormat.Read(lockPath1); // Assert Assert.True(success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.True(lockFile.Targets.Any(graph => graph.RuntimeIdentifier == "linux-x86")); } } }
public async Task RestoreRunner_RestoreWithExternalFile_NetCoreOutput() { // Arrange var sources = new List <PackageSource>(); var targetFrameworkInfo1 = new TargetFrameworkInformation(); targetFrameworkInfo1.FrameworkName = NuGetFramework.Parse("net45"); var frameworks1 = new[] { targetFrameworkInfo1 }; var targetFrameworkInfo2 = new TargetFrameworkInformation(); targetFrameworkInfo2.FrameworkName = NuGetFramework.Parse("net45"); var frameworks2 = new[] { targetFrameworkInfo2 }; // Create two net45 projects var spec1 = new PackageSpec(frameworks1); spec1.RestoreMetadata = new ProjectRestoreMetadata(); spec1.RestoreMetadata.ProjectUniqueName = "project1"; spec1.RestoreMetadata.ProjectName = "project1"; spec1.RestoreMetadata.ProjectStyle = ProjectStyle.PackageReference; spec1.RestoreMetadata.OriginalTargetFrameworks.Add("net45"); var spec2 = new PackageSpec(frameworks2); spec2.RestoreMetadata = new ProjectRestoreMetadata(); spec2.RestoreMetadata.ProjectUniqueName = "project2"; spec2.RestoreMetadata.ProjectName = "project2"; spec2.RestoreMetadata.ProjectStyle = ProjectStyle.PackageReference; spec2.RestoreMetadata.OriginalTargetFrameworks.Add("net45"); var specs = new[] { spec1, spec2 }; using (var workingDir = TestDirectory.Create()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); var project2 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project2")); packagesDir.Create(); packageSource.Create(); project1.Create(); project2.Create(); sources.Add(new PackageSource(packageSource.FullName)); var projPath1 = Path.Combine(project1.FullName, "project1.csproj"); var projPath2 = Path.Combine(project2.FullName, "project2.csproj"); File.WriteAllText(projPath1, string.Empty); File.WriteAllText(projPath2, string.Empty); spec1.RestoreMetadata.ProjectPath = projPath1; spec1.FilePath = projPath1; spec1.Name = "project1"; spec2.RestoreMetadata.ProjectPath = projPath2; spec2.FilePath = projPath1; spec2.Name = "project2"; var logger = new TestLogger(); var objPath1 = Path.Combine(project1.FullName, "obj"); var objPath2 = Path.Combine(project2.FullName, "obj"); spec1.RestoreMetadata.OutputPath = objPath1; spec2.RestoreMetadata.OutputPath = objPath2; spec1.RestoreMetadata.OriginalTargetFrameworks.Add("net45"); spec2.RestoreMetadata.OriginalTargetFrameworks.Add("net45"); var lockPath1 = Path.Combine(objPath1, "project.assets.json"); var lockPath2 = Path.Combine(objPath2, "project.assets.json"); // Link projects spec1.TargetFrameworks.Single().Dependencies.Add(new LibraryDependency() { LibraryRange = new LibraryRange() { Name = "project2", TypeConstraint = LibraryDependencyTarget.ExternalProject } }); spec1.RestoreMetadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(NuGetFramework.Parse("net45"))); spec1.RestoreMetadata.TargetFrameworks .Single() .ProjectReferences .Add(new ProjectRestoreReference() { ProjectPath = projPath2, ProjectUniqueName = "project2" }); // Create dg file var dgFile = new DependencyGraphSpec(); foreach (var spec in specs) { dgFile.AddRestore(spec.RestoreMetadata.ProjectName); dgFile.AddProject(spec); } var dgPath = Path.Combine(workingDir, "input.dg"); dgFile.Save(dgPath); var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList(); var providerCache = new RestoreCommandProvidersCache(); using (var cacheContext = new SourceCacheContext()) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, Sources = new List <string>() { packageSource.FullName }, Inputs = new List <string>() { dgPath }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), RequestProviders = new List <IRestoreRequestProvider>() { new DependencyGraphFileRequestProvider(providerCache) } }; // Act var summaries = await RestoreRunner.Run(restoreContext); var success = summaries.All(s => s.Success); var lockFormat = new LockFileFormat(); var lockFile1 = lockFormat.Read(lockPath1); var project2Lib = lockFile1.Libraries.First(); // Assert Assert.True(success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.True(File.Exists(lockPath1), lockPath1); Assert.True(File.Exists(lockPath2), lockPath2); Assert.Equal("project2", project2Lib.Name); } } }
public async Task RestoreRunner_BasicRestoreWithConfigFile() { // Arrange var sources = new List <PackageSource>(); var project1Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { } } }"; var configFile = @"<?xml version=""1.0"" encoding=""utf-8""?> <configuration> <packageSources> <add key=""nuget.org"" value=""{0}"" /> </packageSources> </configuration> "; using (var workingDir = TestDirectory.Create()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); packagesDir.Create(); packageSource.Create(); project1.Create(); File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json); File.WriteAllText(Path.Combine(workingDir, "NuGet.Config"), String.Format(configFile, packageSource.FullName)); var specPath1 = Path.Combine(project1.FullName, "project.json"); var spec1 = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1); var configPath = Path.Combine(workingDir, "NuGet.Config"); var logger = new TestLogger(); var lockPath = Path.Combine(project1.FullName, "project.lock.json"); var providerCache = new RestoreCommandProvidersCache(); using (var cacheContext = new SourceCacheContext()) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, ConfigFile = configPath, Inputs = new List <string>() { specPath1 }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(new List <PackageSource>())), RequestProviders = new List <IRestoreRequestProvider>() { new ProjectJsonRestoreRequestProvider(providerCache) } }; // Act var summaries = await RestoreRunner.Run(restoreContext); var summary = summaries.Single(); // Assert Assert.True(summary.Success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.Equal(1, summary.FeedsUsed.Count); Assert.True(File.Exists(lockPath), lockPath); } } }
public async Task RestoreRunner_BasicRestore_VerifyFailureWritesFiles_NETCore() { // Arrange var sources = new List <PackageSource>(); var project1Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { ""dependencies"": { ""x"": ""1.0.0"" } } } }"; using (var workingDir = TestDirectory.Create()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); packagesDir.Create(); packageSource.Create(); project1.Create(); sources.Add(new PackageSource(packageSource.FullName)); File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json); var specPath1 = Path.Combine(project1.FullName, "project.json"); var spec1 = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1); spec1.RestoreMetadata = new ProjectRestoreMetadata(); spec1.RestoreMetadata.OutputPath = Path.Combine(project1.FullName, "obj"); spec1.RestoreMetadata.ProjectStyle = ProjectStyle.PackageReference; spec1.RestoreMetadata.ProjectName = "project1"; spec1.RestoreMetadata.ProjectPath = Path.Combine(project1.FullName, "project1.csproj"); spec1.RestoreMetadata.ProjectUniqueName = spec1.RestoreMetadata.ProjectPath; spec1.RestoreMetadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(NuGetFramework.Parse("net45"))); spec1.RestoreMetadata.OriginalTargetFrameworks.Add("net45"); spec1.FilePath = spec1.RestoreMetadata.ProjectPath; var dgSpec = new DependencyGraphSpec(); dgSpec.AddProject(spec1); dgSpec.AddRestore(spec1.RestoreMetadata.ProjectUniqueName); var logger = new TestLogger(); var assetsPath = Path.Combine(project1.FullName, "obj", "project.assets.json"); var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList(); var providerCache = new RestoreCommandProvidersCache(); using (var cacheContext = new SourceCacheContext()) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, Sources = new List <string>() { packageSource.FullName }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), PreLoadedRequestProviders = new List <IPreLoadedRestoreRequestProvider>() { new DependencyGraphSpecRequestProvider(providerCache, dgSpec) } }; // Act var summaries = await RestoreRunner.Run(restoreContext); var summary = summaries.Single(); // Assert Assert.False(summary.Success); Assert.True(File.Exists(assetsPath), assetsPath); Assert.True(File.Exists(Path.Combine(project1.FullName, "obj", "project1.csproj.nuget.g.props"))); Assert.True(File.Exists(Path.Combine(project1.FullName, "obj", "project1.csproj.nuget.g.targets"))); } } }
public async Task RestoreRunner_BasicRestore_VerifyFailureWritesFiles() { // Arrange var sources = new List <PackageSource>(); var project1Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { ""dependencies"": { ""x"": ""1.0.0"" } } } }"; using (var workingDir = TestDirectory.Create()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); packagesDir.Create(); packageSource.Create(); project1.Create(); sources.Add(new PackageSource(packageSource.FullName)); File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json); var specPath1 = Path.Combine(project1.FullName, "project.json"); var spec1 = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1); var logger = new TestLogger(); var lockPath = Path.Combine(project1.FullName, "project.lock.json"); var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList(); var packageX = new SimpleTestPackageContext() { Id = "x", Version = "1.0.0" }; packageX.AddFile("build/net45/x.targets"); var packageY = new SimpleTestPackageContext("y"); packageX.Dependencies.Add(packageY); var yPath = SimpleTestPackageUtility.CreateFullPackage(packageSource.FullName, packageY); SimpleTestPackageUtility.CreateFullPackage(packageSource.FullName, packageX); // y does not exist yPath.Delete(); var providerCache = new RestoreCommandProvidersCache(); using (var cacheContext = new SourceCacheContext()) { var restoreContext = new RestoreArgs() { CacheContext = cacheContext, DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, Sources = new List <string>() { packageSource.FullName }, Inputs = new List <string>() { specPath1 }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), RequestProviders = new List <IRestoreRequestProvider>() { new ProjectJsonRestoreRequestProvider(providerCache) } }; var targetsPath = Path.Combine(project1.FullName, "project1.nuget.targets"); var propsPath = Path.Combine(project1.FullName, "project1.nuget.props"); // Act var summaries = await RestoreRunner.Run(restoreContext); var summary = summaries.Single(); var targets = TargetsUtility.GetMSBuildPackageImports(targetsPath); // Assert Assert.False(summary.Success); Assert.True(File.Exists(lockPath), lockPath); Assert.True(File.Exists(targetsPath)); Assert.False(File.Exists(propsPath)); Assert.Equal(1, targets.Count); } } }
public override async Task ExecuteCommandAsync() { if (DisableParallelProcessing) { HttpSourceResourceProvider.Throttle = SemaphoreSlimThrottle.CreateBinarySemaphore(); } CalculateEffectivePackageSaveMode(); var restoreSummaries = new List <RestoreSummary>(); _msbuildDirectory = MsBuildUtility.GetMsBuildDirectoryFromMsBuildPath(MSBuildPath, MSBuildVersion, Console); if (!string.IsNullOrEmpty(PackagesDirectory)) { PackagesDirectory = Path.GetFullPath(PackagesDirectory); } if (!string.IsNullOrEmpty(SolutionDirectory)) { SolutionDirectory = Path.GetFullPath(SolutionDirectory); } var restoreInputs = await DetermineRestoreInputsAsync(); var hasPackagesConfigFiles = restoreInputs.PackagesConfigFiles.Count > 0; var hasProjectJsonFiles = restoreInputs.RestoreV3Context.Inputs.Any(); if (!hasPackagesConfigFiles && !hasProjectJsonFiles) { Console.LogMinimal(LocalizedResourceManager.GetString(restoreInputs.RestoringWithSolutionFile ? "SolutionRestoreCommandNoPackagesConfigOrProjectJson" : "ProjectRestoreCommandNoPackagesConfigOrProjectJson")); return; } // packages.config if (hasPackagesConfigFiles) { var v2RestoreResult = await PerformNuGetV2RestoreAsync(restoreInputs); restoreSummaries.Add(v2RestoreResult); } // project.json if (hasProjectJsonFiles) { // Read the settings outside of parallel loops. ReadSettings(restoreInputs); // Check if we can restore based on the nuget.config settings CheckRequireConsent(); using (var cacheContext = new SourceCacheContext()) { cacheContext.NoCache = NoCache; cacheContext.DirectDownload = DirectDownload; var restoreContext = restoreInputs.RestoreV3Context; var providerCache = new RestoreCommandProvidersCache(); // Add restore args to the restore context restoreContext.CacheContext = cacheContext; restoreContext.DisableParallel = DisableParallelProcessing; restoreContext.ConfigFile = ConfigFile; restoreContext.MachineWideSettings = MachineWideSettings; restoreContext.Sources = Source.ToList(); restoreContext.Log = Console; restoreContext.CachingSourceProvider = GetSourceRepositoryProvider(); var packageSaveMode = EffectivePackageSaveMode; if (packageSaveMode != Packaging.PackageSaveMode.None) { restoreContext.PackageSaveMode = EffectivePackageSaveMode; } // Override packages folder var globalPackagesFolder = SettingsUtility.GetGlobalPackagesFolder(Settings); restoreContext.GlobalPackagesFolder = GetEffectiveGlobalPackagesFolder( PackagesDirectory, SolutionDirectory, restoreInputs, globalPackagesFolder); // Providers // Use the settings loaded above in ReadSettings(restoreInputs) if (restoreInputs.ProjectReferenceLookup.Restore.Count > 0) { // Remove input list, everything has been loaded already restoreContext.Inputs.Clear(); restoreContext.PreLoadedRequestProviders.Add(new DependencyGraphSpecRequestProvider( providerCache, restoreInputs.ProjectReferenceLookup, Settings)); } else { // Allow an external .dg file restoreContext.RequestProviders.Add(new DependencyGraphFileRequestProvider(providerCache)); } // Run restore var v3Summaries = await RestoreRunner.Run(restoreContext); restoreSummaries.AddRange(v3Summaries); } } // Summaries RestoreSummary.Log(Console, restoreSummaries); if (restoreSummaries.Any(x => !x.Success)) { throw new ExitCodeException(exitCode: 1); } }
public static void Register( CommandLineApplication cmdApp, Func <CommandOutputLogger> getLogger) { cmdApp.Command("restore", (Action <CommandLineApplication>)(restore => { restore.Description = Strings.Restore_Description; restore.HelpOption(XPlatUtility.HelpOption); restore.Option( CommandConstants.ForceEnglishOutputOption, Strings.ForceEnglishOutput_Description, CommandOptionType.NoValue); var sources = restore.Option( "-s|--source <source>", Strings.Restore_Switch_Source_Description, CommandOptionType.MultipleValue); var packagesDirectory = restore.Option( "--packages <packagesDirectory>", Strings.Restore_Switch_Packages_Description, CommandOptionType.SingleValue); var disableParallel = restore.Option( "--disable-parallel", Strings.Restore_Switch_DisableParallel_Description, CommandOptionType.NoValue); var fallBack = restore.Option( "-f|--fallbacksource <FEED>", Strings.Restore_Switch_Fallback_Description, CommandOptionType.MultipleValue); var configFile = restore.Option( "--configfile <file>", Strings.Restore_Switch_ConfigFile_Description, CommandOptionType.SingleValue); var noCache = restore.Option( "--no-cache", Strings.Restore_Switch_NoCache_Description, CommandOptionType.NoValue); var inferRuntimes = restore.Option( "--infer-runtimes", "Temporary option to allow NuGet to infer RIDs for legacy repositories", CommandOptionType.NoValue); var verbosity = restore.Option( XPlatUtility.VerbosityOption, Strings.Switch_Verbosity, CommandOptionType.SingleValue); var argRoot = restore.Argument( "[root]", Strings.Restore_Arg_ProjectName_Description, multipleValues: true); var ignoreFailedSources = restore.Option( "--ignore-failed-sources", Strings.Restore_Switch_IgnoreFailedSource_Description, CommandOptionType.NoValue); restore.OnExecute(async() => { var log = getLogger(); if (verbosity.HasValue()) { log.LogLevel = XPlatUtility.GetLogLevel(verbosity); } using (var cacheContext = new SourceCacheContext()) { cacheContext.NoCache = noCache.HasValue(); cacheContext.IgnoreFailedSources = ignoreFailedSources.HasValue(); var providerCache = new RestoreCommandProvidersCache(); // Ordered request providers var providers = new List <IRestoreRequestProvider>(); providers.Add(new MSBuildP2PRestoreRequestProvider(providerCache)); providers.Add(new ProjectJsonRestoreRequestProvider(providerCache)); ISettings defaultSettings = Settings.LoadDefaultSettings(root: null, configFileName: null, machineWideSettings: null); CachingSourceProvider sourceProvider = new CachingSourceProvider(new PackageSourceProvider(defaultSettings)); var restoreContext = new RestoreArgs() { CacheContext = cacheContext, LockFileVersion = LockFileFormat.Version, ConfigFile = configFile.HasValue() ? configFile.Value() : null, DisableParallel = disableParallel.HasValue(), GlobalPackagesFolder = packagesDirectory.HasValue() ? packagesDirectory.Value() : null, Inputs = new List <string>(argRoot.Values), Log = log, MachineWideSettings = new XPlatMachineWideSetting(), RequestProviders = providers, Sources = sources.Values, FallbackSources = fallBack.Values, CachingSourceProvider = sourceProvider }; if (inferRuntimes.HasValue()) { var runtimeOSname = PlatformApis.GetRuntimeOsName(); var os = PlatformApis.GetOSName(); var defaultRuntimes = RequestRuntimeUtility.GetDefaultRestoreRuntimes(os, runtimeOSname); restoreContext.FallbackRuntimes.UnionWith(defaultRuntimes); } if (restoreContext.DisableParallel) { HttpSourceResourceProvider.Throttle = SemaphoreSlimThrottle.CreateBinarySemaphore(); } var restoreSummaries = await RestoreRunner.Run(restoreContext); // Summary RestoreSummary.Log(log, restoreSummaries); return(restoreSummaries.All(x => x.Success) ? 0 : 1); } }); })); }
public override async Task ExecuteCommandAsync() { CalculateEffectivePackageSaveMode(); var restoreSummaries = new List <RestoreSummary>(); _msbuildDirectory = new Lazy <string>(() => MsBuildUtility.GetMsbuildDirectory(MSBuildVersion, Console)); if (!string.IsNullOrEmpty(PackagesDirectory)) { PackagesDirectory = Path.GetFullPath(PackagesDirectory); } if (!string.IsNullOrEmpty(SolutionDirectory)) { SolutionDirectory = Path.GetFullPath(SolutionDirectory); } var restoreInputs = DetermineRestoreInputs(); var hasPackagesConfigFiles = restoreInputs.PackagesConfigFiles.Count > 0; var hasProjectJsonFiles = restoreInputs.RestoreV3Context.Inputs.Any(); if (!hasPackagesConfigFiles && !hasProjectJsonFiles) { var message = string.Format( CultureInfo.CurrentCulture, LocalizedResourceManager.GetString("RestoreCommandNoPackagesConfigOrProjectJson")); throw new CommandLineException(message); } // packages.config if (hasPackagesConfigFiles) { var v2RestoreResult = await PerformNuGetV2RestoreAsync(restoreInputs); restoreSummaries.Add(v2RestoreResult); } // project.json if (hasProjectJsonFiles) { // Read the settings outside of parallel loops. ReadSettings(restoreInputs); // Check if we can restore based on the nuget.config settings CheckRequireConsent(); using (var cacheContext = new SourceCacheContext()) { var restoreContext = restoreInputs.RestoreV3Context; var providerCache = new RestoreCommandProvidersCache(); // Add restore args to the restore context cacheContext.NoCache = NoCache; restoreContext.CacheContext = cacheContext; restoreContext.DisableParallel = DisableParallelProcessing; restoreContext.ConfigFile = ConfigFile; restoreContext.MachineWideSettings = MachineWideSettings; restoreContext.Sources = Source.ToList(); restoreContext.Log = Console; restoreContext.CachingSourceProvider = GetSourceRepositoryProvider(); var packageSaveMode = EffectivePackageSaveMode; if (packageSaveMode != Packaging.PackageSaveMode.None) { restoreContext.PackageSaveMode = EffectivePackageSaveMode; } // Override packages folder var globalPackagesFolder = SettingsUtility.GetGlobalPackagesFolder(Settings); restoreContext.GlobalPackagesFolder = GetEffectiveGlobalPackagesFolder( PackagesDirectory, SolutionDirectory, restoreInputs, globalPackagesFolder); // Providers // Use the settings loaded above in ReadSettings(restoreInputs) restoreContext.RequestProviders.Add(new MSBuildCachedRequestProvider( providerCache, restoreInputs.ProjectReferenceLookup, Settings)); restoreContext.RequestProviders.Add(new MSBuildP2PRestoreRequestProvider(providerCache)); restoreContext.RequestProviders.Add(new ProjectJsonRestoreRequestProvider(providerCache)); // Run restore var v3Summaries = await RestoreRunner.Run(restoreContext); restoreSummaries.AddRange(v3Summaries); } } // Summaries RestoreSummary.Log(Console, restoreSummaries); if (restoreSummaries.Any(x => !x.Success)) { throw new ExitCodeException(exitCode: 1); } }
public async Task RestoreRunner_BasicRestore() { // Arrange var sources = new List <PackageSource>(); var project1Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { } } }"; using (var workingDir = TestFileSystemUtility.CreateRandomTestFolder()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); packagesDir.Create(); packageSource.Create(); project1.Create(); sources.Add(new PackageSource(packageSource.FullName)); File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json); var specPath1 = Path.Combine(project1.FullName, "project.json"); var spec1 = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1); var logger = new TestLogger(); var lockPath = Path.Combine(project1.FullName, "project.lock.json"); var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList(); var providerCache = new RestoreCommandProvidersCache(); var restoreContext = new RestoreArgs() { CacheContext = new SourceCacheContext(), DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, Sources = new List <string>() { packageSource.FullName }, Inputs = new List <string>() { specPath1 }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), RequestProviders = new List <IRestoreRequestProvider>() { new ProjectJsonRestoreRequestProvider(providerCache) } }; // Act var summaries = await RestoreRunner.Run(restoreContext); var summary = summaries.Single(); // Assert Assert.True(summary.Success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.Equal(1, summary.FeedsUsed.Count); Assert.True(File.Exists(lockPath), lockPath); } }
public async Task RestoreRunner_RestoreWithExternalFile() { // Arrange var sources = new List <PackageSource>(); var project1Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { } } }"; var project2Json = @" { ""version"": ""1.0.0"", ""description"": """", ""authors"": [ ""author"" ], ""tags"": [ """" ], ""projectUrl"": """", ""licenseUrl"": """", ""frameworks"": { ""net45"": { } } }"; using (var workingDir = TestFileSystemUtility.CreateRandomTestFolder()) { var packagesDir = new DirectoryInfo(Path.Combine(workingDir, "globalPackages")); var packageSource = new DirectoryInfo(Path.Combine(workingDir, "packageSource")); var project1 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project1")); var project2 = new DirectoryInfo(Path.Combine(workingDir, "projects", "project2")); packagesDir.Create(); packageSource.Create(); project1.Create(); project2.Create(); sources.Add(new PackageSource(packageSource.FullName)); File.WriteAllText(Path.Combine(project1.FullName, "project.json"), project1Json); File.WriteAllText(Path.Combine(project2.FullName, "project.json"), project1Json); var specPath1 = Path.Combine(project1.FullName, "project.json"); var spec1 = JsonPackageSpecReader.GetPackageSpec(project1Json, "project1", specPath1); var specPath2 = Path.Combine(project2.FullName, "project.json"); var spec2 = JsonPackageSpecReader.GetPackageSpec(project2Json, "project2", specPath2); var projPath1 = Path.Combine(project1.FullName, "project1.csproj"); var projPath2 = Path.Combine(project2.FullName, "project2.xproj"); File.WriteAllText(projPath1, string.Empty); File.WriteAllText(projPath2, string.Empty); var logger = new TestLogger(); var lockPath1 = Path.Combine(project1.FullName, "project.lock.json"); var lockPath2 = Path.Combine(project2.FullName, "project.lock.json"); var dgPath = Path.Combine(workingDir, "external.dg"); var dgContent = new StringBuilder(); dgContent.AppendLine($"#:{projPath1}"); dgContent.AppendLine($"{projPath1}|{projPath2}"); dgContent.AppendLine($"#:{projPath2}"); File.WriteAllText(dgPath, dgContent.ToString()); var sourceRepos = sources.Select(source => Repository.Factory.GetCoreV3(source.Source)).ToList(); var providerCache = new RestoreCommandProvidersCache(); var restoreContext = new RestoreArgs() { CacheContext = new SourceCacheContext(), DisableParallel = true, GlobalPackagesFolder = packagesDir.FullName, Sources = new List <string>() { packageSource.FullName }, Inputs = new List <string>() { dgPath }, Log = logger, CachingSourceProvider = new CachingSourceProvider(new TestPackageSourceProvider(sources)), RequestProviders = new List <IRestoreRequestProvider>() { new MSBuildP2PRestoreRequestProvider(providerCache), new ProjectJsonRestoreRequestProvider(providerCache) } }; // Act var summaries = await RestoreRunner.Run(restoreContext); var success = summaries.All(s => s.Success); var lockFormat = new LockFileFormat(); var lockFile1 = lockFormat.Read(lockPath1); var project2Lib = lockFile1.Libraries.First(); // Assert Assert.True(success, "Failed: " + string.Join(Environment.NewLine, logger.Messages)); Assert.True(File.Exists(lockPath1), lockPath1); Assert.True(File.Exists(lockPath2), lockPath2); Assert.Equal("project2", project2Lib.Name); } }