在 nuget / .NET Core 时代使用多个解决方案和文件引用

Working with multiple solutions and file references in the nuget / .NET Core era

背景

我正在开发一个包含数十个解决方案的大型应用程序,每个解决方案都包含多个项目。解决方案中项目之间的引用是使用项目引用完成的。其他解决方案中项目之间的引用使用对公共共享 "bin" 目录的文件引用。我们这样做:

  1. 以正确的顺序构建解决方案(我们有自己的自定义方法来确保这一点)
  2. 配置所有 class 库程序集的输出位置以构建到共享 "bin" 目录中
  3. 使用依赖于它们的项目的文件引用来引用这些 class 库程序集

一切都在一个大存储库中,并且 branched/versioned 在一起。

这对我们来说效果很好,让我们可以轻松地在解决方案之间引用代码。在依赖解决方案中进行代码更改、重建它,然后立即让依赖它的解决方案可以使用该更改也相对轻松。例如,许多应用程序使用的实用程序库。

problem/question

我们目前正在寻求添加新的 ASP.NET Core 1.0 RC1 project/solution(使用 .NET Framework 4.6.1,而不是 .NET Core)并且需要引用 ASP.NET核心项目的解决方案。

如果我们将来自 ASP.NET 核心项目的文件引用添加到共享 "bin" 目录中的程序集,它似乎可以工作,但实际情况是 .dll 被复制到 lib 目录中在 ASP.NET 核心项目解决方案目录的根目录中。因为这个文件是一个副本,并且没有 link 回到原来的位置,这意味着以后对程序集的任何更改都不会被拾取。除非引用被删除并重新添加。也许我做错了什么,但是这种 lib 和 wrap 目录方法不适用于我们的用例。

鉴于 nuget 似乎是添加引用的首选方式,我们也尝试了这种方法。我们有一个构建脚本,它为共享 "bin" 目录中的每个程序集创建一个 nuget 包,并将它们存储在存储库根目录的目录中,我现在可以将这些程序集作为 nuget 包引用,并且在rebuilding/repackaging 的一部分更改随后由相关项目获取。因为整个存储库是 "versioned" 在一起,所以不需要 assemblies/packages 的任何版本控制 - 一切都在 1.0.0 上。这在某种程度上违背了 nuget 的观点,但它在我们应用程序的体系结构中根深蒂固,因此不容易更改。

虽然 nuget 方法感觉有点笨拙,但它确实有效。但是,调试器不再 found/used pdb 文件,即使它们包含在 nuget 包中。这是生产力的一大损失。

Are we misunderstanding how the "lib and wrap" approach works?

"lib and wrap" 实际上并不完全成熟。我认为 RC2 有望让 .csprojxproj 项目协同工作。截至目前,您可以查看@EF project 是如何做到这一点的。

Is it possible to get file referenced nuget packages to be debuggable?

使用 ASP.NET Core 1.0,您可以通过 project.json 作为 dependencies 引用当前解决方案之外的项目。正如您所知,您可能缺少的是,通过这些引用,您可以从本地 文件系统 而不是 DNX[=47] 解析它们=].

在解决方案中使用 global.json,您可以添加项目目录,Visual Studio 将在尝试通过 [=40= 解决之前查找这些项目目录]NuGet/DNX.

例子

{
  "projects": [
    "src",
    "test",
    "../Some.Other.Project/src", // Will look here for projects
    "../../Some.External.Project/src" // Will look here for projects
  ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

srctest目录是标准模板放置源项目和测试项目的默认目录。

然后,如果您依赖于 global.json 中调用的任何一个项目,它会将这些项目拉入解决方案资源管理器并像 "virtual projects" 一样对待它们,但是您实际上仍然能够调试(并进入它们)并更改它们,并且它们作为源代码控制的一部分进行跟踪。

Is there an alternative approach that would be more like what we used to do?

我在上面描述了你应该做什么,采取global.json方法。

如果您想保持解决方案干净且彼此独立,推荐的方法是将依赖项添加为 NuGet 包。然而,当处理多个解决方案并频繁重建它们时,您将面临一个恼人的障碍:NuGet 包缓存。本质上,你需要做的是每次修改你的项目的版本号,以便不同解决方案中的依赖项目能够得到更新。为此,我编写了一个简单的 dotnet 工具,您可以使用它在每次构建时步进项目的修订号:

https://www.nuget.org/packages/dotnet-bump

非常有效,您只需更新引用项目中的 NuGet 包。自然地,在发布项目时,您会步进 major/minor/patch 数字并将修订设置回 0。