VS2015 - The 'NuGetPackage' package did not load correctly

后端 未结 11 1842
孤街浪徒
孤街浪徒 2020-12-15 14:59

Just opened up VS 2015 Enterprise RTM, opened up an existing working project, getting the following error:


Microsoft Visual Studio

11条回答
  •  旧时难觅i
    2020-12-15 15:33

    When upgrading projects with nuget packages from Vx20XX to VS2015, you might have a problem with nuget packages.

    Example of error message: This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.

    I fixed my problem writing a little program that do MSBuild-Integrated package restore vs. Automatic Package Restore

    You can download executable of the tool here.

    Please let me know the result :-) !

    Code as reference:

    
        
            
                
                
                
                
            
    
            
                
                
                
            
    
            Root directory of projects
            
                
                    
                    
                
    
                
                
            
    
            
    
            
    
            
            
        
    
    
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Forms;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Xml;
    using System.Xml.Linq;
    using Application = System.Windows.Application;
    using MessageBox = System.Windows.MessageBox;
    
    /// 
    /// Applying recommanded modifications in section : "MSBuild-Integrated package restore vs. Automatic Package Restore"
    /// of : http://docs.nuget.org/Consume/Package-Restore/Migrating-to-Automatic-Package-Restore
    /// 
    
    namespace FixNuGetProblemsInVs2015
    {
        /// 
        /// Interaction logic for MainWindow.xaml
        /// 
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                DirProjects.Text = @"c:\prj";
                // DirPackages.Text = @"C:\PRJ\NuGetPackages";
            }
    
            private void BrowseDirProjectsOnClick(object sender, RoutedEventArgs e)
            {
                FolderBrowserDialog dlg = new FolderBrowserDialog();
                dlg.SelectedPath = DirProjects.Text;
                if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    DirProjects.Text = dlg.SelectedPath;
                }
            }
    
            //private void BrowseDirPackagesOnClick(object sender, RoutedEventArgs e)
            //{
            //  FolderBrowserDialog dlg = new FolderBrowserDialog();
            //  dlg.SelectedPath = DirPackages.Text;
            //  if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            //  {
            //      DirPackages.Text = dlg.SelectedPath;
            //  }
            //}
    
            // private string _dirPackages;
    
            private void ButtonFixOnClick(object sender, RoutedEventArgs e)
            {
                DoJob(false);
            }
    
            private void ButtonRevertOnClick(object sender, RoutedEventArgs e)
            {
                DoJob(true);
            }
    
            private void DoJob(bool revert = false)
            {
                TxtLog.Text = "";
    
                string dirProjects = DirProjects.Text;
                // _dirPackages = DirPackages.Text;
    
                if (!Directory.Exists(dirProjects))
                {
                    MessageBox.Show("Projects directory does not exists: " + dirProjects);
                    return;
                }
    
                //if (!Directory.Exists(_dirPackages))
                //{
                //  MessageBox.Show("Packages directory does not exists: " + _dirPackages);
                //  return;
                //}
    
                RecurseFolder(dirProjects, revert);
            }
    
            private void RecurseFolder(string dirProjects, bool revert = false)
            {
                if (revert)
                {
                    Revert(dirProjects);
                }
                else
                {
                    FixFolder(dirProjects);
                }
    
                foreach (string subfolder in Directory.EnumerateDirectories(dirProjects))
                {
                    RecurseFolder(subfolder, revert);
                }
            }
    
            private const string BackupSuffix = ".fix_nuget_backup";
    
            private void Revert(string dirProject)
            {
                foreach (string filename in Directory.EnumerateFiles(dirProject))
                {
                    if (filename.ToLower().EndsWith(BackupSuffix))
                    {
                        string original = filename.Substring(0, filename.Length - BackupSuffix.Length);
                        if (File.Exists(original))
                        {
                            File.Delete(original);                                          
                        }
                        File.Move(filename, original);
                        Log("File reverted: " + filename + " ==> " + original);
                    }
                }
            }
    
            private void FixFolder(string dirProject)
            {
                BackupFile(System.IO.Path.Combine(dirProject, "nuget.targets"));
                BackupFile(System.IO.Path.Combine(dirProject, "nuget.exe"));
    
                foreach (string filename in Directory.EnumerateFiles(dirProject))
                {
                    if (filename.ToLower().EndsWith(".csproj"))
                    {
                        FromProjectFileRemoveNugetTargets(filename);
                    }
                }
            }
    
            private void BackupFile(string path)
            {
                if (File.Exists(path))
                {
                    string backup = path + BackupSuffix;
                    if (!File.Exists(backup))
                    {
                        File.Move(path, backup);
                        Log("File backup: " + backup);
                    }
                    else
                    {
                        Log("Project has already a backup: " + backup);
                    }
                }
            }
    
            private void FromProjectFileRemoveNugetTargets(string prjFilename)
            {
                XDocument xml = XDocument.Load(prjFilename);
    
                List elementsToRemove = new List();
    
                foreach (XElement element in xml.Descendants())
                {
                    if (element.Name.LocalName == "Import")
                    {
                        var att = element.Attribute("Project");
                        if (att != null)
                        {
                            if (att.Value.Contains("NuGet.targets"))
                            {
                                elementsToRemove.Add(element);
                            }
                        }
                    }
    
                    if (element.Name.LocalName == "Target")
                    {
                        var att = element.Attribute("Name");
                        if (att != null && att.Value == "EnsureNuGetPackageBuildImports")
                        {
                            elementsToRemove.Add(element);
                        }
                    }
                }
    
                if (elementsToRemove.Count > 0)
                {
                    elementsToRemove.ForEach(element => element.Remove());
                    BackupFile(prjFilename);
                    xml.Save(prjFilename);
                    Log("Project updated: " + prjFilename);
                }
            }
    
            private void Log(string msg)
            {
                TxtLog.Text += msg + "\r\n";
            }
    
        }
    }
    

提交回复
热议问题