예제 #1
0
        /// <summary>
        /// Initialize a new instance of <see cref="NugetStore"/>.
        /// </summary>
        /// <param name="oldRootDirectory">The location of the Nuget store.</param>
        public NugetStore(string oldRootDirectory)
        {
            // Used only for versions before 3.0
            this.oldRootDirectory = oldRootDirectory;

            settings = NuGet.Configuration.Settings.LoadDefaultSettings(null);

            // Remove obsolete sources
            RemoveDeletedSources(settings, "Xenko Dev");
            // Note the space: we want to keep "Stride Dev" but not "Stride Dev {PATH}\bin\packages" anymore
            RemoveSources(settings, "Stride Dev ");

            settings.SaveToDisk();

            InstallPath = SettingsUtility.GetGlobalPackagesFolder(settings);

            var pathContext = NuGetPathContext.Create(settings);

            InstalledPathResolver = new FallbackPackagePathResolver(pathContext.UserPackageFolder, oldRootDirectory != null ? pathContext.FallbackPackageFolders.Concat(new[] { oldRootDirectory }) : pathContext.FallbackPackageFolders);
            var packageSourceProvider = new PackageSourceProvider(settings);

            var availableSources = packageSourceProvider.LoadPackageSources().Where(source => source.IsEnabled);
            var packageSources   = new List <PackageSource>();

            packageSources.AddRange(availableSources);
            PackageSources = packageSources;

            // Setup source provider as a V3 only.
            sourceRepositoryProvider = new NugetSourceRepositoryProvider(packageSourceProvider, this);
        }
예제 #2
0
        //returns the lock file, if it changed
        async Task <string> RestorePackagesInternal(
            BuildIntegratedNuGetProject project,
            CancellationToken cancellationToken)
        {
            var nugetPaths = NuGetPathContext.Create(settings);

            RestoreResult restoreResult = await BuildIntegratedRestoreUtility.RestoreAsync(
                project,
                context,
                sourceRepositories,
                nugetPaths.UserPackageFolder,
                nugetPaths.FallbackPackageFolders,
                cancellationToken);

            if (restoreResult.Success)
            {
                if (!object.Equals(restoreResult.LockFile, restoreResult.PreviousLockFile))
                {
                    return(restoreResult.LockFilePath);
                }
            }
            else
            {
                ReportRestoreError(restoreResult);
            }
            return(null);
        }
        private async Task <Uri> GetNugetUri(CancellationToken cancellationToken)
        {
            var settings = Settings.LoadDefaultSettings(null);
            var packageSourceProvider    = new PackageSourceProvider(settings);
            var sourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider, FactoryExtensionsV3.GetCoreV3(Repository.Provider));
            var package = new PackageIdentity("PostgreSql.Binaries.Lite", NuGetVersion.Parse(_pgVersion));

            var pathContext  = NuGetPathContext.Create(settings);
            var localSources = new List <string>();

            localSources.Add(pathContext.UserPackageFolder);
            localSources.AddRange(pathContext.FallbackPackageFolders);

            using (var cacheContext = new SourceCacheContext())
            {
                var repositories = localSources
                                   .Select(path => sourceRepositoryProvider.CreateRepository(new PackageSource(path), FeedType.FileSystemV3))
                                   .Concat(sourceRepositoryProvider.GetRepositories());

                foreach (var sourceRepository in repositories)
                {
                    var dependencyInfoResource = await sourceRepository.GetResourceAsync <DependencyInfoResource>();

                    var dependencyInfo = await dependencyInfoResource.ResolvePackage(
                        package, NuGetFramework.AnyFramework, cacheContext, NullLogger.Instance, cancellationToken);

                    if (dependencyInfo != null)
                    {
                        return(dependencyInfo.DownloadUri);
                    }
                }
            }

            throw new Exception("Could not find PostgreSql.Binaries.Lite package");
        }
