Example #1
0
        public static IEnumerable <NuGet.Configuration.PackageSource> GetPackageSources()
        {
            var userProfilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
            var settings        = new NuGet.Configuration.Settings(root: userProfilePath);
            var sourceProvider  = new NuGet.Configuration.PackageSourceProvider(settings);

            var repositories = sourceProvider.LoadPackageSources();

            return(repositories);
        }
Example #2
0
        private static (bool isLocalTool, string toolPath, string packageName, string packageVersion) DetectToolContext()
        {
            var toolAssemblyPath = Assembly.GetEntryAssembly().Location;

            // Windows is not case-sensitive, so use a case-insensitive regexes
            var regexOptions = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
                ? RegexOptions.IgnoreCase
                : RegexOptions.None;

            var regexEscapedDirectorySeparator = Regex.Escape(Path.DirectorySeparatorChar.ToString());

            // Local tools execute from the nuget global package folder, so check if the entry assembly (the tool)
            // is located there to detect that it's running as a local tool.
            var nugetSettings            = NugetSettings.LoadDefaultSettings(Directory.GetCurrentDirectory());
            var nugetGlobalPackageFolder = NugetSettingsUtility.GetGlobalPackagesFolder(nugetSettings);

            if (nugetGlobalPackageFolder[nugetGlobalPackageFolder.Length - 1] != Path.DirectorySeparatorChar)
            {
                nugetGlobalPackageFolder += Path.DirectorySeparatorChar;
            }

            // Example: C:\Users\Foo\.nuget\packages\basicsampletool\1.0.0\tools\netcoreapp3.1\any\BasicSampleTool.dll
            var localToolPathRegex = new Regex(
                $@"^{Regex.Escape(nugetGlobalPackageFolder)}(?<PackageName>[^{regexEscapedDirectorySeparator}]+){regexEscapedDirectorySeparator}(?<PackageVersion>[^{regexEscapedDirectorySeparator}]+)",
                regexOptions);
            Match localToolPathMatch = localToolPathRegex.Match(toolAssemblyPath);

            if (localToolPathMatch.Success)
            {
                string packageName    = localToolPathMatch.Groups["PackageName"].Value;
                string packageVersion = localToolPathMatch.Groups["PackageVersion"].Value;
                return(isLocalTool : true, null, packageName, packageVersion);
            }

            // Global tools install to and run from a directory with a ".store" subdirectory which has the actual package content inside of it.
            // Example (default path): C:\Users\David\.dotnet\tools\.store\basicsampletool\1.0.0\basicsampletool\1.0.0\tools\netcoreapp3.1\any\BasicSampleTool.dll
            // Example (custom path): C:\Users\David\Code\DotNetCoreToolUpdater\tmp\.store\basicsampletool\1.0.0\basicsampletool\1.0.0\tools\netcoreapp3.1\any\BasicSampleTool.dll
            var globalToolPathRegex = new Regex(
                $@"^(?<ToolPath>.+){regexEscapedDirectorySeparator}.store{regexEscapedDirectorySeparator}(?<PackageName>[^{regexEscapedDirectorySeparator}]+){regexEscapedDirectorySeparator}(?<PackageVersion>[^{regexEscapedDirectorySeparator}]+)",
                regexOptions);
            Match globalToolPathMatch = globalToolPathRegex.Match(toolAssemblyPath);

            if (globalToolPathMatch.Success)
            {
                string toolPath       = globalToolPathMatch.Groups["ToolPath"].Value;
                string packageName    = globalToolPathMatch.Groups["PackageName"].Value;
                string packageVersion = globalToolPathMatch.Groups["PackageVersion"].Value;
                return(isLocalTool : false, toolPath, packageName, packageVersion);
            }

            throw new InvalidOperationException("Could not detect the context for the currently running tool.");
        }
        /// <summary>
        /// Gets the relative path of the packages folder.
        /// </summary>
        /// <param name="folder">The folder that the returned path should be relative to. If null then the current directory is used.</param>
        public static string FindRelativePathOfPackagesFolder( string folder )
        {
            var current = new DirectoryInfo( folder );

              while ( !new DirectoryInfo( Path.Combine( current.FullName, ".nuget" ) ).Exists ) {
            current = current.Parent;
            if ( current == null ) {
              throw new Exception( "Could not locate \".nuget\" folder" );
            }
              }

              var configFile = Path.Combine( current.FullName, ".nuget", "NuGet.config" );

              var packageFolder = "packages";

              if ( File.Exists( configFile ) ) {
            NuGet.Configuration.Settings settings = new NuGet.Configuration.Settings( Path.Combine( current.FullName, ".nuget" ) );
            packageFolder = settings.GetValue( "config", "repositoryPath" ) ?? packageFolder;
              }

              var fullPath = Path.GetFullPath( Path.Combine( current.FullName, packageFolder ) );
              return MakeRelativePath( folder, fullPath );
        }
