首页 > 解决方案 > 在 PowerShell 脚本中,如何还原包以解决错误:此项目引用此计算机上缺少的 NuGet 包

问题描述

我的任务是编写一个 PowerShell 脚本来下载给定分支的最新源代码,重新构建并部署它。我编写的脚本能够下载项目,并且在大多数情况下能够重建它们。但是在一个 web 项目中,我得到了这个错误:

error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.2.0.1\build\Microsoft.Net.Compilers.props.

我已经研究过 PowerShell 是否具有类似于 VS 命令提示符中可用的 Update-Package 命令,但找不到等效命令。

我知道 Packages 有一个 cmdlet,但据我所知,它们用于更新特定的包......我需要的是能够让它下载/更新项目中引用的所有包。

一些可能感兴趣的点...

当我获得有关新空文件夹解决方案的最新信息时,包文件夹中唯一的东西是 Modernizr.2.6.2。无论我是在 VS 还是在我的 PowerShell 脚本中获得最新版本,这都是一样的。

如果我在 VS 2017 中打开解决方案,我可以毫无问题地重建解决方案。它下载/安装十几个其他包...其中一个是错误消息中提到的 Microsoft.Net.Compilers.props 包。

但是,如果我删除所有内容并重新下载源代码,然后通过我的 PowerShell 脚本调用 MSBuild 来重建解决方案,我会收到上述错误。它似乎永远不会下载/安装丢失的软件包。

任何人都知道如何在我的 PowerShell 脚本中使用 MSBuild 来重建项目并让它自动更新/安装它需要的任何包?

谢谢

标签: powershellmsbuildnuget

解决方案


我能够在此页面上找到解决问题的方法:使用 PowerShell 快速还原 NuGet 包

该页面上有一个脚本,它使用 Nuget.exe 根据 packages.config 下载包:

#This will be the root folder of all your solutions - we will search all children of 
this folder
$SOLUTIONROOT = "C:\Projects\"
#This is where your NuGet.exe is located
$NUGETLOCATION = "C:\Projects\NuGet\NuGet.exe"

Function RestoreAllPackages ($BaseDirectory)
    {
        Write-Host "Starting Package Restore - This may take a few minutes ..."
        $PACKAGECONFIGS = Get-ChildItem -Recurse -Force $BaseDirectory -ErrorAction SilentlyContinue | Where-Object { ($_.PSIsContainer -eq $false) -and  ( $_.Name -eq     "packages.config")}
        ForEach($PACKAGECONFIG in $PACKAGECONFIGS)
            {
                Write-Host $PACKAGECONFIG.FullName
                $NugetRestore = $NUGETLOCATION + " install " + " '" + $PACKAGECONFIG.FullName + "' -OutputDirectory '" +     $PACKAGECONFIG.Directory.parent.FullName + "\packages'"
                Write-Host $NugetRestore
                Invoke-Expression $NugetRestore
            }
    }

RestoreAllPackages $SOLUTIONROOT
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

我修改了这个函数并将其添加到我的 PS 脚本中,并首先调用它来下载所有包,这样就完成了!


推荐阅读