【发布时间】: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”。
-
哦,我错过了项目组不在您的
<Target>中。在任务创建@(BinFiles)之后,它需要在其中运行。在运行任何目标之前评估静态内容。