예제 #4
0
        public void GetDescriptionShouldNotModifyTarget()
        {
            var provider = new PackageDependencyProvider(
                NuGetPathContext.Create("/foo/packages"),
                new FrameworkReferenceResolver("/foo/references"));
            var package = new LockFilePackageLibrary();

            package.Name    = "Something";
            package.Version = NuGetVersion.Parse("1.0.0");
            package.Files.Add("lib/dotnet/_._");
            package.Files.Add("runtimes/any/native/Microsoft.CSharp.CurrentVersion.targets");

            var target = new LockFileTargetLibrary();

            target.Name    = "Something";
            target.Version = package.Version;

            target.RuntimeAssemblies.Add("lib/dotnet/_._");
            target.CompileTimeAssemblies.Add("lib/dotnet/_._");
            target.NativeLibraries.Add("runtimes/any/native/Microsoft.CSharp.CurrentVersion.targets");

            var p1 = provider.GetDescription(NuGetFramework.Parse("netcoreapp1.0"), package, target);
            var p2 = provider.GetDescription(NuGetFramework.Parse("netcoreapp1.0"), package, target);

            Assert.True(p1.Compatible);
            Assert.True(p2.Compatible);

            Assert.Empty(p1.CompileTimeAssemblies);
            Assert.Empty(p1.RuntimeAssemblies);

            Assert.Empty(p2.CompileTimeAssemblies);
            Assert.Empty(p2.RuntimeAssemblies);
        }
예제 #5
0
        public void HasCompileTimePlaceholderChecksAllCompileTimeAssets()
        {
            var provider = new PackageDependencyProvider(
                NuGetPathContext.Create("/foo/packages"),
                new FrameworkReferenceResolver("/foo/references"));
            var package = new LockFilePackageLibrary();

            package.Name    = "Something";
            package.Version = NuGetVersion.Parse("1.0.0");
            package.Files.Add("lib/net46/_._");
            package.Files.Add("lib/net46/Something.dll");

            var target = new LockFileTargetLibrary();

            target.Name    = "Something";
            target.Version = package.Version;

            target.RuntimeAssemblies.Add("lib/net46/_._");
            target.RuntimeAssemblies.Add("lib/net46/Something.dll");
            target.CompileTimeAssemblies.Add("lib/net46/_._");
            target.CompileTimeAssemblies.Add("lib/net46/Something.dll");

            var p1 = provider.GetDescription(NuGetFramework.Parse("net46"), package, target);

            Assert.False(p1.HasCompileTimePlaceholder);
            Assert.Equal(1, p1.CompileTimeAssemblies.Count());
            Assert.Equal(1, p1.RuntimeAssemblies.Count());
            Assert.Equal("lib/net46/Something.dll", p1.CompileTimeAssemblies.First().Path);
            Assert.Equal("lib/net46/Something.dll", p1.RuntimeAssemblies.First().Path);
        }
예제 #6
0
        public void GetDescriptionShouldGenerateHashFileName()
        {
            // Arrange
            var provider = new PackageDependencyProvider(
                NuGetPathContext.Create("/foo/packages"),
                new FrameworkReferenceResolver("/foo/references"));
            var package = new LockFilePackageLibrary();

            package.Name    = "Something";
            package.Version = NuGetVersion.Parse("1.0.0-Beta");
            package.Files.Add("lib/dotnet/_._");
            package.Files.Add("runtimes/any/native/Microsoft.CSharp.CurrentVersion.targets");
            package.Path = "SomePath";

            var target = new LockFileTargetLibrary();

            target.Name    = "Something";
            target.Version = package.Version;

            target.RuntimeAssemblies.Add("lib/dotnet/_._");
            target.CompileTimeAssemblies.Add("lib/dotnet/_._");
            target.NativeLibraries.Add("runtimes/any/native/Microsoft.CSharp.CurrentVersion.targets");

            // Act
            var p = provider.GetDescription(NuGetFramework.Parse("netcoreapp1.0"), package, target);

            // Assert
            p.PackageLibrary.Path.Should().Be("SomePath");
            p.HashPath.Should().Be("something.1.0.0-beta.nupkg.sha512");
        }
