MSBuild是否知道是否需要重新编译项目?

MSBuild是否知道是否需要重新编译项目?,msbuild,build-process,Msbuild,Build Process,首先,我有一个基本假设,从VisualStudio使用其默认值编译内容。*proj文件可以看出,如果您连续两次构建同一个解决方案,它会检测到没有任何更改,并且似乎会在解决方案构建过程中快速运行。这是否意味着它知道项目中没有任何更改,并且不必进行新的DLL输出 如果是这样的话,我有个问题。假设我有一个包含多个类库的解决方案,每个项目中都有一个MSBuild任务,该任务通过修改AssemblyInfo.cs自动增加生成的版本。问题是(如果我之前的假设是正确的),它每次都这样做,并触发每个类库的新重建

首先,我有一个基本假设,从VisualStudio使用其默认值编译内容。*proj文件可以看出,如果您连续两次构建同一个解决方案,它会检测到没有任何更改,并且似乎会在解决方案构建过程中快速运行。这是否意味着它知道项目中没有任何更改,并且不必进行新的DLL输出

如果是这样的话,我有个问题。假设我有一个包含多个类库的解决方案,每个项目中都有一个MSBuild任务,该任务通过修改AssemblyInfo.cs自动增加生成的版本。问题是(如果我之前的假设是正确的),它每次都这样做,并触发每个类库的新重建。MSBuild中是否有一个目标或属性可以判断项目是否需要重新编译,如果需要,则跳过版本控制步骤

我这样问是因为我更新了解决方案中的项目A,而不是项目B。如果我在解决方案上运行构建,我希望它更新项目a上的版本,但由于项目B没有更改,我想不去管它。

找到了一些东西:

MSBuild可以比较 时间戳为的输入文件 输出文件并确定 跳过、生成或部分重新生成 目标。在以下示例中,如果 @(CSFile)项中的任何文件 集合比hello.exe更新 文件,MSBuild将运行目标; 否则将跳过:

<Csc
    Sources="@(CSFile)" 
    OutputAssembly="hello.exe"/> </Target>



…这起作用了。但后来我想,如果有人在没有程序集的情况下从源代码管理中提取代码(我们就是这样做的),该怎么办?因为它没有可比较的输出,所以它将执行编译并增加版本。我认为这种复杂性可能会导致我放弃这种方法。

如果在开发人员框上增加,这其实并不重要,重要的是每天的/CI构建只在需要时增加。因此,我过去所做的是让一些小XML文件包含下一个生成号,并让一个MSBuild任务获取此XML文件并创建一个名为Version.cs的文件(包含通常在AssemblyInfo.cs中找到的版本控制属性)

永远不会将Version.cs签入您的资源控件-它是由生成生成的

开发人员将同步当前XML文件,生成二进制文件,并获取当前版本号。持续集成构建也可以做同样的事情。但是每日/正式构建将签出XML文件,增加版本信息,然后签入。从那一刻起,版本号已正式更改

这个主题有很多变化,但总的想法是可行的