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

在PowerShell脚本中,如何还原包以解决错误:此项目引用此计算机上缺少的NuGet包,powershell,msbuild,nuget,Powershell,Msbuild,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

我的任务是编写一个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命令提示符中可用的更新包命令,但没有找到等效命令

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

一些可能感兴趣的观点

当我得到一个新的空文件夹的最新解决方案时,packages文件夹中唯一的东西就是Modernizer.2.6.2。无论是在VS中还是在PowerShell脚本中,这都是一样的

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

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

有人知道我如何在PowerShell脚本中使用MSBuild重建项目,并让它自动更新/安装所需的任何软件包吗


谢谢

我在本页找到了解决问题的方法:

该页面上有一个脚本,它使用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脚本中,并首先调用它来下载所有包,这样就完成了任务

我在这个页面上找到了解决问题的方法:

该页面上有一个脚本,它使用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脚本中,并首先调用它来下载所有包,这样就完成了任务

您需要调用MSBuild的
restore
目标来下载NuGet包。您可以通过运行以下操作来实现:

git克隆[您的回购]
cd[你的回购协议]
msbuild/target:还原[您的解决方案]
msbuild[您的解决方案]

您需要调用MSBuild的
restore
目标来下载NuGet软件包。您可以通过运行以下操作来实现:

git克隆[您的回购]
cd[你的回购协议]
msbuild/target:还原[您的解决方案]
msbuild[您的解决方案]

项目似乎指定了旧版本的.NET编译器,而不是系统安装的版本。您不能更新项目以使用较新的项目吗?如果没有,则查看是否有repo可以提供它,将其作为存储库添加到PS,然后使用PS命令:安装包Microsoft.Net.Compilers-RequiredVersion 2.0.1-Source RepoName?项目似乎指定了旧版本的.Net编译器,而不是系统安装的编译器。您不能更新项目以使用较新的项目吗?如果没有,那么看看是否有repo可以提供它,将其作为存储库添加到PS,然后使用PS命令:Install Package Microsoft.Net.Compilers-RequiredVersion 2.0.1-Source RepoName?我也尝试过,但似乎只有当包信息存储在csproj文件中而不是packages.config中时,它才起作用。在我的例子中,packages信息存储在packages.config中,因此我能够使其工作的唯一方法是使用我上面发布的PS脚本。是的,可能是这样。如果您有足够的带宽这样做,我建议您升级您的项目以使用新的格式,它简化了许多常见的NuGet用例。我也尝试过这样做,但似乎只有当包信息存储在您的csproj文件中而不是packages.config中时,它才起作用。在我的例子中,packages信息存储在packages.config中,因此我能够使其工作的唯一方法是使用我上面发布的PS脚本。是的,可能是这样。如果您有足够的带宽,我建议您升级您的项目以使用新的格式,它简化了许多常见的NuGet用例。