从解决方案中删除NuGet包还原

151

我向使用“启用NuGet软件包还原”功能的解决方案中添加了最新的NuGet软件包还原功能:http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

然而,它破坏了我的构建服务器并且我没有时间去修复它,所以我想把它删除。据我所知,没有这样的选项,因此我手动从所有的*.csproj文件中删除了以下行:

<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

现在的问题是每次我的*.csproj文件被检出或打开我的解决方案时,该行会自动再次添加,如果我不小心将其签入,就会破坏我的构建 :(

是否有任何想法如何永久删除它?

更新:尽管下面的答案,但每次打开解决方案时它仍然会重新出现,有没有遇到相同问题的人?


2
你不能只是在源代码控制中回滚更改集吗? - Betty
这是一个相当大的变更集,但感谢您的评论,我已经查看了它,似乎还在解决方案路径中添加了一个 .nuget 文件夹,我也将其删除以查看是否可以解决问题。 - Wiebe Tijsma
你成功修复了构建服务器吗?(它是TeamCity吗?)因为你引用的导入项目行是导致我的TeamCity构建失败的原因。 - Baldy
@Baldy 不,我们正在使用 TFS Build,我并没有真正寻找解决方案,只是将其删除了(仍计划以后深入研究)。 - Wiebe Tijsma
3
我已经为NuGet团队创建了一个问题,以解决这个问题。请到 https://nuget.codeplex.com/workitem/3756 上投赞成票。 - deadlydog
这个IFix工具帮助我识别和纠正了文件中需要更新的众多位置。 - carmbrester
15个回答

214

我没有仔细查看,项目文件中添加了另一个属性:

<RestorePackages>true</RestorePackages>

只需手动从所有*.csproj文件中删除此行以及所有这些行:

  <Import Project="$(SolutionDir)\.nuget\nuget.targets" />

更新:

事实证明这是一个顽固的小错误,如果你在手动编辑项目文件,请确保关闭解决方案并一次性删除项目中的所有行,否则一旦项目重新加载,它们就会再次添加...

更新2:

也要从解决方案根目录中删除 .nuget 文件夹。

更新3:

NuGet 的较新版本会添加另一个需要删除的部分:

 <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>

更新4

在位于.nuget文件夹中的NuGet.Targets文件内,有另一个部分会被添加到新项目中……将它改为false(假)。

<!-- We need to ensure packages are restored prior to assembly resolve -->
<BuildDependsOn Condition="$(RestorePackages) == 'false'">
    RestorePackages;
    $(BuildDependsOn);
</BuildDependsOn>

7
我发现在 .csproj 文件末尾还有一个 <Import Project="$(SolutionDir)\.nuget\nuget.targets" />,需要手动删除。 - TimDog
6
哈!慢慢后退 :) - TimDog
5
这件事也一直困扰着我。如果你的项目分布在许多不同的解决方案中,包还原功能会引发大量问题。 - Damian
7
“确保关闭解决方案”在这里实际上非常重要,因为VS2010似乎会缓存csproj/msbuild文件(而忽略某些修改)。我没有注意到这种行为在VS2012中,但当我在VisualStudio内部修改这些文件时,这给我带来了很多困扰。 - Xavier Decoster
4
我已经为NuGet团队创建了一个问题以解决这个问题。请转到https://nuget.codeplex.com/workitem/3756并投上赞成票。 - deadlydog
显示剩余9条评论

48

禁用Nuget包还原:

  1. 删除 .nuget 文件夹
  2. 从所有 .csproj 文件中删除特定行

需要删除的行:

<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<RestorePackages>true</RestorePackages>
注意:在重新加载解决方案之前,确保您一次性完成所有更改,否则它会再次添加它们。
这是基于以下文章: http://bartwullems.blogspot.no/2012/08/disable-nuget-package-restore.html 另外,您可能需要仔细检查此选项是否已禁用: http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

