2017-07-28 108 views
0

我正在嘗試編寫一個單元測試來強制整合Nuget包(我們有一個構建要求,所有單元測試都會通過,所以這樣可以保持未通過合併的PR),而我試圖使用Nuget.Core來做到這一點。然而,我似乎無法通過他們的圖書館找到我的出路,也沒有人問過這個問題。那麼,如何以編程方式獲得給定解決方案引用的所有Nuget包?獲取解決方案中的所有nuget包

+0

檢查如何使用NuGet.Core這個答案讀packages.config https://stackoverflow.com/a/33046897/920557 –

回答

0

這是最終的解決方案(與單元測試一起)。關鍵是使用Directory庫遍歷解決方案中的所有項目,然後使用NuGet.Core分析每個項目中的NuGet包。

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using NuGet; 
using Shouldly; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 

namespace UnitTests 
{ 
    [TestClass] 
    public class NugetConsolidationTest 
    { 
     private List<string> _ignoredPackages = new List<string>(); 

     [TestMethod] 
     public void AllNugetPackagesAreConsolidated() 
     { 
      var packageVersionMapping = new Dictionary<string, List<string>>(); 

      var parentDir = (Directory.GetParent(Directory.GetCurrentDirectory()).Parent).Parent.FullName; 
      var files = Directory.GetFiles(parentDir, "packages.config", SearchOption.AllDirectories); 
      foreach (var packageFile in files) 
      { 
       var file = new PackageReferenceFile(packageFile); 
       var refs = file.GetPackageReferences(true); 
       foreach (var packageRef in refs) 
       { 
        if (_ignoredPackages.Contains(packageRef.Id)) 
         continue; 
        if (!packageVersionMapping.ContainsKey(packageRef.Id)) 
         packageVersionMapping[packageRef.Id] = new List<string>() { packageRef.Version.ToFullString() }; 
        else 
        { 
         if (packageVersionMapping[packageRef.Id].All(x => !x.Equals(packageRef.Version.ToFullString(), 
           StringComparison.InvariantCultureIgnoreCase))) 
          packageVersionMapping[packageRef.Id].Add(packageRef.Version.ToFullString()); 
        } 
       } 
      } 

      var errors = packageVersionMapping.Where(x => x.Value.Count > 1)?. 
       Select(x => $"Package {x.Key} has {x.Value.Count} separate versions installed! Current versions are {string.Join(", ", x.Value)}"); 
      errors.ShouldBeEmpty(); 
     } 
    } 
} 
+0

這是輝煌謝謝。我用它來創建項目中使用的開源軟件的CSV文件....但我也將從現在開始在所有項目中使用此測試:) –

1

您可以隨時閱讀package.config文件並解析它們。

解決方案中包含的每個項目都包含一個參考其他packages.config文件的解決方案目錄。