如何正确设置复杂的 dotnet 项目 我当前的设置我想要达到的目标建立在一个目录中?非 dotnet 脚本为什么不通过 IDE 运行测试?你能帮我什么当前设置的实际代码更新

问题描述

我当前的设置

我有一个游戏(库)项目正在开发中,它已经有很多功能

它包含一堆子项目:

  • Utils 带有实用程序代码,例如 IEnumerable 扩展、一些数据结构等。
  • Core 与游戏的基本库。包含基本的游戏逻辑代码
  • Meta 用于主项目 (Core) 和任何 mod 的代码分析和生成
  • Shared 包含一些可用于 CoreMeta内容
  • TestContent一个测试模组。
  • TestsCore 代码和来自 TestContent代码进行测试。我正在使用 nunit-3 进行测试。
  • mine 作为快速运行和调试某些测试的游乐场。

项目之间的引用是通过 ProjectReference 文件中的 .csproj 实现的。

我的 UtilsCoreSharedTestContentmine 子项目不引用任何外部项目,只是相互引用(并且没有循环依赖) .所有这些都将 AssemblyName 文件中的 .csproj 属性设置为它们的名称。例如,这里是 Hopper.Core.csproj 文件(其他类似):

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

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFrameworks>net4.8;netcoreapp3.1</TargetFrameworks>
    <AssemblyName>Hopper.Core</AssemblyName>
    <Name>Core</Name>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Utils\Hopper.Utils.csproj" />
    <ProjectReference Include="..\Shared\Hopper.Shared.csproj" />
  </ItemGroup>

</Project>

这里的一个问题是我并不真正关心它导出的版本。我只使用 C# 7.X 中的功能,所以没有认接口实现,没有可为空类型,也没有其他一些东西。基本上任何 dotnet 运行时都支持 C# 7.X(我猜?),无论是 CoreFrameworkStandart 等等。 (尽管我已经阅读了大量相关文档,但我仍然对这些感到困惑)。

基础文件没有解决方文件。我个人不明白解决方案背后的含义。如果有知识渊博的人向我解释,我将不胜感激。

我想要达到的目标

我希望从外部项目定义构建系统的详细信息,但使用认后备。因此,如果我将此代码作为 git submodule 导入另一个项目,比如 Godot 项目,我会让我的构建系统在 Godot 的构建系统上运行,而所有子项目都继续工作:我想成为能够通过 Meta 生成代码,我希望能够运行我的测试,我希望甚至能够仅对包含的代码运行一些测试代码,同时作为主项目的子项目戈多。

另外,我想以某种方式向外部项目明确说明 Tests 用于测试,不应该在游戏的构建中,Meta一个工具,不应该在游戏构建也是如此。也许,这些甚至应该建立在单独的文件夹中,以避免混淆。

我希望外部项目(例如 DotNet Framework 4.8)的运行时版本传播到子项目。我还希望此版本与 Meta 工具的版本不同,后者应使用 Roslyn 工作所需的运行时构建。理想情况下,第二个“工具版本”应该可以由外部项目选择,但也应该有一个认值。

我希望我的项目构建单独的 dll,所以我们不会将所有代码编译成单个 dll。

我想避免将其拆分为更多的 github 项目。我希望 Core 项目同时拥有代码生成工具和测试代码

建立在一个目录中?

我只知道如何强制 msbuild输出写入单个文件夹。因此,我在项目的根目录中有一个 build 文件夹,所有子项目的 dll 都存放在该文件夹中。我已经能够通过这样的 Directory.Build.props 实现这一点:

<Project>
 <PropertyGroup>
    <BaSEOutputPath>..\build\bin</BaSEOutputPath>
 </PropertyGroup>
</Project>

