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

Visual studio 2015 在nuget/.NET Core时代使用多个解决方案和文件引用,visual-studio-2015,nuget,asp.net-core,visual-studio-debugging,.net-core,Visual Studio 2015,Nuget,Asp.net Core,Visual Studio Debugging,.net Core,背景 我正在开发一个由数十个解决方案组成的大型应用程序,每个解决方案都包含许多项目。解决方案中项目之间的引用是使用项目引用完成的。其他解决方案中项目之间的引用使用对公共共享“bin”目录的文件引用。我们通过以下方式做到这一点: 以正确的顺序构建解决方案(我们有自己的定制方式来确保这一点) 将所有类库程序集的输出位置配置为生成到共享的“bin”目录中 使用依赖这些类库程序集的项目中的文件引用来引用这些类库程序集 所有内容都在一个大型存储库中,并在一起进行分支/版本控制 这对我们来说非常有效,并允许

背景

我正在开发一个由数十个解决方案组成的大型应用程序,每个解决方案都包含许多项目。解决方案中项目之间的引用是使用项目引用完成的。其他解决方案中项目之间的引用使用对公共共享“bin”目录的文件引用。我们通过以下方式做到这一点:

  • 以正确的顺序构建解决方案(我们有自己的定制方式来确保这一点)
  • 将所有类库程序集的输出位置配置为生成到共享的“bin”目录中
  • 使用依赖这些类库程序集的项目中的文件引用来引用这些类库程序集
  • 所有内容都在一个大型存储库中,并在一起进行分支/版本控制

    这对我们来说非常有效,并允许我们在解决方案之间轻松地引用代码。在依赖的解决方案中进行代码更改、重建代码,然后立即将更改提供给依赖它的解决方案,这也是相对轻松的。例如,由许多应用程序使用的实用程序库

    问题/问题

    我们目前正在寻找添加一个新的ASP.NET Core 1.0 RC1项目/解决方案(使用.NET Framework 4.6.1,而不是.NET Core),并且需要引用ASP.NET Core项目解决方案之外的程序集

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

    鉴于nuget似乎是添加引用的首选方式,我们也尝试了这种方法。我们有一个构建脚本,它为共享“bin”目录中的每个程序集创建一个nuget包,并将它们存储在存储库根目录中,我现在可以将这些程序集引用为nuget包,在重新构建/重新打包一点之后,相关项目将获取更改。因为整个存储库都是“版本化”的,所以不需要对程序集/包进行任何版本化-所有内容都只在1.0.0上。这在某种程度上与nuget的观点背道而驰,但它在应用程序的体系结构中根深蒂固,不容易更改

    虽然nuget方法感觉有点尴尬,但它似乎确实起了作用。但是,调试器不再找到/使用pdb文件,即使它们包含在nuget包中。这是生产力的巨大损失

    • 我们是否误解了“自由包装”方法的工作原理?
    • 是否可以使文件引用的nuget包可调试?
    • 是否有更像我们过去所做的替代方法?
    我们是否误解了“自由包装”方法的工作原理

    “自由包装”实际上并不是完全成熟的。我认为,RC2有望让
    .csproj
    xproj
    项目协同工作。到现在为止,你可以看看“这是怎么做到的”

    是否可以使文件引用的nuget包可调试

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

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

    示例

    {
      "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"
      }
    }
    
    src
    test
    目录是标准模板放置源项目和测试项目的默认目录

    然后,如果您依赖于在
    global.json
    中调用的任何一个项目,它将把这些项目拉到解决方案资源管理器中,并像对待“虚拟项目”一样对待它们,但实际上您仍然能够调试(并逐步执行)和更改它们,并且它们作为源代码管理的一部分进行跟踪

    是否有一种更像我们过去所做的替代方法


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

    如果您希望保持解决方案干净且彼此独立,建议您将依赖项添加为NuGet包。但是,在处理多个解决方案并频繁重建它们时,您将面临一个恼人的障碍:NuGet包缓存。本质上,您需要的是在每次进行某些修改时逐步调整项目的版本号,以便不同解决方案中的依赖项目可以获得更新。为此,我编写了一个简单的dotnet工具,您可以使用它在每个版本上逐步确定项目的修订号:


    工作起来很有魅力,您只需更新引用项目中的NuGet包。当然,在发布项目时,您会逐步调整主/次/补丁号,并将修订设置回0。

    听起来您需要自己的nuget提要。它可以像网络共享一样简单。您应该知道ASP.NET核心类库(在Visual Studio中称为“类库(包)”)生成nuget包,而不仅仅是像旧版那样的普通dll。您基本上希望构建这些类库中的每一个,并将它们放在网络共享中