예제 #7
0
파일: Program.cs 프로젝트: wtgodbe/cli
        private static FscCommandSpec ResolveFsc(List <string> fscArgs, string temp)
        {
            var nugetPackagesRoot = NuGetPathContext.Create(Directory.GetCurrentDirectory())?.UserPackageFolder;
            var depsFile          = Path.Combine(AppContext.BaseDirectory, "dotnet-compile-fsc" + FileNameSuffixes.DepsJson);

            var depsJsonCommandResolver = new DepsJsonCommandResolver(nugetPackagesRoot);
            var dependencyContext       = depsJsonCommandResolver.LoadDependencyContextFromFile(depsFile);
            var fscPath = depsJsonCommandResolver.GetCommandPathFromDependencyContext("fsc", dependencyContext);


            var commandResolverArgs = new CommandResolverArguments()
            {
                CommandName      = "fsc",
                CommandArguments = fscArgs,
                DepsJsonFile     = depsFile
            };

            var fscCommandSpec = depsJsonCommandResolver.Resolve(commandResolverArgs);

            var runtimeConfigFile = Path.Combine(
                Path.GetDirectoryName(typeof(CompileFscCommand).GetTypeInfo().Assembly.Location)
                , "dotnet-compile-fsc" + FileNameSuffixes.RuntimeConfigJson);


            CopyRuntimeConfigForFscExe(runtimeConfigFile, "fsc", depsFile, nugetPackagesRoot, fscPath);

            return(new FscCommandSpec
            {
                Spec = fscCommandSpec,
                FscExeDir = Path.GetDirectoryName(fscPath),
                FscExeFile = fscPath
            });
        }
예제 #8
0
        /// <summary>
        /// Initialize a new instance of <see cref="NugetStore"/>.
        /// </summary>
        /// <param name="oldRootDirectory">The location of the Nuget store.</param>
        public NugetStore(string oldRootDirectory)
        {
            // Used only for versions before 3.0
            this.oldRootDirectory = oldRootDirectory;

            settings = NuGet.Configuration.Settings.LoadDefaultSettings(null);

            // Add dev source
            CheckPackageSource("Xenko", DefaultPackageSource);

            InstallPath = SettingsUtility.GetGlobalPackagesFolder(settings);

            var pathContext = NuGetPathContext.Create(settings);

            InstalledPathResolver = new FallbackPackagePathResolver(pathContext.UserPackageFolder, oldRootDirectory != null ? pathContext.FallbackPackageFolders.Concat(new[] { oldRootDirectory }) : pathContext.FallbackPackageFolders);
            var packageSourceProvider = new PackageSourceProvider(settings);

            var availableSources = packageSourceProvider.LoadPackageSources().Where(source => source.IsEnabled);
            var packageSources   = new List <PackageSource>();

            packageSources.AddRange(availableSources);
            PackageSources = packageSources;

            // Setup source provider as a V3 only.
            sourceRepositoryProvider = new NugetSourceRepositoryProvider(packageSourceProvider, this);
        }
예제 #9
0
        public bool TryCreateSolutionContext(string solutionDirectory, out IVsPathContext2 outputPathContext)
        {
            const string eventName = nameof(IVsPathContextProvider2) + "." + nameof(TryCreateSolutionContext) + ".2";

            using var _ = NuGetETW.ExtensibilityEventSource.StartStopEvent(eventName);

            if (solutionDirectory == null)
            {
                throw new ArgumentNullException(nameof(solutionDirectory));
            }

            try
            {
                var packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(solutionDirectory, _settings.Value);

                outputPathContext = new VsPathContext(NuGetPathContext.Create(_settings.Value), _telemetryProvider, packagesFolderPath);

                return(outputPathContext != null);
            }
            catch (Exception exception)
            {
                _telemetryProvider.PostFault(exception, typeof(VsPathContextProvider).FullName);
                throw;
            }
        }
예제 #10
0
        private string GetPackageInstalledPath(PackageIdentity packageIdentity)
        {
            var nugetPaths       = NuGetPathContext.Create(Settings);
            var fallbackResolver = new FallbackPackagePathResolver(nugetPaths);

            // Verify the package exists and return the path. Return null otherwise.
            return(fallbackResolver.GetPackageDirectory(packageIdentity.Id, packageIdentity.Version));
        }
