我的方案是,我有一组源控制的c#文件。我下载它,我在命令行中使用此命令构建解决方案文件。
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" MyProj.sln /property:Platform=x64
但是当我这样做时,会跳过CoreCompile说"跳过目标" CoreCompile"因为所有输出文件都是与输入文件相关的最新文件。"问题是,它生成一个dll,它不包含.cs文件中的许多更改。
当我在.cs文件中进行一些小改动(例如放置日志)时,它就构建得很好并且生成的dll包含所有更改。
但是,32位版本是在第一次没有跳过CoreCompile的情况下构建的。 (相同的命令,但/property:Platform=x86
)
我无法理解这种行为。请帮忙。感谢。
答案 0 :(得分:0)
MSBuild能够build incrementally。它通过检测每个目标之间的输入文件和缺少输出文件的更改来实现此目的。如果更新存储库并且未对.cs
文件进行更改,则应跳过CoreCompile
。您可以查找最近的roslyn版本here的输入和输出。
您可以使用/t:Rebuild
(与"/t:Clean;Build"
相同)强制进行干净的构建。
另请注意,更改通过/p:name=value
传入的参数通常不会影响构建。增量构建逻辑基于文件更改,而不是基于值。如果影响输出目录的参数发生更改,则认为输出丢失。如果只有一个参数更改会影响某些编译设置,它可能会触发增量构建的目标。这些设置通常在项目中设置,这会导致$(MSBuildAllProjects)
的更改,这通常是增量目标的输入。
E.g。在.NET Core there was a problem中设置/p:Version=1.2.3
或/p:VersionSuffix=beta1
时不会影响增量构建。