【发布时间】:2017-08-28 09:12:24
【问题描述】:
过去,我为我的 C++ 项目做了很多 MSBuild 定制。 MSBuild 目标的 Input 和 Output 属性用于确定是否必须执行目标。此外,Visual Studio 使用 .tlog 文件(位于中间目录中)来确定是否必须调用 MSBuild。
现在我正在处理一个 C# 项目。我写了一个简单的 MSBuild 目标,它将文件复制到输出目录:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyMyFile" BeforeTargets="AfterBuild" Inputs="$(ProjectDir)File.dat" Outputs="$(TargetDir)FileRenamed.dat">
<Copy SourceFiles="$(ProjectDir)File.dat" DestinationFiles="$(TargetDir)FileRenamed.dat" OverwriteReadOnlyFiles="true">
</Copy>
</Target>
</Project>
如果通过 MSBuild.exe 调用构建,目标将按预期工作。如果目标文件不存在或源文件已被修改,则复制该文件。
如果我在 Visual Studio 中调用构建,它不会按预期工作。如果我从输出目录中删除文件,Visual Studio 不会调用 MSBuild。另一方面,每次我在修改源文件后构建项目时都会调用 MSBuild,即使没有进行其他更改。
Visual Studio 似乎只是将项目中的每个文件与输出文件(.exe、.dll 或 .pdb)进行比较。如果项目中的任何文件比输出文件新,则调用 MSBuild。就我而言,MSBuild 不会更新 .exe 文件,因此会一次又一次地调用 MSBuild。
在 C++ 项目中,此行为由 .tlog 文件控制。在 C# 项目中是否有类似的东西?
非常感谢!
【问题讨论】:
-
MSBuild 不直接使用 .tlog 文件,而是由 Visual Studio 决定是否必须调用 MSBuild。我曾经为我的自定义构建目标创建自己的 .tlog 文件,以控制 Visual Studio 何时必须调用 MSBuild,何时不需要。我希望 C# 项目也有类似的技术。
-
你确定吗?即使不使用 VS 构建 C++ 项目,而只是创建 msbuild tlog 文件(并且可能在下一次构建时再次读取)
-
你是对的。对不起,错误的评论。但希望 Visual Studio 使用 .tlog 文件来决定是否必须调用 MSBuild 的假设仍然正确。但无论如何,这并不重要。我需要一种方法来告诉 Visual Studio 何时调用 MSBuild,何时不调用,因为 Visual Studio 对我的自定义构建目标一无所知。
-
我现在没有时间想出答案,但我相当确定 VS 仅使用时间戳来比较文件。因此,您必须以某种方式指示它“查看”您的文件。要弄清楚如何做到这一点,您将不得不看看如何实现内容,例如:如果您只是将一个文本文件添加到项目中,它会添加到 Content ItemGroup 中,如果您将其 CopyToOutputDirectory 元数据设置为 PreserveNewest它会在 VS 中自动获取您所追求的行为,因此可能有一种方法可以模仿自定义目标。
标签: c# visual-studio msbuild