예제 #11
0
        public bool TryCreateSolutionContext(out IVsPathContext2 outputPathContext)
        {
            var packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(_solutionManager.Value, _settings.Value);

            outputPathContext = new VsPathContext(NuGetPathContext.Create(_settings.Value), packagesFolderPath);

            return(outputPathContext != null);
        }
예제 #12
0
        private CommandSpec ResolveCommandSpecFromToolLibrary(
            SingleProjectInfo toolLibraryRange,
            string commandName,
            IEnumerable <string> args,
            LockFile lockFile,
            IProject project)
        {
            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: Attempting to resolve command spec from tool {toolLibraryRange.Name}");

            var nuGetPathContext = NuGetPathContext.Create(project.ProjectRoot);

            var nugetPackagesRoot = nuGetPathContext.UserPackageFolder;

            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: nuget packages root:\n{nugetPackagesRoot}");

            var toolLockFile = GetToolLockFile(toolLibraryRange, nugetPackagesRoot);

            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: found tool lockfile at : {toolLockFile.Path}");

            var toolLibrary = toolLockFile.Targets
                              .FirstOrDefault(
                t => t.TargetFramework.GetShortFolderName().Equals(s_toolPackageFramework.GetShortFolderName()))
                              ?.Libraries.FirstOrDefault(l => l.Name == toolLibraryRange.Name);

            if (toolLibrary == null)
            {
                Reporter.Verbose.WriteLine($"projecttoolscommandresolver: library not found in lock file.");

                return(null);
            }

            var depsFileRoot = Path.GetDirectoryName(toolLockFile.Path);

            var depsFilePath = GetToolDepsFilePath(toolLibraryRange, toolLockFile, depsFileRoot);

            var normalizedNugetPackagesRoot = PathUtility.EnsureNoTrailingDirectorySeparator(nugetPackagesRoot);

            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: attempting to create commandspec");

            var commandSpec = _packagedCommandSpecFactory.CreateCommandSpecFromLibrary(
                toolLibrary,
                commandName,
                args,
                _allowedCommandExtensions,
                normalizedNugetPackagesRoot,
                s_commandResolutionStrategy,
                depsFilePath,
                null);

            if (commandSpec == null)
            {
                Reporter.Verbose.WriteLine($"projecttoolscommandresolver: commandSpec is null.");
            }

            commandSpec?.AddEnvironmentVariablesFromProject(project);

            return(commandSpec);
        }
        public IEnumerable <IVsPackageMetadata> GetInstalledPackages()
        {
            var packages = new HashSet <IVsPackageMetadata>(new VsPackageMetadataComparer());

            return(NuGetUIThreadHelper.JoinableTaskFactory.Run(async delegate
            {
                // Calls may occur in the template wizard before the solution is actually created,
                // in that case return no projects
                if (_solutionManager != null &&
                    !string.IsNullOrEmpty(_solutionManager.SolutionDirectory))
                {
                    InitializePackageManagerAndPackageFolderPath();

                    var pathContext = NuGetPathContext.Create(_settings);
                    var pathResolver = new FallbackPackagePathResolver(pathContext);
                    var globalPackagesFolderResolver = new VersionFolderPathResolver(pathContext.UserPackageFolder);

                    foreach (var project in _solutionManager.GetNuGetProjects())
                    {
                        var installedPackages = await project.GetInstalledPackagesAsync(CancellationToken.None);

                        foreach (var package in installedPackages)
                        {
                            var identity = package.PackageIdentity;

                            if (!identity.HasVersion)
                            {
                                // Currently we are not supporting floating versions
                                // because of that we will skip this package
                                continue;
                            }

                            // find packages using the solution level packages folder
                            string installPath;
                            if (project is INuGetIntegratedProject)
                            {
                                installPath = pathResolver.GetPackageDirectory(identity.Id, identity.Version) ??
                                              globalPackagesFolderResolver.GetInstallPath(identity.Id, identity.Version);
                            }
                            else
                            {
                                installPath = _packageManager
                                              .PackagesFolderNuGetProject
                                              .GetInstalledPath(identity);
                            }

                            var metadata = new VsPackageMetadata(package.PackageIdentity, installPath);

                            packages.Add(metadata);
                        }
                    }
                }

                return packages;
            }));
        }
        /// <summary>
        /// No solution manager provided so only global packages cache will be considered.
        /// </summary>
        public PackageManagementPathResolver()
        {
            var settings    = SettingsLoader.LoadDefaultSettings();
            var pathContext = NuGetPathContext.Create(settings);

            pathResolver = new FallbackPackagePathResolver(pathContext);
            globalPackagesFolderResolver = new VersionFolderPathResolver(pathContext.UserPackageFolder);

            folderNuGetProject = new FolderNuGetProject(pathContext.UserPackageFolder);
        }
