Visual Studio 调试与发布版本:本地和 nuget 资源

Visual Studio Debug vs Release builds: Local and nuget resources

我最近在 github 上为我开发的各种 C# 库和项目创建了多个 public 存储库。今天我 运行 讨论了一个问题,涉及此类项目如何使用我编写的其他库。我想出了一个初步的解决方案,但希望得到有关最佳实践、其他方法等方面的反馈。

作为解释,假设我在两个不同的解决方案中有两个项目。一个是我编写的通用库,另一个是使用该库执行某些操作的可执行文件。通常我使用以下磁盘结构来包含它:

C:\Programming
+ -> GPLibrary
     + -> GPLibrary
          + -> GPLibrary.csproj
          + -> ...other files
+ -> ConsumingApp
     + -> ConsumingApp
          +-> ConsumingApp.csproj
          + -> ...other files

ConsumingApp 解决方案中,我创建了一个名为 'externals' 的解决方案文件夹,其中包含对 GPLibrary.

的引用

我这样做是因为我经常发现我需要调整 GPLibrary 来扩展它的功能,而且我不想经历发布大量小更新到 nuget 或本地存储库的麻烦。我使用源代码控制将 GPLibrary 放到开发 b运行ch 上以累积这些小的更改,当它们足够多时,我将开发 b运行ch 合并回主b运行ch 和 create/publish 更新了 nuget 包。

这很好用...只要您按照我的方式设置您的解决方案和项目。如果您还没有,并且您克隆了我的 public 存储库之一,您将无法构建它,除非并且直到您复制我的磁盘结构和解决方案文件夹方法。这对其他开发人员来说不方便。

我想出的解决方案是修改我的 csproj 文件,以便在使用调试配置时在本地拉取我的库,在使用发布配置时从 nuget 拉取我的库。一个例子:

<Choose>
    <When Condition=" '$(Configuration)'=='Debug' ">
        <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
            <ProjectReference Include="..\..\EFCoreUtilities\EFCoreUtilities\EFCoreUtilities.csproj" />
            <ProjectReference Include="..\..\J4JLogging\AutoFacJ4JLogging\AutofacJ4JLogging.csproj" />
            <ProjectReference Include="..\..\J4JLogging\ConsoleChannel\ConsoleChannel.csproj" />
            <ProjectReference Include="..\..\J4JLogging\FileChannel\FileChannel.csproj" />
            <ProjectReference Include="..\..\J4JLogging\J4JLogging\J4JLogging.csproj" />
        </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='Release'">
        <ItemGroup>
            <PackageReference Include="J4JSoftware.EFCore.Utilities" Version="0.5.0" />
            <PackageReference Include="J4JSoftware.Logging" Version="2.5.1" />
            <PackageReference Include="J4JSoftware.Logging.Console" Version="2.5.1" />
            <PackageReference Include="J4JSoftware.Logging.File" Version="2.5.1" />
            <PackageReference Include="J4JSoftware.Logging.Autofac" Version="2.5.1" />
        </ItemGroup>
    </When>
</Choose>

其他开发人员仍然需要复制我的方法来构建 ConsumingApp 的调试版本,但他们应该能够很好地构建发布版本。

有没有 better/simpler 方法来做到这一点?我是否应该创建自己的专用配置(“DebugJ4J”),以便“正常”调试和发布配置都可以利用 nuget,但我仍然可以在本地使用我的方法?

顺便说一句,我尝试简单地使用多个 ItemGroup 部分,每个部分都有一个 Condition 子句,但这似乎不起作用。不知道为什么。但是 Choose 方法可以。

Is there a better/simpler way to do this? Should I perhaps create my own special-purpose configuration ("DebugJ4J") so that both the "normal" debug and release configurations can take advantage of nuget but I can still use my approach locally?

其实,你的想法是更好的选择。创建您自己的新配置 DebugJ4J 以便您可以执行任何其他操作或使用您自己的本地文件在本地计算机上的路径。

所以当其他社区成员使用你的示例时,他们也可以使用DebugRelease配置无

创建名为 DebugJ4J

的新配置

构建-->配置管理器-->新建项目配置-->

然后添加这些:

When Condition=" '$(Configuration)'=='DebugJ4J'">
       <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
            <ProjectReference Include="..\..\EFCoreUtilities\EFCoreUtilities\EFCoreUtilities.csproj" />
            <ProjectReference Include="..\..\J4JLogging\AutoFacJ4JLogging\AutofacJ4JLogging.csproj" />
            <ProjectReference Include="..\..\J4JLogging\ConsoleChannel\ConsoleChannel.csproj" />
            <ProjectReference Include="..\..\J4JLogging\FileChannel\FileChannel.csproj" />
            <ProjectReference Include="..\..\J4JLogging\J4JLogging\J4JLogging.csproj" />
        </ItemGroup>
//add any local project reference of your own here.
............................
.............................
    </When>
<When Condition=" '$(Configuration)'=='Release'">
        <ItemGroup>
            <PackageReference Include="J4JSoftware.EFCore.Utilities" Version="0.5.0" />
            <PackageReference Include="J4JSoftware.Logging" Version="2.5.1" />
            <PackageReference Include="J4JSoftware.Logging.Console" Version="2.5.1" />
            <PackageReference Include="J4JSoftware.Logging.File" Version="2.5.1" />
            <PackageReference Include="J4JSoftware.Logging.Autofac" Version="2.5.1" />
        </ItemGroup>
    </When>
.........

// Debug configuration

在这个函数中,您可以在 DebugRelease 配置中使用这些 nuget 包,然后将您的新函数添加到DebugJ4J 配置。

注意 您应该在项目组上添加条件,然后在该项目组中包含所有 xml 节点。像这样:

<ItemGroup Condition="xxxxx">

..................

// all files under this condition

</ItemGroup>