问题描述
我当前的设置
它包含一堆子项目:
-
Utils
带有实用程序代码,例如IEnumerable
扩展、一些数据结构等。 -
Core
与游戏的基本库。包含基本的游戏逻辑代码。 -
Meta
用于主项目 (Core
) 和任何 mod 的代码分析和生成。 -
Shared
包含一些可用于Core
和Meta
的内容。 -
TestContent
是一个测试模组。 -
Tests
对Core
代码和来自TestContent
的代码进行测试。我正在使用nunit-3
进行测试。 -
mine
作为快速运行和调试某些测试的游乐场。
项目之间的引用是通过 ProjectReference
文件中的 .csproj
实现的。
我的 Utils
、Core
、Shared
、TestContent
和 mine
子项目不引用任何外部项目,只是相互引用(并且没有循环依赖) .所有这些都将 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(我猜?),无论是 Core
、Framework
、Standart
等等。 (尽管我已经阅读了大量相关文档,但我仍然对这些感到困惑)。
基础文件夹没有解决方案文件。我个人不明白解决方案背后的含义。如果有知识渊博的人向我解释,我将不胜感激。
我想要达到的目标
我希望从外部项目定义构建系统的详细信息,但使用默认后备。因此,如果我将此代码作为 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>
这个解决方案有几个问题:
- 显然,所有子项目如果引用另一个子项目,即使在同一个项目中,似乎都在重新编译这些项目。例如。
Tests
引用Core
和Utils
,Core
也引用Utils
。构建Tests
时,它构建Core
,后者构建Utils
,但随后Tests
第二次构建Utils
。这很烦人。 - 所有二进制文件最终都在那个文件夹中被破坏,这也很烦人。我希望它们存储在单独的文件夹中,例如根据项目名称,在该构建文件夹中,但我找不到在
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 Test
、Debug Test
和其他按钮。
然而,如果你点击它,它总是在集成终端中运行,这真的很慢,很烦人,而且颜色代码不正确。我已经搜索了几个小时,但一直无法找到解决方案。 (我使用 ConEmu
作为我的控制台,我比 janky 集成终端更喜欢它。
如果您尝试调试测试,则会弹出错误 Error processing 'configurationDone' request. Only 64-bit processes can be debugged.
。我试图找到什么确切的命令以及以什么方式 VS Code
实际上尝试调试这些测试,但找不到任何关于此的信息。这就是为什么我有另一个用于调试和快速测试的项目的原因:我无法调试测试。这也太烦人了。
你能帮我什么
我想从更有经验的开发人员那里获得有关如何以最灵活但同时又最不麻烦和烦人的方式设置此类项目的建议。部分破坏现有设置是可以的。
最重要的是这个嵌套项目完全独立于父项目,但同时可以从外部进行定制。另外,请记住,此项目必须作为 git 子模块复制到外部项目中。
我会欣赏真实项目的例子,也许是深入解释这一点的博客文章,我需要学习设置它的任何技巧或概念,任何东西。我对这一切完全陌生,不知道从哪里开始。出现的问题让我不知所措,不知如何解决。
我希望获得有关 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 线程,我讨厌它。构建系统太复杂了。我读过例如this、this 我就是不明白。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)