예제 #15
0
        public VsPathContext(NuGetPathContext pathContext)
        {
            if (pathContext == null)
            {
                throw new ArgumentNullException(nameof(pathContext));
            }

            UserPackageFolder      = pathContext.UserPackageFolder;
            FallbackPackageFolders = pathContext.FallbackPackageFolders;
        }
        async Task CollectPackagesForBuildIntegratedProjectAsync(
            BuildIntegratedNuGetProject project,
            ISet <PackageIdentity> finishedPackages,
            IList <PackageItem> installedPackages,
            CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            var lockFile = await getLockFileOrNullAsync(project);

            if (lockFile == null)
            {
                return;
            }

            if (lockFile.Libraries == null ||
                lockFile.Libraries.Count == 0)
            {
                return;
            }

            FallbackPackagePathResolver fppr;

            if ((lockFile?.PackageFolders?.Count ?? 0) != 0)
            {
                // The user packages folder is always the first package folder. Subsequent package folders are always
                // fallback package folders.
                var packageFolders = lockFile
                                     .PackageFolders
                                     .Select(lockFileItem => lockFileItem.Path);

                var userPackageFolder      = packageFolders.First();
                var fallbackPackageFolders = packageFolders.Skip(1);

                fppr = new FallbackPackagePathResolver(userPackageFolder, fallbackPackageFolders);
            }
            else
            {
                var pathContext = NuGetPathContext.Create(settings);
                fppr = new FallbackPackagePathResolver(pathContext);
            }

            foreach (var package in BuildIntegratedProjectUtility.GetOrderedLockFilePackageDependencies(lockFile))
            {
                if (!finishedPackages.Contains(package))
                {
                    var installPath = fppr.GetPackageDirectory(package.Id, package.Version);
                    if (!string.IsNullOrEmpty(installPath))
                    {
                        installedPackages.Add(new PackageItem(package, installPath));
                        finishedPackages.Add(package);
                    }
                }
            }
        }
예제 #17
0
        public async Task RunToolWithCreateConfigVerifySuccess()
        {
            using (var testContext = new SleetTestContext())
            {
                var dir = Path.Combine(testContext.Root, "project");
                Directory.CreateDirectory(dir);

                var dotnetExe    = GetDotnetPath();
                var exeFile      = new FileInfo(dotnetExe);
                var nupkgsFolder = Path.Combine(exeFile.Directory.Parent.FullName, "artifacts", "nupkgs");

                var sleetNupkg = LocalFolderUtility.GetPackagesV2(nupkgsFolder, "Sleet", NullLogger.Instance)
                                 .OrderByDescending(e => e.Nuspec.GetVersion())
                                 .First();

                var sleetVersion = sleetNupkg.Nuspec.GetVersion().ToNormalizedString();

                var result = await CmdRunner.RunAsync(dotnetExe, dir, "new classlib");

                result.Success.Should().BeTrue();

                var projectPath = Path.Combine(dir, "project.csproj");

                var pathContext  = NuGetPathContext.Create(dir);
                var pathResolver = new FallbackPackagePathResolver(pathContext);

                // Delete restore assets file
                var toolInstallPath = Path.Combine(pathContext.UserPackageFolder, ".tools", "sleet");
                Delete(new DirectoryInfo(toolInstallPath));

                // Delete the tool package itself if it exists
                var toolPackagePath = Path.Combine(pathContext.UserPackageFolder, "sleet", sleetVersion);
                Delete(new DirectoryInfo(toolPackagePath));

                // Add a reference to the tool
                var xml = XDocument.Load(projectPath);
                xml.Root.Add(new XElement(XName.Get("ItemGroup"),
                                          new XElement(XName.Get("DotNetCliToolReference"),
                                                       new XAttribute("Include", "Sleet"),
                                                       new XAttribute("Version", sleetVersion))));
                xml.Save(projectPath);

                // Restore the tool
                result = await CmdRunner.RunAsync(dotnetExe, dir, $"restore --source {nupkgsFolder}");

                result.Success.Should().BeTrue();

                // Run the tool
                result = await CmdRunner.RunAsync(dotnetExe, dir, $"sleet createconfig");

                result.Success.Should().BeTrue();

                File.Exists(Path.Combine(dir, "sleet.json")).Should().BeTrue();
            }
        }
