Answers:
在NuGet软件包管理器控制台中,输入以下命令:
Update-Package -Reinstall -ProjectName Your.Project.Name
如果要重新安装软件包并恢复整个解决方案的引用,请省略该-ProjectName
参数。
您需要在VS解决方案级别启用NuGet软件包还原,以使丢失的软件包还原工作。
如果这对某人有所帮助,对我而言,以上任何一项都不足够。我仍然无法建立,VS仍然找不到引用。关键只是在还原软件包后关闭并重新打开解决方案。
这是场景(使用Visual Studio 2012):
您打开了一个缺少包的解决方案。参考资料表明VS无法找到它们。有很多方法可以还原丢失的软件包,包括
nuget restore
,如果你已经安装了命令行的NuGet但是,无论采用哪种方法,这些参考仍然会显示为丢失。而当您建立它会失败。叹。但是,如果您关闭解决方案并重新打开它,现在VS <HintPath>
再次检查这些nice ,发现程序包又回到了它们所属的位置,并且一切正常。
Visual Studio 仍然看不到您有该软件包吗?仍然显示无法解决的参考?确保您还原的软件包版本与<HintPath>
.csproj文件中的版本完全相同。即使是较小的错误修复号(例如1.10.1至1.10.2)也将导致引用失败。您可以通过直接编辑csproj xml来解决此问题,也可以通过删除引用并在packages目录中指向新还原的版本来解决此问题。
.csproj
文件以确保匹配的版本号对我有用。谢谢!
当@jmfenoll提供的解决方案起作用时,它将更新为最新的软件包。就我而言,安装了beta2(预发行版)后,它将所有库更新为RC1(其中有一个错误)。因此,上述解决方案仅完成一半的工作。
如果您的情况与我相同,并且希望将您的项目与您在中指定的NuGet软件包的确切版本进行同步packages.config
,那么此脚本可能会对您有所帮助。只需将其复制并粘贴到Package Manager控制台中
function Sync-References([string]$PackageId) {
get-project -all | %{
$proj = $_ ;
Write-Host $proj.name;
get-package -project $proj.name | ? { $_.id -match $PackageId } | % {
Write-Host $_.id;
uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
install-package -projectname $proj.name -id $_.id -version $_.version
}
}
}
然后使用单独的包名称(例如
Sync-References AutoMapper
或所有类似的软件包
Sync-References
积分去丹海伍德和他的博客。
可以在Package Manger Console窗口中运行以下脚本,该脚本将在重新安装之前从解决方案中的每个项目中删除所有软件包。
foreach ($project in Get-Project -All) {
$packages = Get-Package -ProjectName $project.ProjectName
foreach ($package in $packages) {
Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
}
foreach ($package in $packages) {
Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
}
}
这将再次运行每个软件包的安装脚本,这将还原丢失的程序集引用。不幸的是,安装脚本可以执行的所有其他操作(例如创建文件和修改配置)也会再次发生。您可能需要从一个干净的工作副本开始,并使用SCM工具选择并选择项目中要保留的更改以及要忽略的更改。
以防万一,它对某人有帮助-在我的场景中,我有一些共享库(其中有自己的TFS项目/解决方案)全部组合成一个解决方案。
Nuget将成功还原项目,但DLL将丢失。
潜在的问题是,尽管您的解决方案具有自己的packages文件夹并将其正确还原到该文件夹,但是项目文件(例如.csproj)正在引用可能没有下载软件包的其他项目。在文本编辑器中打开文件,以查看引用的来源。
在不同的互连共享解决方案上管理程序包时可能会发生这种情况-因为您可能要确保所有DLL都处于同一级别,因此可以将其设置为顶级。这意味着有时它会为参考的DLL寻找完全不同的解决方案,因此,如果您没有下载所有项目/解决方案并保持最新状态,则可能会遇到上述问题。
我必须同意@Juri的观点,即jmfenoll广受欢迎的答案还不完整。在破引用的情况下,我认为大部分你做对的时候不希望更新到最新的包,但只固定在你的推荐人当前,你碰巧使用的版本。而Juri提供了一个方便的功能Sync-References
来做到这一点。
但是,我们可以走得更远,可以灵活地按项目和打包进行过滤:
function Sync-References([string]$PackageId, [string]$ProjectName) {
get-project -all |
Where-Object { $_.name -match $ProjectName } |
ForEach-Object {
$proj = $_ ;
Write-Output ('Project: ' + $proj.name)
Get-Package -project $proj.name |
Where-Object { $_.id -match $PackageId } |
ForEach-Object {
Write-Output ('Package: ' + $_.id)
uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
install-package -projectname $proj.name -id $_.id -version $_.version
}
}
}
我饱受此问题的困扰,在我的情况下,检查了是否下载了缺少的NuGet(但未还原它们),并且由于我修改了一些已安装的软件包,因此无法卸载并重新安装...所以:
我只是清除了缓存并进行了重建,并且它起作用了。(工具-选项-Nuget程序包管理器-常规)
这个链接也有助于 https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore。
取消所有包装并移除依赖
$packages = Get-Package -ProjectName [nameOfProjectToRestore]
foreach ($package in $packages) {
uninstall-package -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
}
清除项目根目录中的packages文件夹
将modify package.config复制到网站的根文件夹
运行此代码以还原项目
$packages = Get-Package -ProjectName [nameOfProjectToRestore]
foreach ($package in $packages) {
uninstall-package -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
}
foreach ($package in $packages) {
install-package $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
}