2016-09-19 7 views
4

Я использую следующий код из пакета NuGet.Core, который я нашел на http://blog.nuget.org/20130520/Play-with-packages.htmlКак скачать и распаковать пакеты с помощью NuGet v3 API

//ID of the package to be looked up 
string packageID = "EntityFramework"; 

//Connect to the official package repository 
IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2"); 

//Initialize the package manager string path = <PATH_TO_WHERE_THE_PACKAGES_SHOULD_BE_INSTALLED> 
PackageManager packageManager = new PackageManager(repo, path); 

//Download and unzip the package 
packageManager.InstallPackage(packageID, SemanticVersion.Parse("5.0.0")); 

Это работало отлично, но я должен был обновить Framework для .NET Core, который пакет NuGet.Core не поддерживает. Я думаю, что пакет NuGet.Protocol.Core.v3 должен иметь то, что мне нужно, но я не смог найти способ сделать это. Я нашел много информации о NuGet v3 API на http://daveaglick.com/posts/exploring-the-nuget-v3-libraries-part-1

Итак, мой вопрос: как я могу загрузить и распаковать пакеты программным путем с помощью NuGet v3?

+0

Вы когда-нибудь это выясняли? – BigJoe714

+0

@ BigJoe714, извините, я только заметил ваш комментарий. Я не понял, но devwhyst просто добавил подробный ответ, который стоит посмотреть. – Luxaes

+0

Зачем ты это делаешь? Чего вы пытаетесь достичь? –

ответ

3

Введение

Я использую NuGet v2 в некоторых проектах. Недавно я протестировал nuget v3, потому что есть много пакетов, которые вызывают ошибки, указывающие на использование nuget v3. Поэтому я попытался протестировать nuget v3 в примере проекта. Я не эксперт, но загрузка работает.

Тип проекта

Я нашел 3-х типов проектов NuGet.

  • PackagesConfigNuGetProject
  • FolderNuGetProject
  • MSBuildNuGetProject

PackagesConfigNuGetProject:

Представляет проект NuGet как представлено packages.config.

Примечание. Он загрузит ваш пакет в package.config (на самом деле он добавит запись для вашего пакета в package.config). Ваш пакет NuGet не будет находиться на вашем диске, только в файле packages.config. Так что если вы хотите получить или использовать DLL, то нужно использовать FolderNuGetProject #

FolderNuGetProject:

Этот класс представляет собой NuGetProject на основе папки, такие как пакеты папки на Решение VisualStudio.

Используйте этот класс, если вы хотите, чтобы ваши пакеты были установлены на ваш диск. #

MSBuildNuGetProject:

Этот класс представляет NuGetProject на основе проекта .NET. Это также содержит экземпляр FolderNuGetProject

Я не знаю, какой тип проекта вы хотите использовать. В этом примере я выбрал FolderNuGetProject.

Пример кода

-Инициализировать хранилище исходного

List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>(); 
providers.AddRange(Repository.Provider.GetCoreV3()); 

PackageSource packageSource = new PackageSource("https://api.nuget.org/v3/index.json"); 
SourceRepository sourceRepository = new SourceRepository(packageSource, providers); 
Logger logger = new Logger(); 

2- Инициализировать менеджер

var rootPath = @"yourPathToNugetFolder"; 
var settings = Settings.LoadDefaultSettings(rootPath, null, new MachineWideSettings()); 
var packageSourceProvider = new PackageSourceProvider(settings); 
var sourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider, providers); 

var project = new FolderNuGetProject(rootPath); 
var packageManager = new NuGetPackageManager(sourceRepositoryProvider, settings, rootPath) 
{ 
    PackagesFolderNuGetProject = project 
}; 

3- NuGet пакет Выберите пакет (в этом примере я выбрал: Newtonsoft.Json)

