从msbuild自定义目标输出项

从msbuild自定义目标输出项,msbuild,.net-core,Msbuild,.net Core,在花了一整天的时间研究MsBuild:project文件、项、属性、目标和任务之后,我仍然找不到解决问题的方法 我的目标是在my.csproj中创建一个自定义目标,使用控制台程序从输入文本文件生成二进制文件。目标做它应该做的事。但我希望生成的文件作为内容作为项目文件的一部分,与应用程序一起复制(发布) 我在以下项目文件中完成了以下操作: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFr

在花了一整天的时间研究MsBuild:project文件、项、属性、目标和任务之后,我仍然找不到解决问题的方法

我的目标是在my.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>

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

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

我的结论如下:

<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>

netstandard2.0
.\tools\mytool.exe
从未
总是
包括

对于有效的项目组:如果将其放入目标中,是否有效?。此外,如果在目标中声明相同的项目组,请使用BeforeTargets=“BeforeBuild;PrepareForPublish”。即使目标没有执行(由于输入和输出),文件也会复制到输出目录。但我静态地声明了它(如问题中所述),因为我不能在“Include”中使用@Item。此外,我还按照您的建议更改为“BeforeBuild;PrepareForPublish”。哦,我没有注意到项目组不在您的
中。它需要在任务创建
@(BinFiles)
后运行。静态内容在运行任何目标之前进行评估。
<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>