介紹
我在某些項目中使用了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;
}
}
希望這將幫助你!
你有沒有想過這個? – BigJoe714
@ BigJoe714,對不起,我現在只注意到你的評論。我沒有弄明白,但devwhyst剛剛添加了一個值得一看的詳細答案。 – Luxaes
你爲什麼這樣做?你在努力達成什麼 –