2014-10-16 4 views
2

NuGet 패키지 (Nuget.Core 라이브러리 사용)를 만들려면 콘솔 응용 프로그램을 작성합니다.이 패키지는 우리의 응용 프로그램에 배포 할 내부 서버에서 호스팅됩니다. NuGet Package Explorer를 사용하여 수동으로 패키지를 생성 할 때이 모든 것이 잘 작동하지만 지금은이 프로세스를 자동화해야합니다.프로그래밍 방식으로 로컬 저장소 용 NuGet 패키지 만들기

나는 다음과 같은 코드가 자동으로 패키지를 구축하기 위해 함께 재현했다,하지만 난 라인에 오류가 builder.Populate(packageMetadata);

오류 :

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 
: 여기
Value cannot be null. 

Parameter name: source 

는 스택 추적의

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

+0

질문에 스택 추적을 추가했습니다. 영역의 일에 대해 확신하지 못한다. 코드가 어디에서나 재사용되지 않는다면, 메소드로 추출 할 필요는 없다.하지만 그것은 완전히 다른 주제이다. –

+0

NuGet.Core v2.8.5의 최신 버전을 사용하는 최종 솔루션은이 프로세스를 자동화하기 위해 노력하고 있습니까? – Kiquenet

답변

0

글쎄, 나는 똑같은 일을하는 몇 가지 다른 방법을 시도했지만 아무 것도 효과가 없었다. 그래서 http://nuget.codeplex.com/SourceControl의 코드 버전이 모두 v2.0 이상이었고 내 참조 된 DLL (주식 .NET 4.0 또는 4.5 버전)을 확인하기로 결정했으며 내 NuGet.Core 참조가 버전 1.6이었던 것으로 나타났습니다. 삼.

NuGet.Core (작성 당시 v2.8.5)의 최신 버전을 얻으려면 NuGet Package Manager를 사용했으며 위의 정확한 코드는 이제 정상적으로 작동합니다! *

Alanis Morissette은 아마 아이러니하다고 말할 것입니다.

  • 파일 이름을 놓친 것처럼 저장하기 바로 전에 File.Open을 변경해야했습니다.
관련 문제