如何使MSBuild的正确跟踪跨越引用的项目外部工具生成的文件?(How to make MSBui

2019-10-29 17:54发布

我的MSBuild码取文件与特定生成操作( CompileFoo在该示例中),并且产生的输出文件(具有不同的扩展名)。 这是我到目前为止的代码:

<Target Name="BuildFoo" BeforeTargets="Compile"
    Inputs="@(CompileFoo)"
    Outputs="@(CompileFoo -> '$(OutputPath)%(RelativeDir)%(Filename).bin' )" >

    <!-- makefoo doesn't know how to create directories: -->
    <MakeDir Directories="$(OutputPath)%(CompileFoo.RelativeDir)"/>
    <Exec Command="makefoo -o &quot;$(OutputPath)%(CompileFoo.RelativeDir)%(CompileFoo.Filename).bin&quot; &quot;%(CompileFoo.Identity)&quot;" />

    <ItemGroup>
        <!-- Required so we can handle Clean: -->
        <FileWrites Include="@(CompileFoo -> '$(OutputPath)%(RelativeDir)%(Filename).bin' )"/>
    </ItemGroup>
</Target>

如果我包括在产生最后的EXE项目这个伟大的工程。

但现在我想让它在产生由EXE(C#与装配参考)引用的DLL的一个项目工作,我需要得到那些生成项目(该.bin从输出目录中的示例文件)该DLL,成EXE的输出目录。

我试图得到类似这样的效果,当DLL项目会发生什么事情:

<Content Include="Test\Test.txt"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></Content>

在这种情况下, Test\Test.txt文件中的EXE的输出文件夹结束。 虽然我不知道那是完全一样的事情。 (它与原始文件,或从DLL输出文件夹中拷贝一个?)

我试图得到相当兼容的东西 - 特别是将在VS2010和VS Mac上工作。

Answer 1:

这里的技巧是让GetCopyToOutputDirectoryItems目标回报额外AllItemsFullPathWithTargetPath项目:

<Target Name="IncludeFoo" BeforeTargets="GetCopyToOutputDirectoryItems">
  <ItemGroup>
    <CompiledFoos Include="@(CompileFoo -> '$(OutputPath)%(RelativeDir)%(Filename).bin' )">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(RelativeDir)%(FileName).bin</TargetPath>
    </CompiledFoos>
    <AllItemsFullPathWithTargetPath Include="@(CompiledFoos->'%(FullPath)')"  />
  </ItemGroup>
</Target>

(使用当前的MSBuild 15版本testet)(编辑版本与VS2010 -AR测试)



文章来源: How to make MSBuild correctly track files generated with an external tool across referenced projects?