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