gpt4 book ai didi

c# - 以编程方式为本地存储库创建 NuGet 包

转载 作者:太空宇宙 更新时间:2023-11-03 15:49:45 25 4
gpt4 key购买 nike

我正在编写一个控制台应用程序来创建 NuGet 包(使用 Nuget.Core 库),这些包将托管在我们的内部服务器上以部署到我们的应用程序中。当我们使用 NuGet Package Explorer 手动创建包时,一切正常,但我们现在需要自动执行此过程。

我将以下代码拼凑在一起以自动构建包,但在 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 和 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 中的更多信息吗?我尝试填写所有我能想到的属性,但没有帮助。

最佳答案

好吧,我尝试了几种不同的方法来做同样的事情,但没有任何效果。所以我注意到 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,因为我遗漏了文件名。

关于c# - 以编程方式为本地存储库创建 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com