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


153

假设我有3个项目的解决方案:

  • 核心
  • 用户界面
  • 测验

我使用的某些NuGet软件包将应用于所有3个项目。有些仅适用于UI和测试,有些仅适用于测试(如NUnit)。

使用NuGet进行此设置的正确方法是什么?

  1. 每当需要参考时,是否应该在所有三个项目上都使用“添加库包参考”?
  2. 我是否应该在第一次需要包时使用“添加库包参考”,然后使用“添加参考->浏览”进行后续使用?

无论哪种情况,我应该有多少个packages.config文件?

Answers:


239

对于任何绊脚石的人,现在有以下选择:

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

... 要么:

工具>库软件包管理器>管理解决方案的NuGet软件包...

而且,如果您转到“已安装的软件包”区域,则可以在解决方案中的每个项目中“管理”单个软件包。


5
如果我想为特定版本的解决方案安装软件包怎么办。向导没有给我该选项。在控制台中,我可以像这样运行它,Install-Package RazorEngine -Version 3.3.0但它仅适用于在控制台下拉菜单中选择的项目。
MaciejLisCK 2014年

,是否支持Visual Studio 2010中我只问了一个问题在这里- stackoverflow.com/questions/33163987/...
user2645830

如果您有一个非常大的项目,您真的相信软件包管理器来更新依赖项吗?
米克

您对某个特定的软件包没有“管理”按钮时有任何想法吗?像System.ServiceModel一样,我无法从解决方案视图管理此库。
2015年

@Mick,在提到的对话框中检查“合并”选项卡...我会的!

76

使用控制台定位多个项目

Tools > Library Package Manager > Package Manager Console

然后使用此命令

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME

例如

Get-Project Core,UI | Install-Package FluentDateTime

4
+1:至少对于当前的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 2014年

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个不同的版本。但是因为它们将具有相同的名称。您将最终无法正常工作,因为旧版本是在新版本上复制的。
2011年

2

Package Manager控制台中,您可以编写以下命令

Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter 
PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } | Install-Package 
PACKAGE_NAME -Version VERSION

您也可以使用该命令进行安装或更新(更新包)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.