我有一个大型的VStudio解决方案,它的.csproj文件正在移植到新的.NET SDK格式。我已经将github项目与AppVeyor集成在一起。当我处理解决方案时,我的项目是由VStudio构建的;AppVeyor使用msbuild来构建我的项目。
解决方案中的所有类库项目文件都已被修改,以便它们指定<TargetFrameworks>netStandard2.0</TargetFrameworks>。为了简单起见,让我们用classlib.csproj表示类库项目文件。
该解决方案还包含一些命令行工具,这些工具需要在其他项目之前构建,因为后面的项目需要在构建自己之前将命令行工具作为预处理器运行。这些命令行项目都指定了<TargetFrameworks>net472;netcoreapp2.0</TargetFrameworks>。让我们用tool.csproj表示工具项目文件。
为了正确构建,需要在tool.csproj之前构建classlib.csproj。在解决方案中,我在Build dependencies > Project dependencies解决方案资源管理器中使用了VStudio命令来指示这一点。当我在VStudio内部工作时,这很好。
但是,当我将更改推到github时,AppVeyor启动了一个msbuild流程来构建项目。从错误的涌出来看,很明显tool.csproj没有及时构建。msbuild似乎不理解.sln文件中的项目依赖信息。
阅读了在内部管道上发布的内容(例如https://devblogs.microsoft.com/visualstudio/incorrect-solution-build-ordering-when-using-msbuild-exe/),我试图将以下内容添加到classlib.csproj中
<ProjectReference Include="..\tool\tool.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>但是当我这样做的时候,我得到了一个错误:
Project '..\tool\tool.csproj' targets 'net472;netcoreapp2.0'. It cannot be referenced by a project that targets '.NETStandard,Version=v2.0'这显然是有道理的。
我读过的其他一些解决方案建议编辑.sln文件,以便首先构建tool.csproj,并希望在classlib.csproj开始构建之前完成构建。但是,这是一种竞争条件,因为msbuild不知道依赖关系。
那么,我如何表示classlib.csproj依赖于tool.csproj,以便msbuild能够理解它呢?
编辑
结果发现,这个问题是由我为启动工具而编写的目标与MSBuild使用类似于**\*.cs的模式解决<Compile>项集合所做的全局操作之间的交互造成的。工具在全局操作之后生成文件。由于在发生全局时生成的文件不存在,所以<Compile>项集合中缺少它,并且构建失败。我错误地将“未找到的foo.cs”错误解释为执行工具失败,而实际上,这是一个时间问题。
发布于 2019-03-14 04:58:23
为了使构建顺序在outside之外工作,我们需要使用
add reference而不是BuildDependencies=>ProjectDependencies。
右键单击classlib项目并选择add=>reference,在project中选择您想要的工具项目如下:

单击“确定”添加并保存更改。在此之后,打开classlib.csproj,您可以找到如下句子:
<ItemGroup>
<ProjectReference Include="..\xxx\Tools.csproj">
<Project>{6eaa430f-9793-4639-a84b-6ab767d57147}</Project>
<Name>Tools.csproj</Name>
</ProjectReference>
</ItemGroup>这是msbuild所能理解的。我想这就是你想要的。
在此之后,您可以使用单个msbuild工具或Appveyor来检查构建顺序。
在应用程序中,我们还可以禁用paralell (settings=>build=>msbuild选项),以确保在tools.csproj构建结束之前它不会构建classlib.csproj。附录中的最终构建顺序将是我们在VS中定义的。希望能帮上忙。
https://stackoverflow.com/questions/55140277
复制相似问题