使用NuGet.Core以编程方式推送NuGet包

时间:2014-10-24 14:11:01

标签: c# nuget nuget-package

我目前正在使用命令行工具打包一些文件并将它们推送到我们的某个服务器上的NuGet Feed中。 我没有使用命令行工具,而是使用Nuget.Core设置了一个项目,并成功设法创建了一个包。我现在正试图通过NuGet.Core将我的机器上的软件包推送到NuGet feed。 使用看起来像这样的命令行工具(我也得到了它):

nuget.exe push package.nupkg -ApiKey MYAPIKEY -Source http://nugetpackagefeedaddress

我想要做的是使用NuGet.Core复制推送功能。到目前为止,我设法得到的最接近的是从PackageRepositoryFactory获取两个存储库,一个用于本地机器路径,一个用于包源,然后从本地存储器中检索包并尝试添加它像这样的饲料:

var remoteRepo = PackageRepositoryFactory.Default.CreateRepository("myNugetPackagefeedUrl");
var localRepo = PackageRepositoryFactory.Default.CreateRepository(@"locationOfLocalPackage");
var package = localRepo.FindPackagesById("packageId").First();
remoteRepo.AddPackage(package);

此代码导致NotSupportedException声明不支持“指定”方法'

是否可以使用NuGet.Core推送包?我能用上面的代码接近它吗?

注意:我知道我可以将调用包装到nuget.exe并从.NET调用,但是我要么想要从NuGet.Core打包和推送,要么通过将调用包装到nuget.exe而不是一半半

2 个答案:

答案 0 :(得分:10)

事实证明我完全是在错误的地方。我想要的方法是PushPackage

上的PackageServer

代码现在看起来像这样

var localRepo = PackageRepositoryFactory.Default.CreateRepository(@"locationOfLocalPackage");
var package = localRepo.FindPackagesById("packageId").First();
var packageFile = new FileInfo(@"packagePath");
var size = packageFile .Length;
var ps = new PackageServer("http://nugetpackagefeedaddress", "userAgent");
ps.PushPackage("MYAPIKEY", package, size, 1800, false);

我不确定在新建PackageServer时userAgent参数的最佳值是多少。同样,如果有人对超时或disableBuffering参数的含义有任何建议,请告诉我(例如以ms,秒等为单位的超时)。

PushPackage方法签名如下所示:

void PackageServer.PushPackage(string apiKey, IPackage package, long packageSize, int timeout, bool disableBuffering)

答案 1 :(得分:1)

除了rh072005的回答:

  • 超时是以毫秒为单位,小心。
  • Uri很棘手。对于NuGet.Server实现,PushPackage uri应为“http://nugetserveraddress”,而对于IPackageRepository对象,Uri变为“http://nugetserveraddress/nuget
  • 对于大型软件包,如果IIS服务器未配置为接受大型请求,您将获得(404)Not Found