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

Már*_*tha 3 c# csproj .net-core asp.net-core

我有一个 .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>
Run Code Online (Sandbox Code Playgroud)

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

<ItemGroup>
  <ProjectReference Include="..\..\ModuleB\ModuleB.csproj" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

我想以某种方式将它们都包含在 .csproj 文件中,并使其在构建时使用正确的引用(例如,基于某些条件,如项目存在?)。

如果两者都添加到 csproj 中,则构建将失败(例如“无法找到项目 ...ModuleB.csproj。检查项目引用是否有效并且该项目文件是否存在。”)。

Jul*_*ian 5

你可以动态地做到这一点,但我认为这并不是真正透明的工作方式。

我建议添加一个配置,例如在我的示例“本地调试”中,并在您的 csproj 中使用条件。

例子

创建配置:

在此处输入图片说明

在此处输入图片说明

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

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