将 MSBuild 任务中动态生成的文件添加到输出和 appx 文件夹
Add dynamically generated file in MSBuild task to output and appx folders
我已经创建了一个构建任务,可以为它所使用的项目动态生成一个文件。
我设法将该文件复制到 $(TargetDir) 中,但没有复制到 AppX 文件夹中。我需要它的原因是,这个构建任务是关于单元测试的,测试中需要这个文件。
听起来有点混乱所以我试着澄清一下:
我在该任务中生成代码并将其编译成一个程序集,我将其添加为对主程序集的引用(在本例中为 test.dll)。所以发生的事情是我在 "AfterCompile" 目标之后执行此操作,并且我的程序集生成到 obj\Debug 文件夹中。
这是我的目标:
<UsingTask TaskName="MyBuildTask" AssemblyFile="MyBuildTask.dll"/>
<Target
AfterTargets="AfterCompile"
Name="MyBuildTarget">
<MyBuildTask
SolutionRoot="$(SolutionDir)"
GeneratedAssemblyPath="$(IntermediateOutputPath)$(TargetName).Generated.dll"
TestProjectPath="$(ProjectPath)"
TestAssemblyPath="@(IntermediateAssembly)"
>
<Output TaskParameter="GeneratedFile" ItemName="GeneratedFile"/>
</MyBuildTask>
<ItemGroup>
<Content Include="@(GeneratedFile)">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<DeploymentContent>true</DeploymentContent>
</Content>
</ItemGroup>
</Target>
一个我也不想要的是,这个文件现在被复制到 \bin\Debug\obj\Debug.
我显然可以静态指定它,这样它总是被复制到输出路径根目录,然后复制到 AppX 文件夹,如果我无能为力,我只想把它作为我最后的解决方案。
那么如何将我的文件放入此 GetCopyToOutputDirectoryItems
,我认为这是用于输出目录和 AppX 包的项目列表?
您是否尝试过从 GeneratedAssemblyPath 中删除 $(IntermediateOutputPath),我相信这就是产生 \bin\Debug\obj\Debug 的原因。它将该文件路径复制到 OutputDirectory(通常类似于 \bin\Debug.
经过连续 8 小时对该主题的进一步研究并大量阅读 Microsoft.Common.targets 和 Microsoft.AppxPackage.targets 的所有目标文件后,我实际上发现了我的问题的解决方案:
<ItemGroup>
<AppxPackagePayload Include="@(GeneratedAssemblyFullPath)" Condition="@(AppxPackagePayload) != '' Or @(AppxPackagePayload) != '*Undefined*'">
<TargetPath>@(GeneratedFile)</TargetPath>
</AppxPackagePayload>
</ItemGroup>
这会将文件添加到 AppxPackagePayload,因此它将被复制到 Appx 包。
PS: 因为我自己对此有点困惑。 @(GeneratedFile)
和 @(GeneratedAssemblyFullPath)
是我自己的构建任务的输出,类型为 "string",顾名思义。 @(GeneratedFile)
只是文件名,所以会放到根目录下。
我已经创建了一个构建任务,可以为它所使用的项目动态生成一个文件。 我设法将该文件复制到 $(TargetDir) 中,但没有复制到 AppX 文件夹中。我需要它的原因是,这个构建任务是关于单元测试的,测试中需要这个文件。
听起来有点混乱所以我试着澄清一下:
我在该任务中生成代码并将其编译成一个程序集,我将其添加为对主程序集的引用(在本例中为 test.dll)。所以发生的事情是我在 "AfterCompile" 目标之后执行此操作,并且我的程序集生成到 obj\Debug 文件夹中。 这是我的目标:
<UsingTask TaskName="MyBuildTask" AssemblyFile="MyBuildTask.dll"/>
<Target
AfterTargets="AfterCompile"
Name="MyBuildTarget">
<MyBuildTask
SolutionRoot="$(SolutionDir)"
GeneratedAssemblyPath="$(IntermediateOutputPath)$(TargetName).Generated.dll"
TestProjectPath="$(ProjectPath)"
TestAssemblyPath="@(IntermediateAssembly)"
>
<Output TaskParameter="GeneratedFile" ItemName="GeneratedFile"/>
</MyBuildTask>
<ItemGroup>
<Content Include="@(GeneratedFile)">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<DeploymentContent>true</DeploymentContent>
</Content>
</ItemGroup>
</Target>
一个我也不想要的是,这个文件现在被复制到 \bin\Debug\obj\Debug.
我显然可以静态指定它,这样它总是被复制到输出路径根目录,然后复制到 AppX 文件夹,如果我无能为力,我只想把它作为我最后的解决方案。
那么如何将我的文件放入此 GetCopyToOutputDirectoryItems
,我认为这是用于输出目录和 AppX 包的项目列表?
您是否尝试过从 GeneratedAssemblyPath 中删除 $(IntermediateOutputPath),我相信这就是产生 \bin\Debug\obj\Debug 的原因。它将该文件路径复制到 OutputDirectory(通常类似于 \bin\Debug.
经过连续 8 小时对该主题的进一步研究并大量阅读 Microsoft.Common.targets 和 Microsoft.AppxPackage.targets 的所有目标文件后,我实际上发现了我的问题的解决方案:
<ItemGroup>
<AppxPackagePayload Include="@(GeneratedAssemblyFullPath)" Condition="@(AppxPackagePayload) != '' Or @(AppxPackagePayload) != '*Undefined*'">
<TargetPath>@(GeneratedFile)</TargetPath>
</AppxPackagePayload>
</ItemGroup>
这会将文件添加到 AppxPackagePayload,因此它将被复制到 Appx 包。
PS: 因为我自己对此有点困惑。 @(GeneratedFile)
和 @(GeneratedAssemblyFullPath)
是我自己的构建任务的输出,类型为 "string",顾名思义。 @(GeneratedFile)
只是文件名,所以会放到根目录下。