如何使用本地构建的Nuget包进行调试?

How can you debug with locally built nuget packages?(如何使用本地构建的Nuget包进行调试?)
本文介绍了如何使用本地构建的Nuget包进行调试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有几个项目使用共享的公共库(内部的,而不是公共的)。(C#.Net项目,使用Visual Studio,安装作为解决方案)

Solution A ---| 
              |----> Common Library (Nuget Package)
Solution B ---|

这通常工作得很好。公用库发布到内部Nuget提要,然后这两个项目都可以在本地运行和在生成服务器上使用该提要。

问题在于我们何时要更改公用库。测试更改的唯一方法似乎是重新构建公用库,将更新后的包发布到提要,升级项目A中的包(由于解决方案中有很多项目,这需要一段时间),然后进行测试。此周期需要很长时间。

理想情况下,我寻找的是一种能够将公共库项目包括在与项目A(或B)相同的解决方案中的方法,并对库进行更改,然后将所有代码作为一个解决方案运行和调试。但这样做需要很长时间。它需要遍历项目A中的所有csproj文件,并将所有引用更改为项目引用,而不是包引用。我尝试在csproj文件中使用条件,以便在使用本地项目和使用Nuget包进行构建之间轻松切换,但似乎没有效果。Visual Studio似乎只是对引用感到困惑,生成失败。

有没有其他选择?我觉得这应该是一种相当常见的情况,那么有没有一种公认的典型方法来设置它,以便既可以将Nuget包用于公共库,又能够将它们连接在一起并轻松进行调试。


作为对@vernou的响应,这是我们尝试在csproj文件中使用条件属性进行设置的内容。我们设置了一个配置类型来控制使用哪个引用。

  <ItemGroup Condition=" '$(Configuration)' == 'DebugWithLocalCommon' ">
    <ProjectReference Include="$(CommonPath)Common.Project.NameCommon.Project.Name.csproj">
      <Project>{11111111-1111-1111-1111-111111111111}</Project>
      <Name>Common.Project.Name</Name>
    </ProjectReference>
    ...
    Multiple project references continue here
    ...
  </ItemGroup>

  <ItemGroup Condition=" '$(Configuration)' != 'DebugWithLocalCommon' ">
    <Reference Include="Common.Project.Name, Version=4.0.26.0, Culture=neutral, PublicKeyToken=1111111111111111, processorArchitecture=MSIL">
      <HintPath>..packagesCommon.Project.Name.4.0.26lib
etstandard2.0Common.Project.Name.dll</HintPath>
    </Reference>
    ...
    Multiple package references continue here
    ...
  </ItemGroup>
我们实际上有一些项目使用经典的csproj引用格式(如上所述),还有一些项目使用较新的"Package Reference"格式来引用Nuget包。在这种情况下,第二个挡路会更像这样:

  <ItemGroup Condition=" '$(Configuration)' != 'DebugWithLocalCommon' ">
    <PackageReference Include="Common.Project.Name">
      <Version>4.0.26</Version>
    </PackageReference>
    ...
    Multiple package references continue here
    ...
  </ItemGroup>

我们遇到的问题是它似乎让Visual Studio感到困惑。有时UI中应该出现多个引用(这可能只是令人讨厌,而不是完全破坏了交易),但有时它似乎也无法完全理解引用,并且拒绝构建或识别正在引用的包,而只是给出一个引用&q;类型错误。

我们也尝试在csproj中使用<Choose><When><Otherwise>执行相同的操作,但结果行为完全相同。

推荐答案

如果使用GIT,可能git-submodule。

我也有类似的情况。我开发了Entity Framework Core的自定义提供程序,为了帮助开发,我使用EF Core代码源代码进行调试。

csproj如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  ...

  <ItemGroup Condition=" '$(Configuration)'!='Debug' ">
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="[3.1,4)" />
  </ItemGroup>

  <ItemGroup Condition=" '$(Configuration)'=='Debug' ">
    <ProjectReference Include="..efcoresrcEFCore.RelationalEFCore.Relational.csproj" PrivateAssets="contentfiles;build" />
  </ItemGroup>

</Project>

当我在Debug中启动项目时,我还可以调试EF Core代码源,但是当我在Release中启动时,使用的是NuGet包,我无法访问EF Core代码源。

GIT奖金:

我们使用git来版本化我们的代码源。如果我的同事获得代码源代码并尝试调试,则会失败,因为缺少EF Core。

然后我将EF Core作为子模块添加到我们的git存储库中:

git submodule add https://github.com/dotnet/efcore.git
# Load a specific version
cd efcore
git checkout v3.1.18
cd ../
git commit -m "Add the submodule efcore"

现在,当我的同事克隆我们的提供程序存储库时,EF核心代码源代码会自动加载(您从Visual Studio克隆时只需检查大小写‘加载子模块’)。

这篇关于如何使用本地构建的Nuget包进行调试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)