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); }
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 ); }
/// <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()); }