NuGet用于具有多个项目的解决方案

159
假设我有一个包含3个项目的解决方案:
  • 核心(Core)
  • 用户界面(UI)
  • 测试(Tests)
我使用的一些NuGet包将应用于这3个项目中的所有项目。某些包仅适用于UI和Tests,而某些包仅适用于Tests(例如NUnit)。
使用NuGet,应该选择哪种正确的方式来设置?
  1. 每次需要引用时,是否应在这三个项目上都使用 "Add Library Package Reference"?
  2. 第一次需要包时是否应使用 "Add Library Package Reference",然后对于随后的用法使用“添加引用” - >“浏览”?
在任一情况下,我应该拥有多少个packages.config文件?
6个回答

247

对于那些偶然发现这篇文章的人,现在有以下选项:

右键单击您的解决方案 > 管理解决方案的NuGet包...

... 或者:

工具 > 库程序包管理器 > 管理解决方案的 NuGet 包...

如果您进入已安装的包区域,您可以跨解决方案中的每个项目“管理”单个包。


5
如果我想为特定版本的解决方案安装包,但向导没有给我这个选项。在控制台中,我可以像这样运行 Install-Package RazorEngine -Version 3.3.0,但它只会应用于控制台下拉列表中选择的项目。 - MaciejLisCK
这在Visual Studio 2010中支持吗?我刚刚在这里提出了一个问题 - http://stackoverflow.com/questions/33163987/manage-nuget-package-for-solution-vs-2010-does-not-show-manage-button - user2645830
如果你有一个非常大的项目,你真的会相信一个包管理器来更新依赖关系吗? - Mick
你有没有想过为什么某些特定的包没有“管理”按钮?比如System.ServiceModel,我无法从解决方案视图中管理这个库。 - Hoàng Long
@Mick,请查看所提到的对话框上的“合并”选项卡...我会这样做的! - user3638471

79

使用控制台来操作多个项目

Tools > Library Package Manager > Package Manager Console

然后使用这个命令

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME
例如。
Get-Project Core,UI | Install-Package FluentDateTime

4
至少在当前的 NuGet 版本中,我仍然更喜欢使用这种方法而不是使用“管理解决方案的 NuGet 包”对话框,因为我们的解决方案非常大,我无法将项目名称列表粘贴到该对话框中。 - Yodan Tauber

21

这个甜蜜的交易对我起作用:

PM> Get-Project -all | where {$_.Name -match "Songhay.Silverlight" -and
    $_.Name -notmatch "ApplicationLoader" -and $_.Name -notmatch ".Xml"}
    | ForEach-Object {Install-Package MvvmLight -project $_.Name}

2
这就是如何操作!例如,如果您想要在解决方案中列出所有项目的json.net版本,请尝试以下命令:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json} - jonypony3
1
@EdwardMMeshuris非常熟练,但它无法获取软件包名称的精确匹配。这里是一个稍微更新的精确匹配命令:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } - Dark_Knight

12
如果你想在多个解决方案中安装一个包,我编写了一个方便的PowerShell脚本来完成,详见这里
你甚至可以过滤Get-Project -All命令并针对项目列表的子集进行目标定位。

8
您应该在解决方案中的每个项目上使用“添加库包引用”来处理所有外部库。 这样,您将为每个项目获得一个packages.config文件。 但是,您只需要下载一次包,并在本地重复使用它们以供您的其他项目使用。

4
注意:如果您不更新所有库包,您将会有3个不同版本的同一程序集。如果它们在GAC中或者使用不同的名称,.NET可以使用这3个不同版本。但是因为它们将拥有相同的名称,如果旧版本覆盖了新版本,您将无法正常构建。请确保更新所有库包以避免此问题。 - graffic

4
在“程序包管理器控制台”中,您可以输入以下命令:
Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter 
PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } | Install-Package 
PACKAGE_NAME -Version VERSION

您可以使用该命令进行安装或更新 (Update-Package)。

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