【问题标题】:How to execute msbuild (csproj) targets based on input files being out of date如何根据输入文件过时执行 msbuild (csproj) 目标
【发布时间】:2021-11-14 21:44:11
【问题描述】:

我需要在我的 csproj 文件中添加一个目标,该文件指定输入文件和输出文件。 通过this 链接,我尝试像这样定义我的目标:

<ItemGroup>
    <ins Include="A.txt" />
    <outs Include="B.txt" />
</ItemGroup>

<Target Name="ExecuteTarget" Inputs="@(ins)" Outputs="@(outs)">
    <Exec Command="echo hello world" />
</Target>

这里的目的是当且仅当文件 A.txt 比 B.txt 更新或 B.txt 不存在时,每次在 VS IDE 中构建 csproj 时,在 Visual Studio 输出窗口中回显 hello world。 A.txt 和 B.txt 都与 csproj 文件存在于同一目录中。

但是,这似乎不起作用,因为当我构建这个 csproj 时,我无法在输出窗口中打印字符串“hello world”。我正在使用 VS 16.11.5 以及启用 .NET 5.0 的 csproj (WinUI)。

任何帮助/想法/建议将不胜感激。

【问题讨论】:

  • 有几件事要检查: - Crank up the output verbosity IDE 中的 MSBuild。 - 然后检查输出窗口是否实际调用了您的目标(或者甚至考虑:MSBuild 将写入一条消息,如输入/输出已过期等)。从命令行运行项目文件,不提供 ins 或 outs 打印消息,这是预期的行为(在没有所有 ins/outs 的情况下)。

标签: c# visual-studio msbuild csproj


【解决方案1】:

必须在某个地方调用目标,只有输入和输出是不够的。有几种方法可以做到这一点:使用CallTarget 显式调用它,或者使其成为另一个目标的依赖项(因此另一个被调用的目标具有Dependencies="ExecuteTarget"),或者使用AfterTargets,等等。

例如&lt;Target Name="ExecuteTarget" Inputs="@(ins)" Outputs="@(outs)" AfterTargets="CoreCompile"&gt; 应该这样做,如果 B.txt 存在并且比 A.txt 更新,则将跳过目标。不过,我建议为目标使用更有意义的名称。

【讨论】:

  • 成功了!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
相关资源
最近更新 更多