gpt4 book ai didi

c# - MSBuild 将动态生成的文件复制为项目依赖项的一部分

转载 作者:IT王子 更新时间:2023-10-29 04:49:52 24 4
gpt4 key购买 nike

我有一个自定义的 msbuild 任务,它正在将一些输出文件生成到 ProjectA 的输出目录 ($(TargetDir))。当前代码是这样的:

<MyCustomTask ...>
<Output TaskParameter="OutputFiles" ItemName="FileWrites"/>
</MyCustomTask>

ProjectB 正在引用 ProjectA 但问题是在构建 ProjectB 时,MyCustomTask 生成的文件不会复制到 ProjectB 的输出目录。

我们如何获取动态生成的附加文件以作为项目依赖项的一部分与 MSBuild 一起复制?

最佳答案

我终于成功地从 Project B 中自动执行了复制,而无需对其进行修改。 IIya 离解决方案不远,但事实是我无法静态生成,因为使用 MyCustomTask 从 Project A 生成的文件列表是动态的。在深入了解 Microsoft.Common.targets 之后,我发现 ProjectB 将通过调用目标 GetCopyToOutputDirectoryItemsProject A 获取输出列表.此目标依赖于 AssignTargetPaths,后者本身依赖于目标列表属性 AssignTargetPathsDependsOn

因此,为了动态生成内容并通过标准项目依赖项自动复制此内容,我们需要在两个不同的地方 Hook 项目 A:

  • AssignTargetPathsDependsOn 中,因为它由 Project B 通过 GetCopyToOutputDirectoryItems 在 Project A 上间接调用。当 PrepareResource 被调用时,Project A 也会间接调用它。在这里,我们只是输出将由 Project A 生成或由 Project B 使用的文件列表。 AssignTargetPathsDependsOn 将调用一个自定义任务 MyCustomTaskList ,它只负责输出文件列表(但不生成它们),这个文件列表将使用 CopyOutputDirectory 创建动态“内容” >.
  • BuildDependsOn 中,以便实际生成 Project A 中的内容。这将调用将生成内容的 MyCustomTask

所有这些在 ProjectA 中都是这样设置的:

<!-- In Project A -->

<!-- Task to generate the files -->
<UsingTask TaskName="MyCustomTask" AssemblyFile="$(PathToMyCustomTaskAssembly)"/>

<!-- Task to output the list of generated of files - It doesn't generate the file -->
<UsingTask TaskName="MyCustomTaskList" AssemblyFile="$(PathToMyCustomTaskAssembly)"/>

<!-- 1st PART : When Project A is built, It will generate effectively the files -->
<PropertyGroup>
<BuildDependsOn>
MyCustomTaskTarget;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>

<Target Name="MyCustomTaskTarget">
<!-- Call MyCustomTask generate the files files that will be generated by MyCustomTask -->
<MyCustomTask
ProjectDirectory="$(ProjectDir)"
IntermediateDirectory="$(IntermediateOutputPath)"
Files="@(MyCustomFiles)"
RootNamespace="$(RootNamespace)"
>
</MyCustomTask>
</Target>

<!-- 2nd PART : When Project B is built, It will call GetCopyToOutputDirectoryItems on ProjectA so we need to generate this list when it is called -->
<!-- For this we need to override AssignTargetPathsDependsOn in order to generate the list of files -->
<!-- as GetCopyToOutputDirectoryItems ultimately depends on AssignTargetPathsDependsOn -->
<!-- Content need to be generated before AssignTargets, because AssignTargets will prepare all files to be copied later by GetCopyToOutputDirectoryItems -->
<!-- This part is also called from ProjectA when target 'PrepareResources' is called -->
<PropertyGroup>
<AssignTargetPathsDependsOn>
$(AssignTargetPathsDependsOn);
MyCustomTaskListTarget;
</AssignTargetPathsDependsOn>
</PropertyGroup>

<Target Name="MyCustomTaskListTarget">

<!-- Call MyCustomTaskList generating the list of files that will be generated by MyCustomTask -->
<MyCustomTaskList
ProjectDirectory="$(ProjectDir)"
IntermediateDirectory="$(IntermediateOutputPath)"
Files="@(MyCustomFiles)"
RootNamespace="$(RootNamespace)"
>
<Output TaskParameter="ContentFiles" ItemName="MyCustomContent"/>
</MyCustomTaskList>

<ItemGroup>
<!--Generate the lsit of content generated by MyCustomTask -->
<Content Include="@(MyCustomContent)" KeepMetadata="Link;CopyToOutputDirectory"/>
</ItemGroup>
</Target>

此方法适用于任何使用 Common.Targets 的 C# 项目(因此适用于纯桌面、WinRT XAML 应用程序或 Windows Phone 8 项目)。

关于c# - MSBuild 将动态生成的文件复制为项目依赖项的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com