2016-09-19 73 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")); 

這工作完全找到,但我不得不更新.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:

表示由packages.config表示的項目的NuGet。

注意:它會將packages下載到packages.config中(事實上,它會在packages.config中爲您的包添加一個條目)。您的NuGet軟件包將不在您的磁盤中,僅在packages.config中。所以,如果你想獲得或使用DLL,你需要使用FolderNuGetProject #

FolderNuGetProject:

此類表示基於文件夾上NuGetProject如在包文件夾VisualStudio解決方案。

如果您希望將軟件包安裝在磁盤上,請使用此類。 #

MSBuildNuGetProject:

此類表示根據.NET項目NuGetProject。這也包含一個FolderNuGetProject的實例

我不知道你想使用什麼樣的項目類型。在這個例子中,我選擇了FolderNuGetProject。

代碼示例

1-初始化源庫

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-初始化NuGet包管理器

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-搜索一個包(在這個例子中我選擇: 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