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

Pau*_*ell 149 .net nuget

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

  • 核心
  • UI
  • 测试

我使用的一些NuGet包将适用于所有3个项目.有些只适用于UI和测试,有些只适用于测试(如NUnit).

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

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

在任何一种情况下,我应该有多少个packages.config文件?

小智 235

对于任何绊倒这个的人,现在有以下选项:

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

... 要么:

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

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

  • 如果我想为特定版本的Solution安装包,该怎么办?向导不给我这个选项.在控制台中我可以像`Install-Package RazorEngine -Version 3.3.0`那样运行它,但它只适用于在控制台下拉列表中选择的项目. (5认同)

Sim*_*mon 75

您可以使用控制台来定位多个项目

Tools > Library Package Manager > Package Manager Console
Run Code Online (Sandbox Code Playgroud)

然后使用此命令

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME
Run Code Online (Sandbox Code Playgroud)

例如

Get-Project Core,UI | Install-Package FluentDateTime
Run Code Online (Sandbox Code Playgroud)

  • +1:至少在当前的NuGet版本中,我仍然比"管理NuGet包解决方案"对话框更喜欢这种方法,因为我们的解决方案非常庞大,我无法将项目名称列表粘贴到该对话框中. (4认同)

ras*_*asx 20

这个甜蜜的交易对我有用:

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

  • 这就是它的完成方式!例如,如果要列出解决方案中所有项目的json.net的所有版本,请尝试以下方法:`Get-Project -all | ForEach-Object {Get-Package -ProjectName $ _.Name -Filter Newtonsoft.Json}` (2认同)

Aar*_*ell 12

如果你想跨多个解决方案安装一个包,我写了一个方便的Powershell脚本来做这个,请看这里.

您甚至可以过滤Get-Project -All命令并定位项目列表的子集.


Nek*_*esh 8

您应该在解决方案中的每个项目上为所有外部库使用"添加库包参考".你最终会得到每个项目的packages.config.

但是,您只需下载一次该软件包,并在本地重用所有其他项目.

  • 注意:如果不更新所有库包,则最终将得到同一程序集的3个不同版本.如果它们位于GAC中或具有不同的名称,.NET可以使用3种不同的版本.但因为他们会有相同的名字.您将最终得到非工作版本,因为旧版本是在较新版本上复制的. (4认同)