2014-10-16 167 views
2

我正在编写一个控制台应用程序来创建NuGet包(使用Nuget.Core库),该包将托管在我们的内部服务器上以部署到我们的应用程序中。当我们使用NuGet包资源管理器手动创建包时,这一切都正常,但我们需要现在自动执行此过程。以编程方式为本地存储库创建NuGet包

我有下面的代码拼凑来自动创建包,但我上线的错误builder.Populate(packageMetadata);

的错误是:

Value cannot be null. 

Parameter name: source 

这里的堆栈跟踪:

at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector) 
at NuGet.PackageBuilder.Populate(ManifestMetadata manifestMetadata) 
at BuildPackage.Create(String packageName, String path, String description) in c:\Source Code\Visual Studio Projects\Tools\Console Applications\NuGet Package Builder\BuildPackage.cs:line 134 

我看过NuGet的源代码(请参阅here),但我无法弄清楚是什么导致它。

关于下面的代码的几个注意事项:

  • 前两个区域都只是找出新包的版本号,你可以忽略它们
  • ReferencePaths.NuGetPackages是一个静态的字符串我们当地的NuGet库的路径
  • 该代码拿起提供

这里内置DLL和使用的packageName PDB文件和路径是代码:

class BuildPackage 
{ 
    public static void Create(string packageName, string path, string description) 
    { 
     try 
     { 
      #region Get the current package version 

      int major = 0; 
      int minor = 0; 
      int packageNo = 0; 
      List<string> files = Directory.EnumerateFiles(ReferencePaths.NuGetPackages, packageName + "*").ToList(); 

      if (files.Count > 0) 
      { 
       foreach (string file in files) 
       { 
        string[] versions = file.Replace(ReferencePaths.NuGetPackages, "").Replace(packageName + ".", "").Replace(".nupkg", "").Split('.'); 
        int newMajor = Convert.ToInt32(versions[0]); 
        int newMinor = Convert.ToInt32(versions[1]); 
        int newPackageNo = Convert.ToInt32(versions[2]); 

        // Figure out if this is the latest package 
        if (newMajor > major || 
         (newMajor == major && newMinor > minor) || 
         (newMajor == major && newMinor == minor && newPackageNo > packageNo)) 
        { 
         major = newMajor; 
         minor = newMinor; 
         packageNo = newPackageNo; 
        } 
       } 
      } 

      #endregion Get the current package version 

      #region Get the new assembly version 

      FileVersionInfo version = FileVersionInfo.GetVersionInfo(path + packageName + ".dll"); 

      if (version.FileMajorPart > major || 
       (version.FileMajorPart == major && version.FileMinorPart > minor)) 
      { 
       major = version.FileMajorPart; 
       minor = version.FileMinorPart; 
       packageNo = 0; 
      } 
      else 
      { 
       while (File.Exists(ReferencePaths.NuGetPackages + packageName + "." + major.ToString() + "." + minor.ToString() + "." + packageNo.ToString() + ".nupkg")) 
       { 
        packageNo++; 
       } 
      } 

      #endregion Get the new assembly version 

      #region Create the package 

      string packageVersion = major.ToString() + "." + minor.ToString() + "." + packageNo.ToString(); 
      string newPackageName = packageName + "." + packageVersion + ".nupkg"; 
      ManifestMetadata packageMetadata = new ManifestMetadata(); 
      packageMetadata.Id = packageName; 
      packageMetadata.Version = packageVersion; 
      packageMetadata.Authors = "Test"; 
      packageMetadata.Description = description; 

      List<ManifestFile> manifestFiles = new List<ManifestFile>(); 
      ManifestFile dllFile = new ManifestFile(); 
      dllFile.Source = packageName + ".dll"; 
      dllFile.Target = @"lib\" + packageName + ".dll"; 
      manifestFiles.Add(dllFile); 
      ManifestFile pdbFile = new ManifestFile(); 
      pdbFile.Source = packageName + ".pdb"; 
      pdbFile.Target = @"lib\" + packageName + ".pdb"; 
      manifestFiles.Add(pdbFile); 

      PackageBuilder builder = new PackageBuilder(); 
      builder.PopulateFiles(path, manifestFiles); 
      builder.Populate(packageMetadata); 
      using (FileStream stream = File.Open(ReferencePaths.NuGetPackages + newPackageName, FileMode.OpenOrCreate)) 
      { 
       builder.Save(stream); 
      } 

      #endregion Create the package 

      Console.WriteLine("New package created: " + newPackageName); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

有谁知道什么可能是错的?我需要ManifestMetadata中的更多信息吗?我尝试填写所有我能想到的属性,但它没有帮助。

+0

显示完整的堆栈跟踪。另外,如果您需要区域内的区域,您可能需要将方法拆分为较小的区域。 – CodeCaster 2014-10-16 14:38:10

+0

我已将堆栈跟踪添加到问题中。不确定地区的事情 - 如果代码没有在任何地方重复使用,似乎没有必要将它提取到一个方法中,但这是另一个话题! – 2014-10-16 14:59:31

+0

使用最新版本的NuGet.Core v2.8.5的任何最终解决方案都可以使这个过程自动化? – Kiquenet 2014-11-11 09:50:49

回答

0

那么,我尝试了几种不同的方式来做同样的事情,但没有奏效。所以我注意到http://nuget.codeplex.com/SourceControl上的代码版本都是v2.0以上版本,并决定检查我引用的DLL(这是股票的.NET 4.0或4.5版本),并且我注意到我的NuGet.Core引用是针对版本1.6的。 3。

所以,我用NuGet包管理器来获取最新版本的NuGet.Core(在编写本文时是v2.8.5),现在上面的确切代码工作得很好! *

Alanis Morissette可能会说这很讽刺。

  • 我确实必须在保存之前更改File.Open,因为我错过了文件名。