是否可以引用解决方案中存在的项目,并在.NET Core中没有时使用NuGet包引用作为后备?

6
我有一个 .NET Standard 项目,其中实现了一个用于 ASP.NET Core CMS 框架的模块。目前,它使用来自 NuGet 包的 CMS 框架库。如果我从 GitHub 获取 CMS 框架的源代码并将我的模块添加到其解决方案中,并将包引用替换为实际项目引用,则它将正常工作。
我的目标是使其在不更新 csproj 文件中的引用的情况下工作,因此,如果将项目添加到完整的源代码解决方案中,则使用项目引用,否则使用 NuGet 包引用。
所以假设 .NET Standard 项目称为 'ModuleA'。它对 'ModuleB' 有一个包引用:
<ItemGroup>
  <PackageReference Include="ModuleB" Version="1.0.0" />
</ItemGroup>

当我想在一个可以访问ModuleB的解决方案中使用ModuleA时,我会使用项目引用:

<ItemGroup>
  <ProjectReference Include="..\..\ModuleB\ModuleB.csproj" />
</ItemGroup>

我希望能够以某种方式在.csproj文件中同时包含它们,并在构建时使用正确的引用(例如,基于某些条件,如项目是否存在?)。
如果将两者都添加到csproj中,则构建将失败(例如,“无法找到项目...ModuleB.csproj。请检查项目引用是否有效并且项目文件是否存在。”)。

我认为你做不到这件事。但是,我也想不出你为什么想要/需要这样做?你能得到什么优势?在什么情况下会出现项目在没有你作为开发人员的先前知识的情况下不存在的情况?手动或通过NuGet添加项目引用并不是一项非常困难的任务,而且这也应该是一个相当不频繁的任务。我试图想象一个你想要不断在它们之间切换的场景,但我无法想象。 - ADyson
其中一个原因是在编码时项目引用已经存在,但是当构建流程运行时,它能够解析引用并拉取包。 - PlantationGator
2个回答

8
你可能可以动态地实现这个,但我认为这样做的工作原理并不是很透明。
我建议添加一个配置,例如在我的示例中添加“本地调试”,并在csproj中使用条件。
示例:
创建配置:

enter image description here

enter image description here

在您的csproj文件中,您可以这样做:

<ItemGroup>
  <ProjectReference Condition="'$(Configuration)' == 'Local-Debug'" Include="otherProject.csproj" />
  <PackageReference Condition="'$(Configuration)' != 'Local-Debug'" Include="otherProjectPackage" Version="2.4.1" />
</ItemGroup>

1
虽然这是最好的解决方案,但仍需要手动介入 - 这正是OP想要消除的。 - Fabio

1

您的依赖必须在构建时静态地被知晓并解决。有一个很好的基于配置的构建时解决方案,请参阅@Julian的答案。

作为运行时解决方案:您可以在运行时动态加载引用。这样,您就可以在应用程序的工作目录中搜索所需的DLL,如果在那里找不到它,那么可以下载它(从Nuget或其他地方),要么作为您可以直接加载的二进制文件,要么作为您可以构建的源代码库;然后动态加载该库。

以下是如何在运行时动态加载程序集的方法:https://learn.microsoft.com/en-us/dotnet/api/system.reflection.assembly.loadfrom?view=netframework-4.8

还有这个问题:Loading library dynamically

针对动态加载的程序集进行编码有其自身的怪癖;您将需要为引用库提供清晰的接口定义,否则,您将发现自己处理大量的reflectiondynamic


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接