首页 文章

如何让NuGet安装/更新packages.config中的所有软件包?

提问于
浏览
581

我有一个包含多个项目的解决方案 . 大多数第三方引用都缺失,但每个项目都有 packages.config 文件 . How do I get NuGet to install/update all the packages needed? 这是否需要通过命令行为每个项目完成?

16 回答

  • 6

    我相信你需要做的第一件事是enable the package restore feature . 另见here . 这是在解决方案(非项目)级别完成的 .

    但这不会让你一路走来 - 在启用恢复功能后我遇到了类似的问题 . (VS2013,NuGet 2.8 . )

    事实证明,当我提交项目时,我(无意中)将包提交给源代码控制 - 但Visual Studio(和源代码控制插件)在执行签入时有助于忽略二进制文件 .

    当我创建一个发布分支时出现了问题 . 我的dev / main / trunk分支的本地副本有二进制文件,因为这是我最初安装/下载软件包的地方 .
    但是,在新版本分支中,

    • 包文件夹和 .nupkg 文件都在那里 - 所以NuGet认为没有什么可以恢复;

    • 但同时,没有任何DLL存在 - 即第三方引用丢失 - 所以我无法构建 .

    我删除了 $(SolutionDir)/packages 中的所有包文件夹(在发布分支下),然后运行了完整的重建,这次构建成功了 .
    ...然后我当然回去并从源代码控制中删除了包文件夹(在trunk和release分支中) . 我还不清楚是否应该删除 repositories.config 文件 .

    项目模板为您安装的许多组件 - 至少对于Web项目 - 是NuGet包 . 也就是说,此问题不仅限于您添加的软件包 .
    因此,在创建项目/解决方案后立即启用包恢复,并在执行初始签入之前,清除 packages 文件夹(并确保将 .nuget 文件夹提交到源代码管理) .

    免责声明:我在SO上看到了另一个答案,表明清除 packages 文件夹是解决方案的一部分 . 这让我走上正轨,所以如果我偶然发现它,我会发布一个编辑 .

    我还注意到 Update-Package -reinstall 将修改 .sln.csproj / .vbproj 文件 . 至少这就是我的情况 . 哪个恕我直言使这个选项更具吸引力 .

  • 18

    对于那些由于构建服务器违反此规定而到达此处的人,您可以创建一个运行exec命令的MSBuild目标来运行 nuget restore 命令,如下所示(在这种情况下,nuget.exe位于.nuget文件夹中,而不是path),然后可以在构建解决方案之前立即在TeamCity构建步骤中运行

    <Target Name="BeforeBuild">
      <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
    </Target>
    
  • 1

    如果Nuget 2.8安装,请选中复选框

    Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
    

    在Visual Studio中 . 如果选中它,那么只需重建项目即可恢复所有参考库 .

  • 1

    在Visual Studio 2017中 - 使用IDE编译时 - 它将下载所有缺少的nuget包并保存在“packages”文件夹中 .

    但是在构建机器上编译是使用msbuild.exe完成的 . 在那种情况下,我下载了nuget.exe .

    在执行msbuild.exe之前的每个构建过程中 . 它将执行 - > nuget.exe恢复NAME_OF_SLN_File(如果只有一个.SLN文件,则可以忽略该参数) .

  • 10

    使用最新的NuGet 2.5版本,软件包管理器中现在有一个"Update All"按钮:http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once

  • 15

    您可以使用nuget.exe来恢复您的软件包,或者使用NuGet 2.7或更高版本安装,您只需在Visual Studio中编译您的解决方案,这也将恢复丢失的软件包 .

    对于NuGet.exe,您可以为每个项目运行以下命令 .

    nuget install packages.config
    

    或者使用NuGet 2.7 you can restore all packages in the solution使用命令行 .

    nuget restore YourSolution.sln
    

    这两个都将拉下包裹 . 但是,在运行此命令时,不会修改项目文件,因此项目应该已经具有对NuGet包的引用 . 如果不是这种情况,则可以使用Visual Studio安装软件包 .

    使用NuGet 2.7及更高版本,Visual Studio将在您构建解决方案时自动恢复丢失的NuGet包,因此无需使用NuGet.exe .

    要更新解决方案中的所有软件包,请先恢复它们,然后您可以使用NuGet.exe更新软件包,也可以在Visual Studio中从Package Manager控制台窗口更新软件包,或者最后可以使用Manage包对话框 .

    从命令行,您可以将解决方案中的软件包更新为nuget.org提供的最新版本 .

    nuget update YourSolution.sln
    

    请注意,这不会在任何NuGet包中运行任何PowerShell脚本 .

    在Visual Studio中,您可以使用Package Manager Console来更新包 . 这样做的好处是,任何PowerShell脚本都将作为更新的一部分运行,因为使用NuGet.exe将无法运行它们 . 以下命令将每个项目中的所有包更新为最新版本可从nuget.org获得 .

    Update-Package
    

    您也可以将其限制为一个项目 .

    Update-Package -Project YourProjectName
    

    如果要将软件包重新安装到与先前安装的版本相同的版本,则可以将 -reinstall 参数与 Update-Package 命令一起使用 .

    Update-Package -reinstall
    

    您也可以将其限制为一个项目 .

    Update-Package -reinstall -Project YourProjectName
    

    -reinstall 选项将首先卸载,然后再将软件包重新安装到项目中 .

    或者,您可以使用 Manage Packages 对话框更新包 .

    Updates:

    • 2013/07/10 - 更新了NuGet 2.7中有关nuget恢复的信息

    • 2014/07/06 - 更新了有关Visual Studio中自动程序包还原的信息,并通过对NuGet的其他更改使答案保持最新 .

    • 2014/11/21 - 更新了有关 -reinstall 的信息

  • 166

    如果您正在使用网站项目,或者不想启用NuGet包还原,这是另一种解决方案 .

    您可以使用程序包管理器控制台枚举package.config文件中的所有程序包并重新安装它们 .

    # read the packages.config file into an XML object
    [xml]$packages = gc packages.config
    
    # install each package 
    $packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }
    
  • 740

    我知道这是一个老帖子,但认为这可能有用 . 如果在更新过程中需要忽略特定包(例如更新JavaScript引用的任何包),请使用以下PowerShell脚本(确保在Package Manager控制台中将包源设置为“全部”):

    EDIT 2014-09-25 10:55 AM EST - 修正了脚本中的错误

    $packagePath = "packages.config"
    $projectName = "MyProjectName"
    
    $packagesToIgnore = @(
        "bootstrap",
        "jQuery",
        "jquery-globalize",
        "jquery.mobile",
        "jQuery.jqGrid",
        "jQuery.UI.Combined",
        "jQuery.Validation",
        "Microsoft.jQuery.Unobtrusive.Validation",
        "Modernizr",
        "Moment.js"
    )
    
    [xml]$packageFile = gc $packagePath
    $packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}
    
    $packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }
    
  • 3

    在Visual Studio中还有另一种更新,更快捷的方法 . 查看David Ebbo的this post,如果遇到麻烦,请参考评论部分 . 基本上,您在包管理器提示符中执行以下操作:

    PM> Install-Package NuGetPowerTools
    PM> Enable-PackageRestore
    

    之后,当您构建解决方案时,如果丢失了软件包,它们将自动安装 .

    Update:

    此功能内置于 Nuget 1.6 中,具有visual studio集成功能,因此您甚至无需安装NuGetPowerTools或键入命令 . 你所要做的就是

    右键单击Solution Explorer中的Solution节点,然后选择Enable NuGet Package Restore .

    阅读this article了解更多详情 .

  • 0

    我正在使用visual studio 2015,上面给出的解决方案对我不起作用,所以我做了以下工作:

    从我的解决方案中删除packages文件夹,并从解决方案中的每个项目中删除bin和obj文件夹,并进行重建 .

    也许你会有下一个错误:

    无法找到nuget.exe

    要解决此问题:在NuGet.targets文件中更改此行并将其设置为true:

    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
    

    参考:https://stackoverflow.com/a/30918648https://stackoverflow.com/a/20502049

  • 4
    Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
    

    这是我发现的最好和最简单的例子 . 它将重新安装packages.config中列出的所有nugets,它将保留当前版本 . 将 YourProjectNameGoesHere 替换为项目名称 .

  • 0

    我尝试了 Update-Package -reinstall 但它在一个软件包上失败并停止处理我解决方案中所有剩余的项目包 .

    我最终得到了我的脚本,它枚举了所有的package.config文件,并为每个项目/包运行 Update-Package -Reinstall -ProjectName prj -Id pkg .

    希望它对某些人有用:

    $files = Get-ChildItem -Recurse -Include packages.config;
    
    [array]$projectPackages = @();
    $files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }
    
    $projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }
    

    Edit: 这是我遇到的错误:Update-Package:无法找到包'EntityFramework.BulkInsert-ef6' . 在执行安装或更新之前,必须还原现有软件包 . Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 的手动运行非常好 .

  • 3

    经过3个小时的搜索和调查 .

    我遇到了问题,因为我们团队中有两个成员(使用GitHub源代码控制),因为我们没有限制用于发送到远程存储库的软件包的文件,团队成员之一是将软件包发送到服务器而我已将其更改为我的当地人 .

    之后我遇到了与PO相同的问题,我也无法将我的API项目发布到服务器 .

    在和我刚刚使用过

    Update-Package -Reinstall - 在程序包管理器控制台上运行此命令

    此命令将重新安装您在解决方案中使用的所有软件包 . (对于每个项目)

    重新安装当前解决方案的所有项目中的所有包:

    Update-Package -ProjectName 'NameOfProject' -Reinstall - 在程序包管理器控制台上运行此命令

    此命令将重新安装与“-ProjectName”之后指定的项目相关的所有包 . 我认为这更好,因为我等了半个小时才重新安装解决方案中的所有软件包 .

    非常感谢Rodolpho Brock .

    此外,我建议您从远程服务器提取更改时,按下Visual Studio将显示的“恢复包”按钮 .

  • 2

    重新安装当前解决方案的所有项目中的所有包:

    Update-Package -Reinstall
    

    重新安装当前解决方案的SPECIFIC PROJECT中的所有软件包(感谢unarityashes999):

    Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
    
  • 1

    现在,Visual Studio 2012中的Nuget Package Manager控制台会在找到任何未安装的软件包但在package.config中时自动为您提供“恢复”按钮 . 很棒的功能!

  • 461

    在VS2012 V11,如果我在行尾使用“-Reinstall”它不起作用 .

    所以我只是使用:

    Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
    

相关问题