一整天都在研究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>
我想实现相同的行为。另外,当我的目标声明输入和输出时,它将如何填充其输出作为内容添加?
答案 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>