【问题标题】:How do I publish a package using NuGet API?如何使用 NuGet API 发布包?
【发布时间】:2017-01-18 22:16:31
【问题描述】:

我正在尝试在 C# 控制台应用程序中使用 NuGet API 将 NuGet 包发布到内部 Nexus NuGet 存储库。代码sn-p:

List<Lazy<INuGetResourceProvider>> providers = new List<Lazy<INuGetResourceProvider>>();
providers.AddRange(Repository.Provider.GetCoreV3());  
PackageSource packageSource = new PackageSource("http://nexus:8081/nexus/nuget-repo");
SourceRepository sourceRepository = new SourceRepository(packageSource, providers);
ISettings settings = NuGet.Configuration.Settings.LoadDefaultSettings(@"C:\Users\<user>\AppData\Roaming\NuGet", null, new MachineWideSettings());
var packageSourceProvider = new PackageSourceProvider(settings);
packageSourceProvider.SaveActivePackageSource(packageSource);
                
 
try
{
    await PushRunner.Run(
        settings,
        packageSourceProvider,
        filetouse,
        "http://nexus:8081/nexus/nuget-repo",
        "MY API KEY", "", "", 10, false, true,
        new Logger());
}
catch(Exception e) 
{
}

我遇到的问题是对 PushRunner 的调用立即完成,没有异常,并且包没有被推送。我在控制台中看到一条消息,NuGet 将推送包,但之后没有发出其他日志记录。我尝试使用 nuget.exe 推送相同的包,它工作正常。 Nexus 服务器需要用户名、密码和 API 密钥才能发布 NuGet 工件。

NuGet API 缺少文档,所以我不确定问题出在哪里,以及我这样做是否正确。

【问题讨论】:

  • 我应该提到我想以某种方式在代码中传递用户名和密码。我假设需要凭据(加上 API 密钥),因为 nuget.exe 提示我输入凭据。在测试上述代码时,我将凭据保存在用户特定的 nuget.config 中。

标签: c# nuget


【解决方案1】:

现在已经有一段时间了,但我刚刚通过使用 NuGet.CommandLine.XPlat NuGet 包成功地完成了这项工作。这是实现 dotnet.exe 的 NuGet 部分的包。我让它以一种非常简单的方式工作的方法是执行 Program.Main 方法,就像调用 exe 本身一样。此处描述了 dotnet nuget push 的文档:https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-push?tabs=netcore21

那么代码就变成了:

Program.Main(new[] { "push", packagePath, "-k", apiKey, "-s", serverUrl });

您只会得到一个返回码,但目前(在包的 4.8.0 版本中)还有另一个版本的 Main (MainInternal),您也可以在其中拦截和覆盖操作的日志记录。

【讨论】:

  • 很高兴找到伊万。我最终使用了 nuget.exe,因为无法让它工作,这很遗憾。
  • 对于来自NuGet.CommandLine.XPlat 的5.8.0 及更高版本Program.Main() 不再可访问。不过还有另一种选择,请参阅github.com/NuGet/Home/issues/10762
【解决方案2】:

要在代码中处理此问题,您可以添加凭据提供程序。这里是nuget.exe push使用的代码:

https://github.com/NuGet/NuGet.Client/blob/f55f41629b0016072dc24f6effcc72e430609b6f/src/NuGet.Clients/NuGet.CommandLine/Commands/Command.cs#L156-L173

或者,您可以将凭据添加到您的 nuget.config,然后从该文件中读取设置。如果您可以让 nuget.exe push 先与 nuget.config 一起工作,以便没有提示,那么加载相同的设置并运行您已有的代码应该会更容易。

【讨论】:

  • 我已尝试添加凭据提供程序,但未调用回调。我更喜欢传递用户名和密码,而不是依赖 nuget.config。无论如何,我仍然不确定要对 Nexus 3 使用什么 Nuget 格式。似乎 Nexus 3 不支持 Nuget v3 groups.google.com/a/glists.sonatype.com/forum/#!topic/…。但是,nuget.exe 3.4.x 能够上传到 Nexus 2 和 Nexus 3。贾斯汀,你有我可以使用的工作代码吗?我最初从 Nuget.Core 开始并使用 PackageServer.PushPackage() 但服务器断开连接。
  • 我试图复制 SetDefaultCredentialProvider() 但 CredentialService 不可用。我只是模仿“CoreV2.NuGet.HttpClient.DefaultCredentialProvider = new CredentialServiceAdapter(CredentialService);”但没有设置HttpHandlerResourceV3。我需要完全复制 SetDefaultCredentialProvider() 吗?
  • 值得赞赏的是一些工作代码,否则,感觉我没有取得进展,需要直接调用 Nuget.exe(首先调用'nuget sources add...'和通过 -ConfigFile 将 nuget.config 传递给“nuget push”)。我宁愿避免直接调用nuget.exe是可能的。
  • 嗨贾斯汀,我在看github.com/NuGet/NuGet.Client/blob/…,看到一些代码来加载扩展和目录等。我想知道我是否需要这样做?一旦调用 PushRunner,我的代码就无法运行——这表明可能存在一些与 Nuget 相关的潜在问题。谢谢尼什
猜你喜欢
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2012-05-22
  • 2021-10-27
  • 2019-03-26
  • 1970-01-01
  • 2016-03-20
  • 2014-12-21
相关资源
最近更新 更多