如何使用NuGet API发布包

时间:2017-01-18 22:16:31

标签: nuget

我正在尝试使用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缺少文档,因此我不确定问题是什么以及我是否以正确的方式执行此操作。

2 个答案:

答案 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使用的代码:

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

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