[C#] Visual Studio에서 NuGet 패키지 복원을 어떻게 활성화합니까?

거기의 유사한 포스트 스택은하지만 난 비주얼 스튜디오 2015 사용하고 있기 때문에 아마도 내 문제에 도움이되지 않습니다.

VS2015에 “NuGet 패키지 복원 사용”옵션을 표시하려면 어떻게합니까?

File> New Project를 선택하고 빈 ASP.NET Web Application을 만들었습니다 . 이 메뉴 옵션을 찾고 있습니다.

여기에 이미지 설명을 입력하십시오

내 프로젝트 폴더에서 기존의 nuGet 파일을 찾았지만 아무것도 없다는 것을 언급해야합니다.



답변

너무 오래 걸렸지 만 마침내 MSBuild 통합 솔루션을 자동 패키지 복원 으로 마이그레이션 에 대한이 문서를 찾았 으며 여기에 설명 된 방법을 사용하여 문제를 해결할 수있었습니다.

  1. '.nuget'솔루션 에서 솔루션 디렉토리를 제거하십시오.
  2. nuget.targets귀하 .csproj또는 .vbproj파일 에서 모든 참조를 제거하십시오 . 공식적으로 지원되지는 않지만 정리해야 할 프로젝트가 많은 경우 문서가 PowerShell 스크립트에 연결 됩니다. 손으로 직접 편집하여 경험에 대한 피드백을 줄 수 없습니다.

직접 파일을 편집 할 때 다음과 같은 정보를 얻을 수 있습니다.

솔루션 파일 (.sln)

Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F4AEBB8B-A367-424E-8B14-F611C9667A85}"
ProjectSection(SolutionItems) = preProject
    .nuget\NuGet.Config = .nuget\NuGet.Config
    .nuget\NuGet.exe = .nuget\NuGet.exe
    .nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection
EndProject

프로젝트 파일 (.csproj / .vbproj)

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>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. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>


답변

Microsoft는 VS2015에서 ‘NuGet 패키지 복원 사용’에 대한 지원을 중단했으며 이전 솔루션을 마이그레이션하거나 새 솔루션에 기능을 추가하려면 일부 수동 변경을 수행해야합니다. 새로운 기능은 NuGet Package Restore에 잘 설명되어 있습니다.

기존 프로젝트 (이전에 언급 한대로)에 대한 마이그레이션 안내서도 있습니다. NuGet 마이그레이션 안내서

업그레이드 할 때 :

  1. .nuget 디렉토리를 삭제하지 마십시오.
  2. nuget.exe 및 nuget.targets 파일을 삭제하십시오.
  3. nuget.config를 그대로 두십시오.
  4. NuGet 대상에 대한 참조가있는 각 프로젝트 파일을 직접 제거하십시오. 언급 한 Powershell 스크립트는 좋은 것보다 더 많은 피해를주는 것으로 보입니다.

새 프로젝트를 생성 할 때 :

  1. Visual Studio 2015 솔루션에서 .nuget이라는 솔루션 디렉토리를 만듭니다.
  2. 솔루션 디렉토리 (.sln 파일이있는 위치)의 실제 디렉토리를 작성하고 .nuget이라고합니다 (솔루션 디렉토리는 이름이 같더라도 실제 파일 시스템 디렉토리와 동일하지 않음).
  3. nuget.config라는 .nuget 디렉토리에 파일을 작성하십시오.

  4. ‘nuget.config’를 2 단계에서 만든 솔루션 디렉토리에 추가하십시오.

  5. nuget.config 파일에 다음 텍스트를 넣으십시오.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <config>
    <add key="repositorypath" value="$\..\..\..\..\Packages" />
    </config>
    <solution>
    <add key="disableSourceControlIntegration" value="true" />
    </solution>
    </configuration>

이 구성 파일을 사용하면 모든 패키지를 한 곳에서 통합 할 수 있으므로 파일 시스템에 동일한 패키지의 20 개의 서로 다른 사본이 없습니다. 상대 경로는 솔루션 디렉토리 아키텍처에 따라 변경되지만 모든 솔루션에 공통 인 디렉토리를 가리켜 야합니다.

5 단계를 수행 한 후 Visual Studio를 다시 시작해야합니다. Nuget은 변경 사항을 인식하지 않습니다.

