问题描述
我们有几个项目使用共享的公共库(内部的,而不是公共的)。(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包进行调试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!