NuGet 客户端 SDK - 通过代码连接到私有 NuGet 提要
NuGet Client SDK - Connecting to a private NuGet feed through code
我正在通过 Azure DevOps 使用私有 NuGet 源。
要从代码中查看有关 public NuGet 包的信息,只需遵循文档 here。
特别是:
ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;
SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();
IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync(
"Newtonsoft.Json",
includePrerelease: true,
includeUnlisted: false,
cache,
logger,
我正在尝试通过将我的凭据添加到流程中来为我自己的私人提要实现相同的结果:
var logger = NullLogger.Instance;
var cancellationToken = CancellationToken.None;
var cache = new SourceCacheContext();
var source = new PackageSource("*my feed*/nuget/v3/index.json");
source.Credentials = new PackageSourceCredential("*my feed*/nuget/v3/index.json", "*username*", "*password*", true, null);
var repository = Repository.Factory.GetCoreV2(source);
var resource = await repository.GetResourceAsync<PackageMetadataResource>();
IEnumerable<IPackageSearchMetadata> searchMetadata = await resource.GetMetadataAsync(
"My.Package.Name",
includePrerelease: true,
includeUnlisted: false,
cache,
logger,
cancellationToken);
请注意,即使我调用了 Factory.GetCoreV2()
,方法内部仍然调用 V3 提供程序。它只是唯一将 PackageSource 作为参数的构造函数:
public static SourceRepository GetCoreV2(this Repository.RepositoryFactory factory, PackageSource source)
{
return Repository.CreateSource(Repository.Provider.GetCoreV3(), source);
}
然而,无论我做什么,我都无法通过步骤
var resource = await repository.GetResourceAsync<PackageMetadataResource>();
一直失败并显示 NuGet.Protocol.Core.Types.FatalProtocolException - 401 Unauthorised
。我已经验证了我的凭据和我的提要端点的有效性,以及我在提要中的权限(完全访问)。我也尝试了 here 描述的初始化过程(加上我的凭据的步骤),但结果是一样的。
我如何从代码识别 Azure DevOps 源,以便能够获取 IPackageMetadata 信息?
Azure DevOps 不支持通过 NuGet 进行用户名和密码身份验证。如果您的帐户需要 2 因素身份验证 (2FA),NuGet 无法提示您进行此操作。我不知道他们是否决定不支持所有帐户,即使是未启用 2FA 的帐户,或者是否还有其他原因(我怀疑出于其他安全原因不允许这样做)。
如果您安装了 Visual Studio,或者安装了 Azure Artifacts NuGet credentials provider,也许您可以尝试不在您的代码中使用任何凭据。我不确定 nuget.exe、dotnet cli 和 msbuild 究竟是如何发现凭据提供程序的,但也许它在使用 sdk 时也能正常工作。
否则,如果您想或需要使用凭证 API,您需要生成一个 personal access token,并将其用作密码。
我进行了更深入的研究,这似乎是可行的,请参阅带有示例实现的 Gist
https://gist.github.com/cpyfferoen/74092a74b165e85aed5ca1d51973b9d2
另一种管理安全 DevOps 包源的方法是使用 DevOps REST API
https://docs.microsoft.com/en-us/rest/api/azure/devops/artifacts/feed%20%20management/get%20feeds?view=azure-devops-rest-6.0
似乎没有与我看到的 API 接口的包,所以我创建了一个非常简单的库,它使用了一些 REST API 方法
https://github.com/conficient/DevOpsNugetClient
我用它成功地查询和删除了我们内部提要上的数百个冗余包和相关版本。
我正在通过 Azure DevOps 使用私有 NuGet 源。
要从代码中查看有关 public NuGet 包的信息,只需遵循文档 here。
特别是:
ILogger logger = NullLogger.Instance;
CancellationToken cancellationToken = CancellationToken.None;
SourceCacheContext cache = new SourceCacheContext();
SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
PackageMetadataResource resource = await repository.GetResourceAsync<PackageMetadataResource>();
IEnumerable<IPackageSearchMetadata> packages = await resource.GetMetadataAsync(
"Newtonsoft.Json",
includePrerelease: true,
includeUnlisted: false,
cache,
logger,
我正在尝试通过将我的凭据添加到流程中来为我自己的私人提要实现相同的结果:
var logger = NullLogger.Instance;
var cancellationToken = CancellationToken.None;
var cache = new SourceCacheContext();
var source = new PackageSource("*my feed*/nuget/v3/index.json");
source.Credentials = new PackageSourceCredential("*my feed*/nuget/v3/index.json", "*username*", "*password*", true, null);
var repository = Repository.Factory.GetCoreV2(source);
var resource = await repository.GetResourceAsync<PackageMetadataResource>();
IEnumerable<IPackageSearchMetadata> searchMetadata = await resource.GetMetadataAsync(
"My.Package.Name",
includePrerelease: true,
includeUnlisted: false,
cache,
logger,
cancellationToken);
请注意,即使我调用了 Factory.GetCoreV2()
,方法内部仍然调用 V3 提供程序。它只是唯一将 PackageSource 作为参数的构造函数:
public static SourceRepository GetCoreV2(this Repository.RepositoryFactory factory, PackageSource source)
{
return Repository.CreateSource(Repository.Provider.GetCoreV3(), source);
}
然而,无论我做什么,我都无法通过步骤
var resource = await repository.GetResourceAsync<PackageMetadataResource>();
一直失败并显示 NuGet.Protocol.Core.Types.FatalProtocolException - 401 Unauthorised
。我已经验证了我的凭据和我的提要端点的有效性,以及我在提要中的权限(完全访问)。我也尝试了 here 描述的初始化过程(加上我的凭据的步骤),但结果是一样的。
我如何从代码识别 Azure DevOps 源,以便能够获取 IPackageMetadata 信息?
Azure DevOps 不支持通过 NuGet 进行用户名和密码身份验证。如果您的帐户需要 2 因素身份验证 (2FA),NuGet 无法提示您进行此操作。我不知道他们是否决定不支持所有帐户,即使是未启用 2FA 的帐户,或者是否还有其他原因(我怀疑出于其他安全原因不允许这样做)。
如果您安装了 Visual Studio,或者安装了 Azure Artifacts NuGet credentials provider,也许您可以尝试不在您的代码中使用任何凭据。我不确定 nuget.exe、dotnet cli 和 msbuild 究竟是如何发现凭据提供程序的,但也许它在使用 sdk 时也能正常工作。
否则,如果您想或需要使用凭证 API,您需要生成一个 personal access token,并将其用作密码。
我进行了更深入的研究,这似乎是可行的,请参阅带有示例实现的 Gist https://gist.github.com/cpyfferoen/74092a74b165e85aed5ca1d51973b9d2
另一种管理安全 DevOps 包源的方法是使用 DevOps REST API https://docs.microsoft.com/en-us/rest/api/azure/devops/artifacts/feed%20%20management/get%20feeds?view=azure-devops-rest-6.0
似乎没有与我看到的 API 接口的包,所以我创建了一个非常简单的库,它使用了一些 REST API 方法
https://github.com/conficient/DevOpsNugetClient
我用它成功地查询和删除了我们内部提要上的数百个冗余包和相关版本。