var searchResource = await sourceRepository.GetResourceAsync<PackageSearchResource>(); 
var supportedFramework = new[] { ".NETFramework,Version=v4.6" }; 
var searchFilter = new SearchFilter(true) 
{ 
    SupportedFrameworks = supportedFramework, 
    IncludeDelisted = false 
}; 

var jsonNugetPackages = await searchResource 
    .SearchAsync("Newtonsoft.Json", searchFilter, 0, 10, logger, CancellationToken.None); 

4 Установите пакет (Newtonsoft.Json)

Будьте осторожны при установке пакета nuget в проект. Он заморозит пользовательский интерфейс. Вы должны выполнить этот процесс, используя BackgroundWorker или что-то подобное.

var allowPrereleaseVersions = true; 
var allowUnlisted = false; 
INuGetProjectContext projectContext = new ProjectContext(); 
ResolutionContext resolutionContext = new ResolutionContext(
    DependencyBehavior.Lowest, 
    allowPrereleaseVersions, 
    allowUnlisted, 
    VersionConstraints.None); 

var jsonPackage = jsonNugetPackages.First(); 
var identity = new PackageIdentity(jsonPackage.Identity.Id, jsonPackage.Identity.Version); 
await packageManager.InstallPackageAsync(
    project, 
    identity, 
    resolutionContext, 
    projectContext, 
    sourceRepository, 
    new List<SourceRepository>(), 
    CancellationToken.None); 

5- Вспомогательных классы

public class MachineWideSettings : IMachineWideSettings 
{ 
    private readonly Lazy<IEnumerable<Settings>> _settings; 

    public MachineWideSettings() 
    { 
     var baseDirectory = NuGetEnvironment.GetFolderPath(NuGetFolderPath.MachineWideConfigDirectory); 
     _settings = new Lazy<IEnumerable<Settings>>(
      () => global::NuGet.Configuration.Settings.LoadMachineWideSettings(baseDirectory)); 
    } 

    public IEnumerable<Settings> Settings => _settings.Value; 
} 

public class Logger : ILogger 
{ 
    private List<string> logs = new List<string>(); 

    public void LogDebug(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogVerbose(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogInformation(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogMinimal(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogWarning(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogError(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogInformationSummary(string data) 
    { 
     logs.Add(data); 
    } 

    public void LogErrorSummary(string data) 
    { 
     logs.Add(data); 
    } 
} 

public class ProjectContext : INuGetProjectContext 
{ 
    private List<string> logs = new List<string>(); 

    public List<string> GetLogs() 
    { 
     return logs; 
    } 

    public void Log(MessageLevel level, string message, params object[] args) 
    { 
     var formattedMessage = String.Format(message, args); 
     logs.Add(formattedMessage); 
     // Do your logging here... 
    } 

    public FileConflictAction ResolveFileConflict(string message) 
    { 
     logs.Add(message); 
     return FileConflictAction.Ignore; 
    } 


    public PackageExtractionContext PackageExtractionContext 
    { 
     get; 
     set; 
    } 

    public NuGet.ProjectManagement.ExecutionContext ExecutionContext 
    { 
     get; 
    } 

    public XDocument OriginalPackagesConfig 
    { 
     get; set; 
    } 

    public ISourceControlManagerProvider SourceControlManagerProvider 
    { 
     get; 
     set; 
    } 

    public void ReportError(string message) 
    { 
     logs.Add(message); 
    } 

    public NuGetActionType ActionType 
    { 
     get; set; 
    } 

    public TelemetryServiceHelper TelemetryService 
    { 
     get; set; 
    } 
} 

Надеется, что это поможет вам!

+0

Спасибо большое! Я оставил надежду получить ответы. К сожалению, я покинул место, где мне нужен был ответ, поэтому я (возможно) не смогу подтвердить, работает ли это. Я передам ответ, чтобы они могли использовать это. – Luxaes

+1

Хорошо! Давайте оставим этот вопрос открытым для помощи другим. – devwhyst

Смежные вопросы