마지막으로 ‘Nuget Package Manager for Solutions’를 사용하여 패키지를 제거한 후 다시 설치해야 할 수도 있습니다. 이것이 내가 실행 한 Powershell 스크립트의 부작용인지 또는 NuGet을 다시 시작하는 방법인지 모르겠습니다. 이 모든 단계를 수행 한 후에는 복잡한 빌드 아키텍처가 TFVC에서 프로젝트를 확인할 때 새 패키지를 가져 오는 데 완벽하게 작동했습니다.


답변

선택적으로 “packages”폴더에서 모든 폴더를 제거하고 “Manage NuGet Packages for Solution …”을 선택하십시오. 이 경우 “복원”버튼이 NuGet Packages Windows에 나타납니다.


답변

Mike가 이미 언급했듯이 VS2015에는 ‘Enable NuGet Package Restore’옵션이 없습니다. 복원 프로세스를 수동으로 호출해야합니다. 파일과 디렉토리를 엉망으로 만드는 좋은 방법은 NuGet 패키지 관리 콘솔 을 사용하는 것입니다. ‘빠른 시작’필드 (일반적으로 오른쪽 상단 모서리)를 클릭 하고을 입력 한 console다음 관리 콘솔을 열고 명령을 입력하십시오.

Update-Package reinstall

솔루션에있는 모든 프로젝트의 모든 패키지가 다시 설치됩니다. 단일 프로젝트를 지정하려면 다음을 입력하십시오.

Update-Package reinstall -ProjectName MyProject

때 물론 이것은 단지 필요 Restore– 버튼 때때로 VS2015에 의해 제공이 – 사용할 수 없습니다. 보다 유용한 업데이트 명령이 여기에 나열되고 설명되어 있습니다. https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages


답변

문제가 있거나 패키지가없는 경우 프로젝트를 마우스 오른쪽 단추로 클릭하고 ” 솔루션 용 NuGet 패키지 관리 … “를 선택하면됩니다. 이 버튼을 클릭하면 “복원”이라는 메뉴 막대가 표시되는 화면이 열립니다.
복원

그것을 클릭하면 필요한 패키지가 자동으로 설치됩니다.
나는 이것이 당신이 찾고있는 것이라고 믿고, 이것은 내 문제를 해결했습니다.


답변

모든 패키지를 복원하려면이 명령을 사용하십시오.

dotnet restore


답변

너겟 패키지가있는 프로젝트를 Vx20XX에서 VS2015로 업그레이드 할 때 너겟 패키지에 문제가있을 수 있습니다.

오류 메시지의 예 :이 프로젝트는이 컴퓨터에서 누락 된 NuGet 패키지를 참조합니다. NuGet Package Restore를 활성화하여 다운로드하십시오.

2016-02-06 업데이트 : 정보에 대한 링크가 있지만 더 이상 작동하지 않습니다. 최근 경로로 문제가 해결 된 것 같습니다. ???

MSBuild 통합 패키지 복원과 자동 패키지 복원 을 수행하는 작은 프로그램을 작성하는 중에 문제가 해결되었습니다.

이 도구의 실행 파일은 여기에서 다운로드 할 수 있습니다 .

결과를 알려주십시오 :-)!

여기에 이미지 설명을 입력하십시오

참조 코드 :

<Window x:Class="FixNuGetProblemsInVs2015.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:FixNuGetProblemsInVs2015"
        mc:Ignorable="d"
        Title="Fix NuGet Packages problems in Visual Studio 2015 (By Eric Ouellet)" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="10"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0">Root directory of projects</TextBlock>
        <Grid Grid.Row="0" Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <TextBox Grid.Column="0" Name="DirProjects"></TextBox>
            <Button Grid.Column="1" VerticalAlignment="Bottom" Name="BrowseDirProjects" Click="BrowseDirProjectsOnClick">Browse...</Button>
        </Grid>

        <!--<TextBlock Grid.Row="1" Grid.Column="0">Directory of NuGet Packages</TextBlock>
        <Grid Grid.Row="1" Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <TextBox Grid.Column="0" Name="DirPackages"></TextBox>
            <Button Grid.Column="1"  Name="BrowseDirPackages" Click="BrowseDirPackagesOnClick">Browse...</Button>
        </Grid>-->

        <TextBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Name="TxtLog" IsReadOnly="True"></TextBox>

        <Button Grid.Row="3" Grid.Column="0" Click="ButtonRevertOnClick">Revert back</Button>
        <Button Grid.Row="3" Grid.Column="2" Click="ButtonFixOnClick">Fix</Button>
    </Grid>
</Window>


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;

/// <summary>
/// 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
/// </summary>

namespace FixNuGetProblemsInVs2015
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    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<XElement> elementsToRemove = new List<XElement>();

            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";
        }

    }
}