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에 더 많은 정보가 필요합니까? 내가 생각할 수있는 모든 속성을 채워 보았지만 도움이되지 않았습니다.
전체 스택 추적을 표시하십시오. 또한 메서드 내부에 영역이 필요한 경우 작은 메서드로 메서드를 분할 할 수 있습니다. – CodeCaster
질문에 스택 추적을 추가했습니다. 영역의 일에 대해 확신하지 못한다. 코드가 어디에서나 재사용되지 않는다면, 메소드로 추출 할 필요는 없다.하지만 그것은 완전히 다른 주제이다. –
NuGet.Core v2.8.5의 최신 버전을 사용하는 최종 솔루션은이 프로세스를 자동화하기 위해 노력하고 있습니까? – Kiquenet