**没关系,我错过了下面的答案,项目包括命令行模式**
这将是不容易或漂亮。但是,如果您真的想像您所要求的那样采用更“全面”的构建自动化和管理路线,那么下面的#4 是如何开始变得更好的。
1)在 OP 示例中,使用 MSBuild 作为脚本:在您的示例中,这更像是一种自动化,就像使用 shell 或批处理文件一样,而不是真正让您获得任何 MSBuild 项目技巧。请参阅关于 .sln 规则的#2,以及关于我认为您希望这样做更多的事情的#3,但这会起到其他作用。
2)关于“仅记忆” .sln 问题:从根本上说,我相信如果您希望 MSBuild 使用 .sln 来解决基于 .sln 的项目引用,那么它不能处于“零影响”或“仅内存”状态,并且必须被刷新或保存到磁盘。即使您拥有项目系统本身也是如此,因为 MSBuild 将查看文件本身以获取解析引用,并期望它在文件系统中,因为它在单独的进程中运行,并且有自己的想法。因此,如果您想使用 .sln 文件,则必须有实际的 .sln 文件。因此,对没有 .sln 文件的 .sln 方法的希望是正确的。如果您运行 VS 来运行 msbuild,它将生成这些,并且需要在 MSBuild 启动之前将它们刷新到磁盘,在那里它们将保持“零影响”状态直到构建......只是为了完全详细和清晰。
3)关于“import .proj”问题:我知道的一个类似的选项,<Import Project="my/proj/path/mine.csproj"/>
就像是文件的批量包含,它将这些文件视为外部项目的一部分并编译为那个大会。经常被 microsft 内部使用。以这种方式使用的导入忽略了导入的 .proj 文件中的大部分内容,并且基本上是在寻找要包含的文件,就像外部项目中包含的任何其他文件一样。所以我认为这不会让你走得更远,除非你打算在同一个程序集中构建所有这些。如果你这样做,你将不得不以这种意图来构建包含的 .proj 文件,并滥用/构建外部以包含一切所需的引用等等。
4)它的参考定义。关于引用有很多选项,它们是否被复制,将被假定放置在 GAC 中,或者“只是不做任何事情,相信我他们会在运行时出现在应用程序域搜索路径中”。您可以关闭大部分 cr*p,然后您唯一的依赖是构建和语言编译器能够解析其类型和 whatnbot 的引用程序集,以便编译您当时尝试编译的依赖程序集. 如果您考虑一下,您会发现很多其他参考资料不是您自己构建的,而是构建时会拾取并用于编译的。所以真正的问题可能是,“我如何让我的自动化构建处于我编译依赖项的状态,并且看起来像任何其他参考?”
由于您控制构建,因此您可以控制 dll 的放置,并且可以负责构建顺序。而且...您可以控制引用。
这是剩下的经典问题:在设计时,如果引用指向 .sln 项目,那么您无需构建即可从外部程序集中获得类型的设计时查找,如果您将项目更改为不可知论,那么您将拥有编译。您可以在许多方面做一些棘手的事情,包括条件性 .proj 文件,这会给开发人员带来负担,并且可能需要手动编辑以保持同步,或者通过脚本预先构建 .proj 文件过滤器以修复引用,或制作它们是非 sln 引用并强制开发人员构建依赖项以解析类型,他们必须确保他们使用的环境与构建保持一致。
所以问题归结为引用是如何定义的,是的,MSBuild 所需的任何内容都需要写入磁盘以供 MSBuild 运行,而与 VS 本身无关。你必须选择你的毒药,因为问题是你不能同时定义两种方式的引用。这是一个经典的构建管理问题,你并不孤单。