msbuild自定义目标的输出项目

时间:2018-10-16 21:31:07

标签: msbuild .net-core

一整天都在研究MsBuild:项目文件,项目,属性,目标和任务后,我仍然找不到解决问题的方法。

我的目标是在我的.csproj中创建一个自定义目标,以使用控制台程序从输入文本文件生成二进制文件。目标做了它应该做的。但是我希望将生成的文件作为应与应用程序一起复制(发布)的内容作为项目文件的一部分。

我结束了以下项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup>
    <MyTool>.\tools\mytool.exe</MyTool>
  </PropertyGroup>

  <Target Name="MyTarget" DependsOnTargets="Restore" BeforeTargets="Build;Publish"
      Inputs="@(TxtFiles)"
      Outputs="@(TxtFiles->'%(RootDir)%(Directory)%(Filename).bin')">
    <Exec Command="$(MyTool) -o %(TxtFiles.RootDir)%(TxtFiles.Directory)%(TxtFiles.Filename).bin %(TxtFiles.Identity)"
      Outputs="@(TxtFiles->'%(RootDir)%(Directory)%(Filename).bin')">
      <Output TaskParameter="Outputs" ItemName="BinFiles" />
    </Exec>
  </Target>
  <ItemGroup>
    <TxtFiles Include="my_resources\*.txt" />
    <Content Include="@(TxtFiles)">
       <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Content>
    <Content Include="@(BinFiles)">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <PublishState>Included</PublishState>
    </Content>
  </ItemGroup>
</Project>

很遗憾-它没有填充项目@(BinFiles)。 如果手动将其放缩(就像事先调用该工具一样),则它会起作用:

<ItemGroup>
  <Content Include="my_resources\*.bin">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <PublishState>Included</PublishState>
  </Content>
</ItemGroup>

我想实现相同的行为。另外,当我的目标声明输入和输出时,它将如何填充其输出作为内容添加?

1 个答案:

答案 0 :(得分:0)

最后,另一个问题在the answer中有线索。 使用它设法定义了按预期工作的最终项目文件。我知道我不需要目标输出,而是将它们添加到“内容”项。

我得出以下结论:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup>
    <MyTool>.\tools\mytool.exe</MyTool>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="my_resources\**\*.txt">
      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <Target Name="MyTarget" DependsOnTargets="Restore" BeforeTargets="BeforeBuild;PrepareForPublish">
    <ItemGroup>
      <TxtFiles Include="@(Content)" Condition="'%(Extension)' == '.txt'" />
    </ItemGroup>
    <Exec Command="$(MyTool) -o $([System.IO.Path]::ChangeExtension('%(TxtFiles.Fullpath)','.bin')) %(TxtFiles.Identity)"
       Outputs="$([System.IO.Path]::ChangeExtension('%(TxtFiles.Fullpath)','.bin'))">
      <Output TaskParameter="Outputs" ItemName="_BinFiles" />
    </Exec>

    <ItemGroup>
      <Content Include="@(_BinFiles)">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        <PublishState>Included</PublishState>
      </Content>
      <BinFiles Include="@(Content)" Condition="'%(Extension)' == '.bin'" />
    </ItemGroup>
  </Target>
</Project>