以程序方式为本地存储库创建NuGet包
本文关键字:创建 NuGet 存储 程序 方式 | 更新日期: 2023-09-27 18:26:50
我正在编写一个控制台应用程序来创建NuGet包(使用NuGet.Core库),该包将托管在我们的内部服务器上,并部署到我们的应用程序中。当我们使用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的源代码(见这里),但我不知道是什么导致了它
关于以下代码的一些注意事项:
- 前两个区域只是为了计算新包的版本号,您可以忽略它们
- ReferencePaths.NuGetPackages是本地NuGet存储库路径的静态字符串
- 这段代码使用提供的packageName和路径获取构建的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 Package Manager获得了最新版本的NuGet.Core(在撰写本文时为v2.8.5),现在上面的代码运行得很好!*
Alanis Morissette可能会说这很讽刺。
- 我必须在保存之前更改
File.Open
,因为我错过了文件名