我正在尝试使用C#控制台应用程序中的NuGet API将Nuget包发布到内部Nexus Nuget存储库。代码段:
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缺少文档,因此我不确定问题是什么以及我是否以正确的方式执行此操作。
答案 0 :(得分: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)版本,您还可以在其中拦截和覆盖该操作的日志记录。
答案 1 :(得分:0)
要在代码中处理此问题,您可以添加凭据提供程序。这是nuget.exe push使用的代码:
或者,您可以将凭据添加到nuget.config,然后从该文件中读取设置。如果你可以使用nuget.config首先使用nuget.exe push工作,这样就没有提示,那么应该更容易加载相同的设置并运行你已有的代码。