我已经为NuGet团队创建了一个问题来解决这个问题。请到https://nuget.codeplex.com/workitem/3756投票支持它。 - deadlydog
1
谢谢,对我来说只是禁用那个选项。 - Maarten Kieft
我曾经使用过IFix工具来成功地清理了许多项目的代码库。它基本上自动化了这些步骤。https://visualstudiogallery.msdn.microsoft.com/b8ba97b0-bb89-4c21-a1e2-53ef335fd9cb - angularsen
“.nuget”文件夹是隐藏的,您需要从目录中删除它,而不仅仅是项目。 - Erik Bergstedt

8

这个设置难道不是在这里吗?

选项... -> Nuget 包管理器 -> [取消勾选] 允许 Nuget 下载缺失的包

enter image description here

我正在使用 Visual Studio Professional + Resharper 8.2


我删除了packages文件夹并清除了包缓存以解决我的问题。谢谢! - Tresto
1
不,它不会在执行后更新.proj文件,所以问题会重新出现 - 但这里也做一下是好的 :-) - schmoopy
构建时输出窗口显示:正在还原 NuGet 包... 为了防止 NuGet 在构建期间还原包,请打开 Visual Studio 选项对话框,单击“包管理器”节点并取消选中“允许 NuGet 在构建期间下载缺少的包”。 这只是确认这应该是正确的方法。 - Moslem Ben Dhaou
1
这与Nuget包恢复无关。旧版本的VS有一个名为“启用Nuget包恢复”的项目上下文菜单项(https://i.imgur.com/16dtLpW.png),它会创建一个`.nuget /文件夹并修改您的.csproj以引用一个.targets文件。您应该将nuget.exe提交到您的VCS中(呕,解决nuget解决的问题!)等丑陋的事情。现在,msbuild / restore`存在以及VS的内置软件包还原。OP正在询问如何删除旧的、错误的操作方式,而不是如何禁用VS的正确内置软件包还原支持。 - binki

5
目前使用MSBuild集成的包恢复方案可以迁移到自动包恢复。据我所知,这应该有助于那些遇到CI构建问题的人。(如果我错了,请纠正我)。请参考NuGet网站上的文档:将MSBuild集成解决方案迁移到使用自动包恢复,网址为:http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore。其中有关于转换与不转换TFS的信息。David Ebbo在http://blog.davidebbo.com/2014/01/the-right-way-to-restore-nuget-packages.html上也发布了一些信息。

3

3

2
我遇到了同样的问题,最终采取以下步骤: 1)进入解决方案中每个项目的.csproj文件,在记事本中打开它,然后删除xml部分并保存。
2)然后我删除整个解决方案中的所有package.config文件。
3)然后我必须删除.nuget和包文件夹。
此时,我有了一个完全没有NuGet的解决方案。
4)然后我手动引用任何需要的DLL,并编译,这样解决方案就可以在不需要NuGet软件包的情况下运行。

2

我尝试了已经接受的解决方案,但在使用2012版本时无效。以下方法可以解决问题:

  1. 完全关闭VS
  2. <RestorePackages>true</RestorePackages>更新为<RestorePackages>false</RestorePackages>并删除<Import Project="$(SolutionDir)\.nuget\nuget.targets" />这一行代码
  3. 同时将nuget.exe重命名为nuget.exe.NotExe

2
对于仍需要清理使用旧式NuGet软件包还原的项目的任何人,可以使用此处提供的IFix工具自动化进程。
只需运行安装程序(IFix将被添加到路径中),然后运行以下内容:
IFix nugetrestore --fix

您可以先以检查模式运行它,以查看它将要清理的内容:

IFix nugetrestore --check

1

前往您的解决方案目录,在其中有[$(SolutionDir)\.nuget\nuget.targets] .nuget文件夹和nuget.targets文件,删除该文件夹,并从您的csproj中删除一次性处理的行。

问题不会再次困扰您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接