【问题标题】:Add dynamically generated file in MSBuild task to output and appx folders将 MSBuild 任务中动态生成的文件添加到 output 和 appx 文件夹
【发布时间】:2015-04-22 14:21:01
【问题描述】:

我创建了一个构建任务,它会为使用它的项目动态生成一个文件。 我已经设法将该文件复制到 $(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 包的项目列表?

【问题讨论】:

    标签: c# msbuild windows-store-apps


    【解决方案1】:

    在连续 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) 是我自己的构建任务的输出,类型为“字符串”,就像名字所暗示的那样。 @(GeneratedFile)只是文件名,所以会放到根目录下。

    【讨论】:

      【解决方案2】:

      您是否尝试过从 GeneratedAssemblyPath 中删除 $(IntermediateOutputPath),我相信这就是产生 \bin\Debug\obj\Debug 的原因。它将该文件路径复制到 OutputDirectory(通常类似于 \bin\Debug.

      【讨论】:

      • $(IntermediateOutputPath) 使得文件被创建到 obj\Debug 文件夹中,与原始文件相同。如果我删除它,该文件将创建到项目的根目录中(.csproj 文件所在的位置),因为这是此 MSBuild 实例的工作目录。
      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2020-02-22
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多