这个解决方案有几个问题:

  1. 显然,所有子项目如果引用另一个子项目,即使在同一个项目中,似乎都在重新编译这些项目。例如。 Tests 引用 CoreUtilsCore 也引用 Utils。构建 Tests 时,它构建 Core,后者构建 Utils,但随后 Tests 第二次构建 Utils。这很烦人。
  2. 所有二进制文件最终都在那个文件夹中被破坏,这也很烦人。我希望它们存储在单独的文件夹中,例如根据项目名称,在该构建文件夹中,但我找不到在 Directory.Build.props获取对项目的引用的方法。我必须在 .props 中设置这个路径,因为如果我在相应的 .csproj 文件中设置它,其中的名称是已知的,Nuget 然后无论如何都会通过写入认路径来弄乱它(即是,嵌套到项目 bin)。

我一直无法弄清楚如何将在嵌套 obj 文件夹中生成的程序集信息写入其他地方。无论我在 msbuild 中尝试过哪种设置/属性,最终都没有奏效。

非 dotnet 脚本

我有几个帮助程序 bat 脚本。一个Meta 子项目和 Core 子项目上启动代码生成TestContent,在它们的项目文件夹下为两者生成代码。另一个运行所有测试或选择的测试。我想将这些转换为可以在 IDE 中或通过 dotnet whatever 命令运行的任务,或者让他们根据项目是否作为子模块包含来决定具体做什么。

例如,我的 test.bat 从字面上看是这样的:

@echo off
cd .Tests
call dotnet build
cd ..

if %1==all (
    nunit3-console build\bin\Debug\net4.8\Hopper.Tests.dll
) else (
    nunit3-console build\bin\Debug\net4.8\Hopper.Tests.dll --test=Hopper.Tests.%1
)

所以它实际上构建了 Tests 项目,然后继续并按路径运行编译后的 dll。如果 dll 最终位于不同的文件夹中,这显然不好。

为什么不通过 IDE 运行测试?

哦,我无法通过 VS Code 运行测试。我已经挣扎了2天,然后放弃了它。所以,基本上,如果你为测试编写代码,VS Code 会自动接受它。它会在您的测试上方显示 Run TestDebug Test 和其他按钮。

Run Tests,Debug Tests

然而,如果你点击它,它总是在集成终端中运行,这真的很慢,很烦人,而且颜色代码不正确。我已经搜索了几个小时,但一直无法找到解决方案。 (我使用 ConEmu 作为我的控制台,我比 janky 集成终端更喜欢它。

如果您尝试调试测试,则会弹出错误 Error processing 'configurationDone' request. Only 64-bit processes can be debugged.。我试图找到什么确切的命令以及以什么方式 VS Code 实际上尝试调试这些测试,但找不到任何关于此的信息。这就是为什么我有一个用于调试和快速测试的项目的原因:我无法调试测试。这也太烦人了。

你能帮我什么

我想从更有经验的开发人员那里获得有关如何以最灵活但同时又最不麻烦和烦人的方式设置此类项目的建议。部分破坏现有设置是可以的。

最重要的是这个嵌套项目完全独立于父项目,但同时可以从外部进行定制。另外,请记住,此项目必须作为 g​​it 子模块复制到外部项目中。

我会欣赏真实项目的例子,也许是深入​​解释这一点的博客文章,我需要学习设置它的任何技巧或概念,任何东西。我对这一切完全陌生,不知道从哪里开始。出现的问题让我不知所措,不知如何解决

我希望获得有关 Godot 构建系统的有用信息以及使用 dotnet 的任何复杂 Godot 项目的示例,或者同样是关于如何正确设置它或如何对其进行自定义的任何文章

理想情况下,我希望避免阅读 1000 页的随机文档,以期获得一些有用的想法。我想最好在几天内解决这个问题。

当前设置的实际代码

Godot 代码目前已损坏:第一个的嵌套 repo 没有以任何方式使用(它只是作为子模块包含在内),第二个,基本上还没有游戏。 See the state of the godot outer project as of the day of writing

Here is the state of the library project as of the day of writing。它是上述存储库,带有代码生成器和 Core 代码

更新

我在 msbuild 上阅读了大量文章和 github 线程,我讨厌它。构建系统太复杂了。我读过例如thisthis 我就是不明白。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)