MSBuild 中的嵌套目标批处理?
Nested target batching in MSBuild?
我想对每个 DeploymentTarget 执行一个操作,其中每个 ProjectsForDeployment 可以有超过 1 个。我知道如果每个 ProjectsForDeployment 只有 1 个 DeploymentTarget child,则目标批处理会起作用 - 但如果有多个 children 会怎样?是否仍然可以 运行 ProcessDeployableObject 针对 A1/A2/B1/B2 4 次,同时保持对兄弟姐妹和 parent 的引用?
谢谢!
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Deploy" >
<CallTarget Targets="ProcessDeployableProject" />
</Target>
<Target Name="ProcessDeployableProject" Inputs="@(ProjectsForDeployment)" Outputs="%(ProjectsForDeployment.Identity)\dummy.txt" >
<!-- Processing goes here for %(ProjectsForDeployment.DeploymentTarget), needs OtherMetadataWeNeed and ProjectsForDeployment.Identity too. -->
</Target>
<ItemGroup>
<ProjectsForDeployment Include="/src/A/A.csproj" >
<DeploymentTarget>A1</DeploymentTarget>
<DeploymentTarget>A2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/B/B.csproj" >
<DeploymentTarget>B1</DeploymentTarget>
<DeploymentTarget>B2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
</ItemGroup>
</Project>
要运行四次,你应该写四项而不是两项。
在您这边,DeploymentTarget A2
将被 A1
覆盖,因为它们在同一项目下。
要解决它,您必须将它们分开,这更像是一次一个 CSProj 运行 DeploymentTarget。当您使用 msbuild 命令行构建项目时,每个命令都应该适用于一个配置和平台。
使用这个:
<ItemGroup>
<ProjectsForDeployment Include="/src/A/A.csproj" >
<DeploymentTarget>A1</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/A/A.csproj" >
<DeploymentTarget>A2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/B/B.csproj" >
<DeploymentTarget>B1</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/B/B.csproj" >
<DeploymentTarget>B2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
</ItemGroup>
我想对每个 DeploymentTarget 执行一个操作,其中每个 ProjectsForDeployment 可以有超过 1 个。我知道如果每个 ProjectsForDeployment 只有 1 个 DeploymentTarget child,则目标批处理会起作用 - 但如果有多个 children 会怎样?是否仍然可以 运行 ProcessDeployableObject 针对 A1/A2/B1/B2 4 次,同时保持对兄弟姐妹和 parent 的引用?
谢谢!
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Deploy" >
<CallTarget Targets="ProcessDeployableProject" />
</Target>
<Target Name="ProcessDeployableProject" Inputs="@(ProjectsForDeployment)" Outputs="%(ProjectsForDeployment.Identity)\dummy.txt" >
<!-- Processing goes here for %(ProjectsForDeployment.DeploymentTarget), needs OtherMetadataWeNeed and ProjectsForDeployment.Identity too. -->
</Target>
<ItemGroup>
<ProjectsForDeployment Include="/src/A/A.csproj" >
<DeploymentTarget>A1</DeploymentTarget>
<DeploymentTarget>A2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/B/B.csproj" >
<DeploymentTarget>B1</DeploymentTarget>
<DeploymentTarget>B2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
</ItemGroup>
</Project>
要运行四次,你应该写四项而不是两项。
在您这边,DeploymentTarget A2
将被 A1
覆盖,因为它们在同一项目下。
要解决它,您必须将它们分开,这更像是一次一个 CSProj 运行 DeploymentTarget。当您使用 msbuild 命令行构建项目时,每个命令都应该适用于一个配置和平台。
使用这个:
<ItemGroup>
<ProjectsForDeployment Include="/src/A/A.csproj" >
<DeploymentTarget>A1</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/A/A.csproj" >
<DeploymentTarget>A2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/B/B.csproj" >
<DeploymentTarget>B1</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
<ProjectsForDeployment Include="/src/B/B.csproj" >
<DeploymentTarget>B2</DeploymentTarget>
<OtherMetadataWeNeed>Metadata</OtherMetadataWeNeed>
</ProjectsForDeployment>
</ItemGroup>