예제 #18
0
        /// <summary>
        /// The base constructor for a feed
        /// </summary>
        /// <param name="feedLocation">The feed location</param>
        /// <param name="factory">Add a loggerfactory for logging stuff</param>
        internal NuGetServer(string feedLocation, ILoggerFactory factory = null)
        {
            FeedLocation = feedLocation;

            Source = Repository.Factory.GetCoreV3(feedLocation);

            Logger = new NuGetLogger(factory?.CreateLogger <NuGetLogger>());

            NuGetSettings        = Settings.LoadDefaultSettings(Directory.GetCurrentDirectory());
            TempDownloadLocation = NuGetPathContext.Create(NuGetSettings).UserPackageFolder;
        }
        public PackageManagementPathResolver(IMonoDevelopSolutionManager solutionManager)
        {
            var pathContext = NuGetPathContext.Create(solutionManager.Settings);

            pathResolver = new FallbackPackagePathResolver(pathContext);
            globalPackagesFolderResolver = new VersionFolderPathResolver(pathContext.UserPackageFolder);

            string packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(solutionManager, solutionManager.Settings);

            folderNuGetProject = new FolderNuGetProject(packagesFolderPath);
        }
예제 #20
0
        private async Task <IVsPathContext> TryCreateUserWideContextAsync()
        {
            // It's acceptable to cache these results cause currently:
            // 1. We do not reload configs
            // 2. There is no way to edit gpf/fallback folders through the PM UI.
            var settings = await _userWideSettings.GetValueAsync();

            var outputPathContext = new VsPathContext(NuGetPathContext.Create(settings), _telemetryProvider);

            return(outputPathContext);
        }
예제 #21
0
        public Task <bool> IsRestoreRequired(BuildIntegratedNuGetProject project)
        {
            var nugetPaths         = NuGetPathContext.Create(settings);
            var packageFolderPaths = new List <string>();

            packageFolderPaths.Add(nugetPaths.UserPackageFolder);
            packageFolderPaths.AddRange(nugetPaths.FallbackPackageFolders);

            var projects = new BuildIntegratedNuGetProject[] { project };

            return(BuildIntegratedRestoreUtility.IsRestoreRequired(projects, packageFolderPaths, context));
        }
