Введение
Я использую 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;
}
}
Надеется, что это поможет вам!
Вы когда-нибудь это выясняли? – BigJoe714
@ BigJoe714, извините, я только заметил ваш комментарий. Я не понял, но devwhyst просто добавил подробный ответ, который стоит посмотреть. – Luxaes
Зачем ты это делаешь? Чего вы пытаетесь достичь? –