[英]Make MSBuild target depend on target from a different project
我有一个设置,我有一个 API (ASP.NET) 项目和一个测试项目来测试 API。 我使用 NSwag 通过以下步骤在测试项目中自动生成 API 客户端:
这些步骤是通过 MSBuild 目标完成的:
<!-- API Project -->
<Project Sdk="Microsoft.NET.Sdk.Web">
<Target Name="GenerateApiDefinition" BeforeTargets="AfterBuild">
<!-- Use NSwag to generate an openapi.json output file based on the built DLL -->
</Target>
</Project>
<!-- API test project -->
<Project Sdk="Microsoft.NET.Sdk">
<ProjectReference Include="..\ApiProject\ApiProject.csproj" />
<Target Name="GenerateApiClient" BeforeTargets="BeforeBuild">
<!-- Consumes the openapi.json file generated by project A to generate/update a C# API client class -->
</Target>
</Project>
这在使用 Visual Studio 或 MSBuild 构建时有效,因为项目是按顺序构建的。 它将首先完全构建 API 项目,然后构建测试项目。
但是当我尝试使用dotnet build
干净的解决方案时它不起作用。 我将收到测试项目的错误,说明openapi.json
文件不存在。 这个错误只会在我第一次构建时发生——如果我再次使用dotnet build
,构建将起作用,因为该文件是在之前的构建中生成的。
似乎dotnet build
以某种方式并行构建项目,至少在某种程度上是这样。 我认为测试项目在编译 API 项目之前无法编译,因为它有项目引用,但也许预构建步骤是并行执行的?
我试图将BeforeTargets
属性更改为Compile
和其他值,但我遇到了丢失 API 定义文件的错误,或者解释未生成自动生成的ApiClient
类的错误,这表明我正在挂钩目标太早(在GenerateApiDefinition
目标完成之前)或太晚(在构建过程需要定义类之后)。
我真正想做的是使GenerateApiClient
目标依赖于另一个项目中的GenerateApiDefinition
目标。 不知道是否可以在项目之间建立目标依赖关系? 我还有其他方法可以解决这个问题吗?
没有办法让“API 测试”项目中的GenerateApiClient
目标依赖于“API”项目中的GenerateApiDefinition
目标。
MSBuild 将尝试并行构建项目。 如果将测试项目提供给dotnet build
命令,则测试项目中的项目引用将用于查找和构建 API 项目。 显然,测试项目中的编译步骤需要 API 项目是最新的。
我测试了对“API 测试”项目的以下更改,它似乎解决了这个问题:
<Target Name="GenerateApiClient" BeforeTargets="CoreCompile">
似乎 MSBuild 认为构建之前的目标(即BeforeTargets="BeforeBuild"
)可以并行运行。 将GenerateApiClient
目标更改为依赖CoreCompile
似乎会导致 MSBuild 将其视为必须等待 API 构建完成的目标( CoreCompile
目标本身必须这样做)。
我创建了您描述的项目设置的模型,并复制了您的问题。 然后我将依赖项更改为CoreCompile
。 更改后GenerateApiClient
目标永远不会过早运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.