예제 #22
0
        /// <summary>
        /// Initialize NugetStore using <paramref name="rootDirectory"/> as location of the local copies,
        /// and a configuration file <paramref name="configFile"/> as well as an override configuration
        /// file <paramref name="overrideFile"/> where all settings of <paramref name="overrideFile"/> also
        /// presents in <paramref name="configFile"/> take precedence.
        /// </summary>
        /// <param name="rootDirectory">The location of the Nuget store.</param>
        public NugetStore(string rootDirectory, string configFile = DefaultConfig)
        {
            RootDirectory = rootDirectory ?? throw new ArgumentNullException(nameof(rootDirectory));

            settings = NuGet.Configuration.Settings.LoadDefaultSettings(rootDirectory);

            // Add dev source
            Directory.CreateDirectory(Environment.ExpandEnvironmentVariables(DevSource));
            CheckPackageSource("Xenko Dev", DevSource);
            CheckPackageSource("Xenko", DefaultPackageSource);

            // Override file does not exist, fallback to default config file
            var configFileName = configFile;
            var configFilePath = Path.Combine(rootDirectory, configFileName);

            if (File.Exists(configFilePath))
            {
                localSettings = NuGet.Configuration.Settings.LoadDefaultSettings(rootDirectory, configFileName, machineWideSettings: null);

                // Replicate packageSources in user config so that NuGet restore can find them as well
                foreach (var x in localSettings.GetSettingValues("packageSources", true))
                {
                    CheckPackageSource(x.Key, x.Value);
                }
            }

            InstallPath = SettingsUtility.GetGlobalPackagesFolder(settings);

            var pathContext = NuGetPathContext.Create(settings);

            InstalledPathResolver = new FallbackPackagePathResolver(pathContext);
            var packageSourceProvider = new PackageSourceProvider(settings);

            var availableSources = packageSourceProvider.LoadPackageSources().Where(source => source.IsEnabled);
            var packageSources   = new List <PackageSource>();

            packageSources.AddRange(availableSources);
            PackageSources = packageSources;

            // Setup source provider as a V3 only.
            sourceRepositoryProvider = new NugetSourceRepositoryProvider(packageSourceProvider, this);

            manager = new NuGetPackageManager(sourceRepositoryProvider, settings, InstallPath);
            // Override PackagePathResolver
            // Workaround for https://github.com/NuGet/Home/issues/6639
            manager.PackagesFolderNuGetProject.GetType().GetProperty("PackagePathResolver", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(manager.PackagesFolderNuGetProject, new PackagePathResolverV3(InstallPath));

            // Obsolete (Xenko 2.x support)
            InstallPathV2  = Path.Combine(RootDirectory, DefaultGamePackagesDirectory);
            managerV2      = new NuGetPackageManager(sourceRepositoryProvider, settings, InstallPathV2);
            PathResolverV2 = new PackagePathResolver(InstallPathV2);
        }
예제 #23
0
        public bool TryCreateSolutionContext(string solutionDirectory, out IVsPathContext2 outputPathContext)
        {
            if (solutionDirectory == null)
            {
                throw new ArgumentNullException(nameof(solutionDirectory));
            }

            var packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(solutionDirectory, _settings.Value);

            outputPathContext = new VsPathContext(NuGetPathContext.Create(_settings.Value), packagesFolderPath);

            return(outputPathContext != null);
        }
        public Task <bool> IsRestoreRequired(BuildIntegratedNuGetProject project)
        {
            var pathContext        = NuGetPathContext.Create(settings);
            var packageFolderPaths = new List <string> ();

            packageFolderPaths.Add(pathContext.UserPackageFolder);
            packageFolderPaths.AddRange(pathContext.FallbackPackageFolders);
            var pathResolvers = packageFolderPaths.Select(path => new VersionFolderPathResolver(path));

            var packagesChecked = new HashSet <PackageIdentity> ();

            return(project.IsRestoreRequired(pathResolvers, packagesChecked, context));
        }
예제 #25
0
        private IVsPathContext2 GetSolutionPathContext(string packagesFolderPath)
        {
            VsPathContext pathContext = null;

            // if solution package folder exists, then set it in VSPathContext
            if (!string.IsNullOrEmpty(packagesFolderPath) && Directory.Exists(packagesFolderPath))
            {
                pathContext = new VsPathContext(NuGetPathContext.Create(_settings.Value), packagesFolderPath);
            }
            else
            {
                pathContext = new VsPathContext(NuGetPathContext.Create(_settings.Value));
            }

            return(pathContext);
        }
예제 #26
0
        public bool TryCreateSolutionContext(out IVsPathContext2 outputPathContext)
        {
            try
            {
                var packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(_solutionManager.Value, _settings.Value);

                outputPathContext = new VsPathContext(NuGetPathContext.Create(_settings.Value), _telemetryProvider, packagesFolderPath);

                return(outputPathContext != null);
            }
            catch (Exception exception)
            {
                _telemetryProvider.PostFault(exception, typeof(VsPathContextProvider).FullName);
                throw;
            }
        }
예제 #27
0
        public void NuGetPathContext_LoadDefaultSettings()
        {
            // Arrange
            using (var mockBaseDirectory = TestDirectory.Create())
            {
                var globalFolder = SettingsUtility.GetGlobalPackagesFolder(NullSettings.Instance);
                var http         = SettingsUtility.GetHttpCacheFolder();

                // Act
                var pathContext = NuGetPathContext.Create(NullSettings.Instance);

                // Assert
                Assert.Equal(0, pathContext.FallbackPackageFolders.Count);
                Assert.Equal(globalFolder, pathContext.UserPackageFolder);
                Assert.Equal(http, pathContext.HttpCacheFolder);
            }
        }
예제 #28
0
        public async Task <bool> ExecuteInitScriptAsync(PackageIdentity identity)
        {
            var result = false;

            // Reserve the key. We can remove if the package has not been restored.
            if (TryMarkVisited(identity, PackageInitPS1State.NotFound))
            {
                var nugetPaths       = NuGetPathContext.Create(Settings);
                var fallbackResolver = new FallbackPackagePathResolver(nugetPaths);
                var installPath      = fallbackResolver.GetPackageDirectory(identity.Id, identity.Version);

                if (!string.IsNullOrEmpty(installPath))
                {
                    var scriptPath = Path.Combine(installPath, "tools", PowerShellScripts.Init);

                    if (File.Exists(scriptPath))
                    {
                        // Init.ps1 is present and will be executed.
                        InitScriptExecutions.TryUpdate(
                            identity,
                            PackageInitPS1State.FoundAndExecuted,
                            PackageInitPS1State.NotFound);

                        var request = new ScriptExecutionRequest(scriptPath, installPath, identity, project: null);

                        await ExecuteScriptCoreAsync(request);

                        result = true;
                    }
                }
                else
                {
                    // Package is not restored. Do not cache the results.
                    PackageInitPS1State dummy;
                    InitScriptExecutions.TryRemove(identity, out dummy);
                    result = false;
                }
            }
            else
            {
                // Key is already present. Simply access its value
                result = (InitScriptExecutions[identity] == PackageInitPS1State.FoundAndExecuted);
            }

            return(result);
        }
예제 #29
0
        private void ExecuteInitPs1ForBuildIntegrated(
            List <PackageIdentity> sortedGlobalPackages,
            HashSet <PackageIdentity> finishedPackages)
        {
            var nugetPaths       = NuGetPathContext.Create(_settings);
            var fallbackResolver = new FallbackPackagePathResolver(nugetPaths);

            foreach (var package in sortedGlobalPackages)
            {
                if (finishedPackages.Add(package))
                {
                    // Find the package path across all folders
                    var pathToPackage = fallbackResolver.GetPackageDirectory(package.Id, package.Version);

                    ExecuteInitPs1(pathToPackage, package);
                }
            }
        }
예제 #30
0
        private async Task BuildIntegratedProjectRestoreAsync(
            BuildIntegratedNuGetProject project,
            string solutionDirectory,
            List <SourceRepository> enabledSources,
            ExternalProjectReferenceContext context,
            RestoreCommandProvidersCache providerCache,
            CancellationToken token)
        {
            // Go off the UI thread to perform I/O operations
            await TaskScheduler.Default;

            var projectName = NuGetProject.GetUniqueNameOrName(project);

            var nugetPathContext = NuGetPathContext.Create(Settings);

            using (var cacheContext = new SourceCacheContext())
            {
                providerCache.GetOrCreate(
                    nugetPathContext.UserPackageFolder,
                    nugetPathContext.FallbackPackageFolders,
                    enabledSources,
                    cacheContext,
                    context.Logger);

                // Pass down the CancellationToken from the dialog
                var restoreResult = await BuildIntegratedRestoreUtility.RestoreAsync(project,
                                                                                     context,
                                                                                     enabledSources,
                                                                                     nugetPathContext.UserPackageFolder,
                                                                                     nugetPathContext.FallbackPackageFolders,
                                                                                     token);

                if (!restoreResult.Success)
                {
                    // Mark this as having errors
                    _hasErrors = true;

                    // Invalidate cached results for the project. This will cause it to restore the next time.
                    _buildIntegratedCache.Remove(projectName);
                    await BuildIntegratedProjectReportErrorAsync(projectName, restoreResult, token);
                }
            }
        }