【问题标题】:Output items from msbuild custom targetmsbuild 自定义目标的输出项
【发布时间】:2018-10-16 21:31:06
【问题描述】:

花了一整天的时间研究 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>

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

【问题讨论】:

  • 对于有效的项目组:如果将它放在目标中,它是否有效?另外,使用 BeforeTargets="BeforeBuild;PrepareForPublish"
  • 如果我在我的目标中声明相同的 ItemGroup。即使未执行目标(由于输入和输出),文件也会复制到输出目录。但我静态声明它(如问题),因为我不能在“包含”中使用@Item。我也按照您的建议更改为“BeforeBuild;PrepareForPublish”。
  • 哦,我错过了项目组不在您的 &lt;Target&gt; 中。在任务创建@(BinFiles) 之后,它需要在其中运行。在运行任何目标之前评估静态内容。

标签: msbuild .net-core


【解决方案1】:

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

我最终得到了以下结果:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多