Example #4
0
        /// <summary>
        /// Устанавливает пакет.
        /// </summary>
        /// <param name="packageId">ID пакета.</param>
        /// <param name="packageVersion">Версия пакета.</param>
        /// <param name="allowPrerelease">Разрешена ли установка предварительного релиза.</param>
        /// <returns>Содержимое установленного пакета.</returns>
        public async Task <PackageContent> InstallPackage(string packageId, string packageVersion = null, bool allowPrerelease = false)
        {
            NuGetVersion packageNuGetVersion = null;

            if (!string.IsNullOrWhiteSpace(packageVersion))
            {
                packageNuGetVersion = NuGetVersion.Parse(packageVersion);
            }

            // Конфигурационный файл NuGet.config по умолчанию
            var settings = new NuGet.Configuration.Settings(_packagesPath, "NuGet.config");

            // Фабрика источников пактов на основе конфигурационного файла
            var packageSourceProvider = new PackageSourceProvider(settings);

            // Добавление в фабрику источников пакетов дополнительных источников
            packageSourceProvider.SavePackageSources(_packageSources.Select(i => new PackageSource(i)));

            // Фабрика хранилищ пакетов на основе фабрики источников пакетов
            var packageRepositoryProvider = new CachingSourceProvider(packageSourceProvider);

            // Получение всех хранилищ пакетов на основе указанных источников
            var packageRepositories = packageRepositoryProvider.GetRepositories().ToList();

            // Определение возможности установки prerelease-версии пакетов
            allowPrerelease = allowPrerelease || (packageNuGetVersion != null && packageNuGetVersion.IsPrerelease);

            // Создание правил разрешения зависимостей при установке пакета
            var resolutionContext = new ResolutionContext(
                dependencyBehavior: DependencyBehavior.Lowest,
                includePrelease: allowPrerelease,
                includeUnlisted: true,
                versionConstraints: VersionConstraints.None);

            // Если версия пакета не указана, поиск последней версии
            if (packageNuGetVersion == null)
            {
                packageNuGetVersion = await NuGetPackageManager.GetLatestVersionAsync(
                    packageId,
                    NuGetFramework.AnyFramework,
                    resolutionContext,
                    packageRepositories,
                    _logger,
                    CancellationToken.None);

                if (packageNuGetVersion == null)
                {
                    throw new InvalidOperationException(string.Format(Properties.Resources.PackageNotFound, packageId));
                }
            }

            // Уникальный идентификатор версии пакета для установки
            var packageIdentity = new PackageIdentity(packageId, packageNuGetVersion);

            // Каталог для установки пакетов (каталог packages)
            NuGetProject folderProject = new InfinniFolderNuGetProject(_packagesPath);

            // Менеджер для управления пакетами
            var packageManager = new NuGetPackageManager(packageRepositoryProvider, settings, _packagesPath);

            // Правила установки пакетов
            var projectContext = new NuGetLoggerProjectContext(_logger)
            {
                PackageExtractionContext = new PackageExtractionContext
                {
                    PackageSaveMode = PackageSaveMode.Defaultv3
                }
            };

            // Определение порядка действий при установке пакета
            var installActions = (await packageManager.PreviewInstallPackageAsync(
                                      folderProject,
                                      packageIdentity,
                                      resolutionContext,
                                      projectContext,
                                      packageRepositories,
                                      Enumerable.Empty <SourceRepository>(),
                                      CancellationToken.None)).ToList();

            // Применение действий по установке пакета
            await packageManager.ExecuteNuGetProjectActionsAsync(
                folderProject,
                installActions,
                projectContext,
                CancellationToken.None);

            return(GetPackageContent(packageIdentity, installActions.Select(i => i.PackageIdentity).ToList()));
        }
        /// <summary>
        /// Устанавливает пакет.
        /// </summary>
        /// <param name="packageId">ID пакета.</param>
        /// <param name="packageVersion">Версия пакета.</param>
        /// <param name="allowPrerelease">Разрешена ли установка предварительного релиза.</param>
        /// <returns>Содержимое установленного пакета.</returns>
        public async Task<PackageContent> InstallPackage(string packageId, string packageVersion = null, bool allowPrerelease = false)
        {
            NuGetVersion packageNuGetVersion = null;

            if (!string.IsNullOrWhiteSpace(packageVersion))
            {
                packageNuGetVersion = NuGetVersion.Parse(packageVersion);
            }

            // Конфигурационный файл NuGet.config по умолчанию
            var settings = new NuGet.Configuration.Settings(_packagesPath, "NuGet.config");

            // Фабрика источников пактов на основе конфигурационного файла
            var packageSourceProvider = new PackageSourceProvider(settings);

            // Добавление в фабрику источников пакетов дополнительных источников
            packageSourceProvider.SavePackageSources(_packageSources.Select(i => new PackageSource(i)));

            // Фабрика хранилищ пакетов на основе фабрики источников пакетов
            var packageRepositoryProvider = new CachingSourceProvider(packageSourceProvider);

            // Получение всех хранилищ пакетов на основе указанных источников
            var packageRepositories = packageRepositoryProvider.GetRepositories().ToList();

            // Определение возможности установки prerelease-версии пакетов
            allowPrerelease = allowPrerelease || (packageNuGetVersion != null && packageNuGetVersion.IsPrerelease);

            // Создание правил разрешения зависимостей при установке пакета
            var resolutionContext = new ResolutionContext(
                dependencyBehavior: DependencyBehavior.Lowest,
                includePrelease: allowPrerelease,
                includeUnlisted: true,
                versionConstraints: VersionConstraints.None);

            // Если версия пакета не указана, поиск последней версии
            if (packageNuGetVersion == null)
            {
                packageNuGetVersion = await NuGetPackageManager.GetLatestVersionAsync(
                    packageId,
                    NuGetFramework.AnyFramework,
                    resolutionContext,
                    packageRepositories,
                    _logger,
                    CancellationToken.None);

                if (packageNuGetVersion == null)
                {
                    throw new InvalidOperationException(string.Format(Properties.Resources.PackageNotFound, packageId));
                }
            }

            // Уникальный идентификатор версии пакета для установки
            var packageIdentity = new PackageIdentity(packageId, packageNuGetVersion);

            // Каталог для установки пакетов (каталог packages)
            NuGetProject folderProject = new InfinniFolderNuGetProject(_packagesPath);
            
            // Менеджер для управления пакетами
            var packageManager = new NuGetPackageManager(packageRepositoryProvider, settings, _packagesPath);

            // Правила установки пакетов
            var projectContext = new NuGetLoggerProjectContext(_logger)
            {
                PackageExtractionContext = new PackageExtractionContext
                {
                    PackageSaveMode = PackageSaveMode.Defaultv3
                }
            };

            // Определение порядка действий при установке пакета
            var installActions = (await packageManager.PreviewInstallPackageAsync(
                folderProject,
                packageIdentity,
                resolutionContext,
                projectContext,
                packageRepositories,
                Enumerable.Empty<SourceRepository>(),
                CancellationToken.None)).ToList();

            // Применение действий по установке пакета
            await packageManager.ExecuteNuGetProjectActionsAsync(
                folderProject,
                installActions,
                projectContext,
                CancellationToken.None);

            return GetPackageContent(packageIdentity, installActions.Select(i => i.PackageIdentity).ToList());
        }