簡體   English   中英

如何以編程方式讀取packages.config中的NuGet包列表?

[英]How to read the list of NuGet packages in packages.config programatically?

讀取(最好是通過C#)package.config文件中列出的軟件包的最佳方法是什么?

在我們的源代碼庫中,我有很多解決方案和項目,同樣還有很多packages.config文件。 我正在嘗試在我的源代碼存儲庫中構建一個正在使用的包(和版本)的整合列表。

我可以看到有一個NuGet.Core包可用 - 我怎么能用它來實現我的目標?

謝謝

如果您不想直接讀取XML,可以安裝NuGet.Core NuGet包,然后使用PackageReference類。

下面是一些使用此類打印包ID及其版本的示例代碼。

string fileName = @"c:\full\path\to\packages.config";

var file = new PackageReferenceFile(fileName);
foreach (PackageReference packageReference in file.GetPackageReferences())
{
    Console.WriteLine("Id={0}, Version={1}", packageReference.Id, packageReference.Version);
}

您需要自己找到packages.config文件,您可以使用目錄搜索來執行這些操作,例如:

foreach (string fileName in Directory.EnumerateFiles("d:\root\path", "packages.config", SearchOption.AllDirectories))
{
    // Read the packages.config file...
}

另一種更新的方法是安裝NuGet.Packaging NuGet包並使用類似於以下代碼:

var document = XDocument.Load (fileName);
var reader = new PackagesConfigReader (document);
foreach (PackageReference package in reader.GetPackages ())
{
    Console.WriteLine (package.PackageIdentity);
}

如您所說,您需要安裝NuGet.Core,您的解決方案可能包含多個項目,因此最好知道如何在安裝時指定項目名稱。 假設你的解決方案是MySolution,你有兩個項目Project01Project02 ,你只想在Project02中安裝。

Install-Package NuGet.Core -ProjectName Project02

接下來,您將需要在whatever.cs頁面中添加一個using語句,用於定位程序包,並假設您只想獲取版本號,以便可以在網站的某個位置打印出來。 這實際上就是我想要做的。

using NuGet;

接下來我想得到一個特定的包並閱讀它的版本號,這樣當我們發布我的軟件時,我在我的網站上的某個地方有一個可視標識符,我可以去看看正在制作的版本。

這是我編寫的代碼,用於填充頁面上的webforms標簽。

protected void Page_Load(Object sender, EventArgs e)
    {
        var pkgRefpath = Server.MapPath("~/packages.config");

        PackageReferenceFile nugetPkgConfig = new PackageReferenceFile(pkgRefpath);
        IEnumerable<PackageReference> allPackages = nugetPkgConfig.GetPackageReferences();

        var newtonsoftPkg = (
            from pkg in allPackages
            where pkg.Id == "Newtonsoft.Json"
            select pkg
        ).FirstOrDefault();

        if (newtonsoftPkg== null) return;
            var newtonsoftPkg_Version = newtonsoftPkg.Version;

        ltrNewtonsoftVer.Text = newtonsoftPkg_Version.ToString();
    }

對於這個問題,這是一個稍微不同的答案,但是這顯示了我在找到這個問題/答案並修改我學到的東西以滿足我自己的需求后最終滿足我的需求的解決方案。 我希望它可以幫助其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM