ฉันจะเปิดใช้งาน NuGet Package Restore ใน Visual Studio ได้อย่างไร


272

มีโพสต์ที่คล้ายกันบนสแต็ก แต่ก็ไม่ได้ช่วยแก้ไขปัญหาของฉันอาจเป็นเพราะฉันใช้ Visual Studio 2015

ฉันจะรับตัวเลือก "Enable NuGet Package Restore" ให้ปรากฏใน VS2015 ได้อย่างไร

ผมเลือกไฟล์> โครงการใหม่และสร้างที่ว่างเปล่าแอพลิเคชันเว็บ ASP.NET ฉันกำลังมองหาตัวเลือกเมนูนี้

ป้อนคำอธิบายรูปภาพที่นี่

ฉันควรพูดถึงว่าฉันได้ค้นหาไฟล์ nuGet ที่มีอยู่แล้วในโฟลเดอร์โครงการของฉันและไม่มีเลย


4
ตรวจสอบให้แน่ใจว่าคุณกำลังพยายามทำสิ่งนี้กับโซลูชันไม่ใช่โครงการเว็บ โดยค่าเริ่มต้นการแก้ปัญหาจะไม่ปรากฏขึ้นเมื่อมีเพียงหนึ่งโครงการ
JConstantine

1
ใช่นั่นเป็นข้อผิดพลาดที่ง่ายมากที่จะทำ แต่ฉันแน่ใจว่าได้ตรวจสอบกับโซลูชันฉันคิดว่ามันอาจจะเกี่ยวข้องกับ 2015 ตัวเลือกเปิดใช้งานพร้อมใช้งานใน VS2013 เมื่อฉันทำตามขั้นตอนเดียวกัน
Dan Beaulieu

2
กันที่นี่ ฉันพยายามลบโฟลเดอร์. nuget ซึ่งเปิดใช้งานตัวเลือกเปิดใช้งาน NuGet Package Restore ใน VS 2013 แต่ยังไม่มีลูกเต๋า ฉันกำลังพยายามเปิดแอปพลิเคชั่น MVC ที่มีอยู่ซึ่งสร้างขึ้นใน VS 2013
Vinney Kelly

4
@justanotherdev มันจะมีประโยชน์ถ้าคุณให้การอ้างอิงถึงเวิร์กโฟลว์ใหม่เพื่อให้ความคิดเห็นของคุณมีประสิทธิภาพมากขึ้นอีกเล็กน้อย
avantprime

1
ฉันไม่เห็นบทความของ David Ebbo อ้างอิงโดย oligofren ดังนั้นฉันเพิ่งเปิดไฟล์ sln & csproj ใน Notepad ++ และลบส่วนที่เขาแสดง ฉันเปิดโซลูชันใน VS2015 และเมื่อฉันบันทึกไฟล์แล้ว VS แจ้งให้ฉันโหลดพวกเขาอีกครั้งและการอ้างอิงโซลูชันของฉันตอนนี้ใช้ได้ดีและคอมไพล์โซลูชันของฉัน ขอบคุณมาก Vinney!
Rich Ward

คำตอบ:


248

ใช้เวลานานเกินไป แต่ในที่สุดฉันก็พบเอกสารนี้เกี่ยวกับการโยกย้ายโซลูชัน MSBuild-Integrated ไปยัง Automatic Package Restoreและฉันสามารถแก้ไขปัญหาได้โดยใช้วิธีการที่อธิบายไว้ที่นี่

  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>

3
ฉันพลาดอะไรบางอย่างที่นี่ เมื่อฉันใช้วิธีนี้ฉันจะได้รับแพกเกจจำนวนมากที่ติดตั้งในทุก ๆ โซลูชันที่ฉันมี ฉันมีโซลูชันหนึ่งรายการพร้อมด้วย 10 แพคเกจและอีกโซลูชันหนึ่งที่มีแพ็คเกจเดียวกัน: ไดเรกทอรีที่ต่างกันสองรายการจะถูกสร้างขึ้นแต่ละรายการประกอบด้วย 10 แพคเกจ เมื่อใช้วิธีนี้คุณจะรวมแพ็คเกจทั้งหมดของคุณไว้ในไดเรกทอรีเดียวได้อย่างไร (เช่นวิธี VS2013 แบบเก่าที่อนุญาตโดยแก้ไขไฟล์ NuGet.Config)
Quarkly

ไม่เห็นโฟลเดอร์. nuget ใช่ไหม ไปดูโซลูชันเกี่ยวกับการลบโฟลเดอร์ในโฟลเดอร์แพ็คเกจ เป็นไปได้ที่แพ็คเกจของคุณจะถูกกู้คืนครึ่งหนึ่งและขยะนั้นปิดกั้นไม่ให้กู้คืนอย่างสมบูรณ์
เกร็ก

อันที่จริงนี่คือทางออก นอกจากนี้ - ฉันได้เพิ่ม "การคืนค่า nuget" ก่อนที่จะเริ่มสร้างโครงการ แพคเกจ nuget จะได้รับการดาวน์โหลดอัตโนมัติและการสร้างโครงการจะทำงานหลังจากนี้
TarmoPikaro

5
เพื่อประหยัดเวลาสคริปต์ในการดำเนินการจากพื้นที่เก็บข้อมูล GitHub ที่กล่าวถึงโดย @VinneyKelly คือ migrateToAutomaticPackageRestore.ps1 ที่ถูกกล่าวถึงโดย @VinneyKelly
ริกา

60

Microsoft ได้ให้การสนับสนุน 'เปิดใช้งานการเรียกคืนแพคเกจ NuGet' ใน VS2015 และคุณจำเป็นต้องทำการเปลี่ยนแปลงด้วยตนเองเพื่อย้ายข้อมูลโซลูชันเก่าหรือเพิ่มคุณสมบัติให้กับโซลูชันใหม่ คุณสมบัติใหม่ที่อธิบายไว้สวยดีในNuGet แพคเกจ Restore

นอกจากนี้ยังมีคู่มือการย้ายข้อมูลสำหรับโครงการที่มีอยู่ (ตามที่กล่าวไว้ก่อนหน้า) ที่นี่: คู่มือการย้ายข้อมูลของ NuGet

เมื่อทำการอัพเกรด:

  1. ห้ามลบไดเร็กทอรี. nuget
  2. ลบไฟล์ nuget.exe และ nuget.targets
  3. ปล่อยให้ nuget.config
  4. กำจัดไฟล์โครงการแต่ละไฟล์ของการอ้างอิงไปยังเป้าหมาย NuGet ด้วยตนเอง สคริปต์ Powershell ที่กล่าวถึงดูเหมือนจะทำความเสียหายได้ดีกว่าดี

เมื่อสร้างโครงการใหม่:

  1. ในโซลูชัน Visual Studio 2015 ของคุณสร้าง Solution Directory ชื่อ. nuget
  2. สร้างไดเร็กทอรีจริงของไดเร็กทอรีโซลูชัน (โดยที่ไฟล์. sln มีชีวิตอยู่) และเรียกมันว่า. นูทเซ็ต (โปรดทราบว่าไดเร็กทอรีโซลูชันไม่เหมือนกับไดเร็กทอรีระบบไฟล์จริงแม้ว่าจะมีชื่อเดียวกัน)
  3. สร้างไฟล์ในไดเร็กทอรี. nuget ชื่อ nuget.config

  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 สำเนาของแพ็คเกจเดียวกันที่ลอยอยู่รอบ ๆ ในระบบไฟล์ของคุณ เส้นทางสัมพัทธ์จะเปลี่ยนแปลงขึ้นอยู่กับสถาปัตยกรรมไดเรกทอรีโซลูชันของคุณ แต่ควรชี้ไปที่ไดเรกทอรีทั่วไปสำหรับโซลูชันทั้งหมดของคุณ

คุณต้องรีสตาร์ท Studio visual หลังจากทำขั้นตอนที่ 5 Nuget จะไม่รู้จักการเปลี่ยนแปลงจนกว่าคุณจะทำเช่นนั้น

สุดท้ายคุณอาจต้องใช้ 'ผู้จัดการแพคเกจ Nuget สำหรับโซลูชั่น' เพื่อถอนการติดตั้งแล้วติดตั้งแพคเกจ ฉันไม่รู้ว่านี่เป็นผลข้างเคียงของสคริปต์ Powershell ที่ฉันวิ่งหรือเป็นวิธีที่จะทำให้ NuGet กลับเข้าเกียร์ เมื่อฉันทำตามทุกขั้นตอนเหล่านี้แล้วสถาปัตยกรรมการสร้างที่ซับซ้อนของฉันก็ทำงานได้อย่างไร้ที่ติเมื่อนำแพคเกจใหม่ลงมาเมื่อฉันตรวจสอบโครงการจาก TFVC


1
เหตุใดจึงลบไฟล์ nuget.targets ฉันจะได้รับบิลด์ที่สอดคล้องกันเมื่อหายไปหรือไม่
Frode Nilsen

1
ดูเหมือนว่าเป้าหมายจะถูกรวมเข้ากับ IDE ในขณะนี้รวมถึงฟังก์ชั่นที่ 'nugget.exe' ใช้เพื่อจัดทำ สิ่งเดียวที่คุณยังต้องการคือการกำหนดค่า
Quarkly

1
นอกจากขั้นตอนที่กล่าวถึงโดย DRAirey ฉันต้องทำสิ่งต่อไปนี้: 1) แทนที่จะใช้ $ \ .. \ .. \ .. \ .. \ แพคเกจใช้ ../../ (การประชุมพา ธ พาเรนต์ windows ไม่มี $ ที่จุดเริ่มต้น 2) บันทึกโซลูชันปิดและเปิดใหม่เพื่อให้ nuget.config อ่านและให้เกียรติโดยการติดตั้งแพ็กเกจ
Sudhanshu Mishra

สิ่งนี้ช่วยในโครงการ VS2015 ใหม่ของฉันที่ฉันใช้แพ็คเกจ dir และสมาชิกในทีมคนอื่นไม่สามารถสร้างใหม่ได้เนื่องจากการพึ่งพา NuGet
azec-pdx

1
คุณต้องรีสตาร์ท Visual Studio หลังจากทำตามขั้นตอนที่ 5 Nuget จะไม่รู้จักการเปลี่ยนแปลงจนกว่าคุณจะทำเช่นนั้น
Barry Colebank Jr

35

คุณสามารถลบโฟลเดอร์ทั้งหมดออกจากโฟลเดอร์ "แพ็คเกจ" และเลือก "จัดการแพคเกจ NuGet สำหรับโซลูชัน ... " ในกรณีนี้ปุ่ม "กู้คืน" จะปรากฏบน NuGet Packages Windows


1
ลองปิดและเปิดหน้าต่างแพคเกจ NuGet อีกครั้งหลังจากลบโฟลเดอร์ในโฟลเดอร์ "แพ็คเกจ"
Ivan Branets

6
+1 สิ่งนี้ใช้งานได้สำหรับฉันโปรดทราบว่าปุ่มคืนค่าจะปรากฏขึ้นที่ด้านบนของหน้าต่างด้านล่างแท็บ กล่าวว่า: "แพ็คเกจ NuGet บางอย่างหายไปจากโซลูชันนี้คลิกเพื่อกู้คืนจากแหล่งแพ็คเกจออนไลน์ของคุณ"
Eruza

เพื่อให้ง่ายและง่าย .. นี้ทำงานให้ฉัน .. เดานี้ควรได้รับการโหวตมากขึ้นคำตอบ :)
Nirman

ง่ายและสะดวก นี่ควรเป็นคำตอบ
Axel

จะเป็นการดีหรือไม่ที่จะเพิ่มโฟลเดอร์นี้ในไฟล์. gignignore
Axel

26

ตามที่กล่าวไว้แล้วโดย Mike ไม่มีตัวเลือก 'เปิดใช้งาน NuGet Package Restore' ใน VS2015 คุณจะต้องเรียกใช้กระบวนการกู้คืนด้วยตนเอง วิธีที่ดี - โดยไม่ต้องยุ่งกับไฟล์และไดเรกทอรี - ใช้NuGet Package Management Console : คลิกลงในช่อง 'Quick start' (โดยปกติจะอยู่ที่มุมขวาบน), เข้าconsole, เปิด, เปิดคอนโซลการจัดการและป้อนคำสั่ง:

Update-Package reinstall

นี่จะติดตั้งแพคเกจทั้งหมดของโครงการใหม่ทั้งหมดในโซลูชันของคุณอีกครั้ง หากต้องการระบุโครงการเดียวให้ป้อน:

Update-Package reinstall -ProjectName MyProject

แน่นอนว่านี่เป็นสิ่งจำเป็นเฉพาะเมื่อRestoreปุ่ม - บางครั้งเสนอโดย VS2015 - ไม่สามารถใช้ได้ คำสั่งการปรับปรุงที่มีประโยชน์เพิ่มเติมมีการระบุไว้และอธิบายไว้ที่นี่: https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages


ขอบคุณมากฉันมีปัญหาที่คล้ายกัน ฉันเพิ่งแก้ไขปัญหาของฉันผ่านขั้นตอนของคุณ ขอบคุณมาก
McElie

กันที่นี่เพียงคนเดียวที่ทำงานและไม่จำเป็นต้องเขียนสิ่งต่าง ๆ ทั่วสถานที่
ฮาร์วีย์หลิน

คำตอบที่มีประโยชน์ที่สุดที่นี่!
นีโอ

13

หากคุณมีปัญหาใด ๆ หรือขาดแพ็คเกจใด ๆ คุณสามารถคลิกขวาที่โปรเจ็กต์ของคุณแล้วเลือก " จัดการแพ็คเกจ NuGet สำหรับโซลูชัน ... " หลังจากคลิกที่หน้าจอนี้จะเปิดขึ้นซึ่งคุณจะเห็นแถบเมนูว่า "คืนค่า": ฟื้นฟู

คลิกที่มันและแพคเกจที่จำเป็นจะถูกติดตั้งโดยอัตโนมัติ
ฉันเชื่อว่านี่คือสิ่งที่คุณกำลังมองหาการแก้ไขปัญหาของฉัน


3
แต่นั่นจะช่วยได้ก็ต่อเมื่อแถบการแจ้งเตือนนั้นปรากฏขึ้นแสดงว่ามันไม่ได้อยู่ในกรณีของฉัน
นิโคลัสปีเตอร์เสน

2
ขั้นตอนที่ติดตั้งแพคเกจด้วยตนเองอย่างสมบูรณ์พลาดจุดการคืนค่าอัตโนมัติ
Quarkly

ฉันเชื่อว่านี่น่าจะเป็นคำตอบที่ยอมรับได้มันเป็นฟังก์ชั่นเดียวกัน
user25064

1
ฉันเห็นตัวเลือกในการกู้คืนโดยคลิกขวาบนโซลูชัน อยู่ที่นั่นภายใต้ "จัดการแพคเกจ NuGet สำหรับการแก้ปัญหา" ทำเคล็ดลับสำหรับฉัน
Daryl

1
ใช้งานไม่ได้สำหรับฉัน - ฉันเห็นคำเตือนในการแก้ปัญหาแพคเกจ nuget ที่หายไป แต่การจัดการแพ็คเกจ nuget ไม่ได้แสดงตัวเลือกให้ฉันดาวน์โหลด ฉันไม่สามารถสร้างและกู้คืนได้ นอกจากนี้คำสั่งกู้คืนไม่ทำอะไรเลย
Markus


6

เมื่ออัพเกรดโปรเจ็กต์ด้วยแพ็กเกจ nuget จาก Vx20XX เป็น VS2015 คุณอาจมีปัญหากับแพ็กเกจ nuget

ตัวอย่างของข้อความแสดงข้อผิดพลาด: โครงการนี้อ้างอิงแพคเกจ NuGet ที่หายไปบนคอมพิวเตอร์นี้ เปิดใช้งานแพ็คเกจ NuGet เพื่อดาวน์โหลด

อัพเดท 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";
        }

    }
}

โปรแกรมทำงานได้ดีสำหรับการแปลงโครงการจำนวนมากในโซลูชันของฉัน รุ่นล่าสุดมีช่อง "สารบบของแพคเกจ NuGet" เช่นกัน แต่ดูเหมือนจะไม่ส่งผลกระทบต่อผลลัพธ์ มันทำอะไร?
Christoffer Årstrand

ขออภัยฉันไม่มีความคิด ฉันสงสัยว่ามันจะขึ้นอยู่กับเนื้อหาของไฟล์ บางทีคุณสามารถติดตามฟังก์ชั่น: "FromProjectFileRemoveNugetTargets" และดูว่าไฟล์ของคุณอาจได้รับผลกระทบหรือไม่? ขออภัยสำหรับคำตอบที่ไม่ดีฉันจำไม่ได้ว่าฉันเขียนรหัสอะไร :-(! ฉันเพิ่งรู้ว่าฉันใช้คอมพิวเตอร์สองเครื่องที่ประสบความสำเร็จสองครั้ง
Eric Ouellet

5

ไปที่ References ใน visual studio และดูว่าแพ็คเกจใดหายไป ตอนนี้คลิกขวาที่โซลูชันในภาพและคลิกที่เปิดโฟลเดอร์ในตัวสำรวจไฟล์ ตอนนี้เปิดโฟลเดอร์แพ็คเกจและลบโฟลเดอร์แพ็คเกจที่ขาดหายไป เปิด visual studio และสร้างโซลูชันขึ้นมา แพ็คเกจที่หายไปทั้งหมดจะถูกกู้คืน โปรดทำเครื่องหมายว่านี่เป็นคำตอบถ้าฉันช่วย


4

ฉันคิดว่าสำหรับโครงการ asp.net 4 ที่เรากำลังจะทำการกู้คืนอัตโนมัติดังนั้นจึงไม่จำเป็นต้องทำเช่นนี้ สำหรับโครงการเก่าฉันคิดว่าจำเป็นต้องมีงานแปลงเล็กน้อย

http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore


คุณอาจพูดถูก ฉันเพิ่งลองสร้างโครงการโดยใช้ขั้นตอนเดียวกันที่แน่นอนใน VS2013 และ "Enable Nuget Package Restore" อยู่ที่นั่น ขอบคุณสำหรับลิงค์ฉันจะตรวจสอบออกตอนนี้
Dan Beaulieu

4

วิธีนี้ใช้ได้ผลสำหรับฉัน:

  • ปิด VS2015
  • เปิดโซลูชันชั่วคราวใน VS2013 และเปิดใช้งานการคืนค่าแพคเกจ nugetโดยคลิกขวาที่โซลูชัน (ฉันได้สร้างใหม่ แต่ฉันสงสัยว่าไม่จำเป็น)
  • ปิด VS2013
  • เปิดโซลูชันใน VS2015 อีกครั้ง

ตอนนี้คุณได้เปิดใช้งานแพคเกจ nuget ที่คืนค่าใน VS2015 เช่นกัน


4

ผมประสบปัญหาเดียวกันในขณะที่พยายามที่จะสร้างโครงการตัวอย่างgplus-QuickStart-csharp ต้นแบบ

ฉันดูข้อความแสดงข้อผิดพลาดอย่างใกล้ชิดและพบวิธีแก้ปัญหาจากการเอาชนะข้อผิดพลาดนี้หวังว่าจะช่วยได้

  • คลิกขวาที่ไฟล์โซลูชันและเปิดใน windows explorer
  • คัดลอกโฟลเดอร์. nugetด้วยNuGet.Config, NuGet.exe, NuGet.targets ( ลิงค์ดาวน์โหลดหรือคัดลอกจากโครงการอื่นและแทนที่)
  • ลองสร้างโซลูชันใหม่

สนุก !!


4

วิธีแก้ปัญหาของIvan Branetsคือสิ่งที่แก้ไขสิ่งนี้สำหรับฉัน แต่รายละเอียดเพิ่มเติมบางอย่างอาจถูกแบ่งปัน

ในกรณีของผมอยู่ในVS 2015โดยใช้แพคเกจออโต้เรียกคืนและTFS นี่คือสิ่งที่เป็นค่าเริ่มต้นทั้งหมด

ปัญหาคือเมื่อนักพัฒนารายอื่นพยายามรับวิธีแก้ปัญหาจาก TFS แพคเกจบางอย่างไม่ได้รับการกู้คืนอย่างสมบูรณ์ (ทำไมที่ฉันยังไม่แน่ใจ) แต่โฟลเดอร์แพคเกจมีโฟลเดอร์สำหรับการอ้างอิงและแพคเกจ NuGet แต่มันไม่ได้รับการขยาย (พูดว่าโฟลเดอร์ lib ที่ประกอบด้วย. dll หายไป) ครึ่งนี้ ที่นั่น แต่แนวคิดที่ไม่ถูกต้องจริงๆคือการป้องกันไม่ให้แพคเกจถูกกู้คืน

คุณจะจำได้เพราะข้อมูลอ้างอิงจะมีเครื่องหมายอัศเจรีย์สีเหลืองเกี่ยวกับการไม่ได้รับการแก้ไข

ดังนั้นทางออกของการลบโฟลเดอร์ภายในแพ็คเกจจึงลบปัญหาการบล็อกการคืนค่าแพคเกจ จากนั้นคุณสามารถคลิกขวาที่ระดับโซลูชันด้านบนเพื่อรับตัวเลือกในการกู้คืนแพ็คเกจและตอนนี้ควรจะทำงาน


4

ปิด VS ลบทุกอย่างภายใต้โฟลเดอร์แพ็คเกจ เปิดโซลูชันของคุณอีกครั้ง คลิกขวาที่โครงการของคุณเลือก 'จัดการแพ็คเกจ nuget ... ' คุณจะเห็นแถบสีเหลืองปรากฏขึ้นที่ด้านบนของหน้าต่าง 'Nuget Package Manager' ขอให้คุณคืนค่าแพ็คเกจ สิ่งนี้ได้ผลสำหรับฉัน


3

คอนโซลตัวจัดการแพคเกจ (Visual Studio, เครื่องมือ> ตัวจัดการแพคเกจ NuGet> คอนโซลตัวจัดการแพคเกจ): เรียกใช้แพคเกจการปรับปรุง - ติดตั้งใหม่ - คำสั่งชื่อโครงการที่เป็นชื่อของโครงการได้รับผลกระทบตามที่ปรากฏในโซลูชัน Explorer ใช้ Update-Package - ติดตั้งเองเพื่อกู้คืนแพ็คเกจทั้งหมดในโซลูชัน ดูการอัพเดทแพ็คเกจ นอกจากนี้คุณยังสามารถติดตั้งแพคเกจเดียวถ้าต้องการ

จากhttps://docs.microsoft.com/en-us/nuget/quickstart/restore


1

อาจเป็นผลมาจากการรันโปรแกรมในขณะที่คุณพยายามติดตั้งแพคเกจ มันเป็นสีเทาหากคุณพยายามที่จะคลิกในขณะที่ตัวใน IIS ทำงานในพื้นหลัง


1

ในกรณีที่บุคคลอื่นพบปัญหานี้ใน Visual Studio 2017 ตรวจสอบให้แน่ใจว่าโครงการเปิดโดยไฟล์. sln ไม่ใช่โฟลเดอร์เนื่องจาก visual studio จะไม่รับการตั้งค่าหากเปิดด้วยโฟลเดอร์ สิ่งนี้จะเกิดขึ้นตามค่าเริ่มต้นหากคุณใช้บริการออนไลน์ของ Visual Studio สำหรับคอมไพล์


1

สำหรับโครงการ. NET Coreให้เรียกใช้dotnet restoreหรือdotnet buildสั่งงานNuGet Package Manager Console(ซึ่งจะเรียกคืนโดยอัตโนมัติ)

คุณสามารถเรียกใช้คอนโซลจาก

เครื่องมือ> ตัวจัดการแพ็คเกจ NuGet> คอนโซลตัวจัดการแพคเกจ


1

msbuild /t:restoreผมใช้


เครดิตและแหล่งที่มา:

ปัญหาของฉันอยู่ที่ MSBuild ดังนั้นฉันจึงติดตามลิงก์ของ @Vinney Kelly : กำลังย้ายโซลูชัน MSBuild-Integrated ไปที่ Automatic Package Restore

และ...

นั่นใช้ได้ LIKE A CHARM =]

MSBuild : ใช้msbuild /t:restoreคำสั่งซึ่งเรียกคืนแพ็คเกจแพ็กเกจที่แสดงรายการในไฟล์โครงการ ( PackageReferenceเท่านั้น) ใช้ได้เฉพาะใน NuGet 4.x + และ MSBuild 15.1+ ซึ่งจะมาพร้อมกับภาพและ สตูดิโอ 2017 nuget restoreและdotnet restoreทั้งสองใช้คำสั่งนี้สำหรับโครงการที่ใช้งานได้


ในกรณีของฉัน / t: การคืนค่าไม่ได้สร้างโครงการสำหรับที่ฉันต้องใช้ / คืนคำสั่ง
Kishan Vaishnav

1

หากทุกอย่างล้มเหลว (หรือก่อนหน้านั้น) คุณอาจต้องการตรวจสอบและดูว่า NuGet เป็นแหล่งแพ็กเกจหรือไม่ ฉันติดตั้ง VS2017 และไม่มีค่าเริ่มต้น ฉันคิดว่ามันแปลก ๆ

  1. เครื่องมือ - ตัวจัดการแพ็คเกจ NuGet - การตั้งค่าตัวจัดการแพคเกจ
  2. คลิก 'แหล่งที่มาของแพคเกจ' ที่การนำทางด้านซ้ายของกล่องโต้ตอบ
  3. ใช้เครื่องหมายบวก (+) เพื่อเพิ่ม Nuget URL: https://api.nuget.org/v3/index.json

