Retargeting solution from .Net 4.0 to 4.5 - how to retarget the NuGet packages?
我已经将当前在VS2010中面向.NET 4.0的解决方案迁移到了VS2012,现在我想将其重新定位到.NET 4.5。
我不确定的是裸体套餐。例如,我在VS2010中从EF4更新的EF5实际上是EF4.4,如您所见:
1 2 3 4 5
| <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\EntityFramework.5.0.0\lib
et40\EntityFramework.dll</HintPath>
</Reference> |
我还可以在packages.config中看到项目的以下内容:
1 2 3 4
| <?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages> |
所以我的问题是:
将当前设置为.NET 4.0到.NET 4.5的所有nuget包重新定向的最佳实践是什么?
- stackoverflow.com/questions/6876732/&hellip;
nuget 2.1提供了一个使这变得简单得多的特性:只需从包管理器控制台执行update-package -reinstall -ignoreDependencies。
Nuget2.0不能很好地处理重新定位应用程序的问题。为了更改包的目标框架,必须卸载并重新安装包(注意已安装的包,以便可以重新安装每个包)。
必须卸载并重新安装程序包的原因是:
- 安装包时,我们将确定项目的目标框架
- 然后我们将其与包内容匹配,找到适当的lib文件夹(和content文件夹)
- 程序集引用添加时带有指向包的lib文件夹的提示路径,并带有右子文件夹(例如libet40)。
- 内容文件从packagescontentfolder中复制,并使用右子文件夹(例如contentet40)
- 我们在packages.config文件中记录用于安装包的targetframework
- 更改项目的目标框架后,提示路径仍然指向net40
- 卸载包时,我们检查packages.config中记录的target framework,以查看要从项目中删除的目标框架的libs/内容。
- 当您重新安装包时,我们会检测到您更新的目标框架并引用/复制正确的libs/内容。
- 在将vs 2012与ASP.NET MVC 4项目一起使用,并将.NET框架从4.0重新定位到4.5之后,我在包管理器控制台中执行了update-package -reinstall。所有软件包都开始卸载和更新,突然Windows8重新启动,当它返回时,它告诉"你的电脑遇到问题并重新启动。是否要向Microsoft发送信息?"(吓唬…顺便说一下,这是我现在安装的nuget版本:2.2.40116.9051在这里打开了一个问题:nuget.codeplex.com/workitem/3049
- 重新安装选项从未对我起过作用。它或者以错误的顺序删除,或者"由于y依赖于x而不能删除x"上的错误,或者有时只是不读取包。上次尝试时,它删除了EntityFramework,然后再也没有添加它。
- 顺便说一句,如果您想编译一个针对CLR2和CLR4的项目,这是非常糟糕的。您可以复制.csproj文件,但packages.config需要保留packages.config…
- 更新包-重新安装不是我的解决方案。它还更新了许多包,而不是将它们留在我们使用和测试过的版本上。例如,Ninject被移到了v3,这是一个突破性的版本更改。
- 甚至不要尝试更新页面-重新安装。当它在我的本地机器上运行时,它是如此混乱,以至于我不得不阻止Nuget Package Manager进一步发展。它删除了我的jquery 1.10版本,出于某种原因将其替换为1.4.4。只需手动操作,省去麻烦。
- 同意这件脏乱的事,从这篇文章到现在已经两年了。它发现了一些较低版本的裸体画,并搞砸了很多参考资料。这是经过近两个小时的更新(从2014年初开始在高端工作站上)。解决方案中的20个项目。
- 还要注意许可协议的变更。
- @与斯派克合作,我认为你错过了-忽略的悬而未决的标志。
对于那些对update-package -reinstall 命令有问题的人,考虑使用-ignoreDependencies标志运行它,如下所示:
1
| update-package -reinstall <packagename> -ignoreDependencies |
此标志将使您的包依赖项保持不变,否则,即使最初要重新安装的包仍然保持其版本不变,它们也可能会得到更新。
更多信息在这里。
- 谢谢,这真的省去了很多麻烦。在30多个项目中,看着Nuget试图重新安装EnterpriseLibrary倾向于创建的10个左右的依赖项,他们正朝着一个为期一天的工作迈进。这会将时间缩短到几分钟。
- 正如其他人提到的,很有可能打破一切。
- 在包管理器控制台下运行时,您只需稍微更改一下,就可以为整个解决方案实现自动化:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }。
- @以我的经验,卡莱佩德森指挥工程解决方案广泛?
- 实际上,它似乎适用于默认项目+任何依赖项目…
- @bj&246;rnalig&246;ransson-抱歉,如果我不够清楚。答案提供了一种在整个解决方案中更新单个包的方法。我的脚本将遍历解决方案中的每个nuget包,并在解决方案中重新定位它。答案对于单个项目来说是完美的,但是如果您有很多需要重新定位的包,我提供的脚本可能会更好。
在尝试接受的答案失败后,我想建议使用风险较小的命令:
1
| Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies |
更多信息:http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html
- 根据链接的文档,-reinstall只安装相同的版本,因此不认为使用-safe有任何好处。我错过什么了吗?
- 你是对的,我已经更新了答案。
在尝试在整个解决方案范围内重新安装软件包时,我遇到了依赖项错误(尽管使用了-ignoreDependencies标志),并且每个项目的所有packages.config文件都已被删除。在VS2013中,似乎packages.config不会被刷新回磁盘并重新添加,直到所有升级的依赖项/引用重新附加到项目。
在我的例子中,有效的方法是通过将-ProjectNameprojectname添加到update-package命令中,一次升级每个项目。在这种情况下,packages.config会随着每个项目的升级而更新。
对于非常大的解决方案来说可能不实用,但仍然尽可能多地利用自动升级的优势并隔离有问题的项目,而不在解决方案中删除每个packages.config,这似乎是一个合理的折衷。
- 我也遇到了同样的问题。UpdatePackage -Reinstall删除了一些项目的package.config和项目引用(特别是其中生成了假程序集的项目引用)。为了解决这个问题,我们撤销了对混乱项目的所有更改并运行:Update-Package -reinstall -ProjectName"PROJECTNAME" -IgnoreDependencies。