0

ฉันต้องลบโฟลเดอร์แพ็คเกจออกและปิดโซลูชัน (VS2015) อีกครั้ง ฉันไม่ได้ย้ายและฉันไม่ได้มีการตรวจสอบแพคเกจในการควบคุมแหล่งที่มา ทั้งหมดที่ฉันสามารถพูดได้คือบางสิ่งบางอย่างสับสนและสิ่งนี้ได้รับการแก้ไข


0

ช่วยฉันผ่านเครื่องมือ >>> ผู้จัดการแพคเกจ Nuget >>> ทั่วไปแล้วเลือกตัวเลือกอนุญาตให้ Nuget ดาวน์โหลดแพ็คเกจที่หายไปและตรวจสอบแพ็คเกจที่หายไปโดยอัตโนมัติในระหว่างการสร้างในสตูดิโอเสมือนจริง

ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันกำลังเผชิญกับปัญหาเดียวกัน ฉันกำลังพยายามเพิ่มโครงการ MVC ซึ่งสร้างขึ้นใน Visual Studio 2015 ไปยังโซลูชันที่ฉันทำใน Visual Studio 2019

มีโครงการที่มีอยู่แล้วใน Visual Studio 2019 ดังนั้นการเพิ่มโครงการที่มีอยู่ซึ่งฉันสร้างใน VS 2015 ทำให้เกิดข้อผิดพลาดเดียวกันนี้ ฉันได้ลองคำตอบทั้งหมดที่นี่ แต่มันไม่ช่วยแก้ปัญหา

สิ่งที่ฉันทำคือเพียงแค่ใส่โฟลเดอร์. nuget ในโฟลเดอร์โซลูชัน เดิมทีลำดับชั้นของโฟลเดอร์คือ:

Solution Folder (VS 2019)
  -> MVC 1 Project
  -> MVC 2 Project
  -> MVC 3 Project (Project that I am adding)
         -> .nuget folder (It contains a .nuget folder)

ดังนั้นปัญหาได้รับการแก้ไขเมื่อฉันย้ายโฟลเดอร์ .uget ในโฟลเดอร์โซลูชันเอง:

    Solution Folder (VS 2019)
  -> MVC 1 Project
  -> MVC 2 Project
  -> MVC 3 Project (Project that I am adding)
  -> .nuget folder (It contains a .nuget folder)

0

VS 2019 เวอร์ชัน 16.4.4 โซลูชันที่กำหนดเป้าหมาย. NET Core 3.1

หลังจากลองวิธีแก้ปัญหาเกือบทั้งหมดที่เสนอที่นี่ฉันปิด VS เมื่อฉันเปิดใหม่อีกไม่กี่วินาทีก็กลับมาเป็นปกติ ...


-4

ยิ่งง่ายยิ่งขึ้นให้เพิ่มโฟลเดอร์. nuget ในโซลูชันของคุณและ 'คืนค่าแพคเกจ Nuget' จะปรากฏขึ้น (ไม่แน่ใจว่าจะต้องมี nuget.exe เพื่อให้ทำงานได้หรือไม่)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.