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

时间:2009-05-19 12:37:44

标签: msbuild build-process

首先,我有一个基本的假设,即观看Visual Studio使用其默认的。* proj文件进行编译,如果你连续两次构建相同的解决方案,它会检测到没有任何变化,并且似乎通过解决方案构建。这是否意味着它知道项目中没有任何更改,并且不必创建新的DLL输出?

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

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

2 个答案:

答案 0 :(得分:1)

找到了一些东西:http://msdn.microsoft.com/en-us/library/ms171483.aspx

  

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

     

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

......那很有效。但后来让我思考,如果有人在没有程序集的情况下从源代码控制中删除代码(我们是怎么做的)会怎么样?由于它没有可比较的输出,因此无论如何都会进行编译并增加版本。我认为复杂性可能会导致我放弃这种方法。

答案 1 :(得分:1)

如果您在开发人员框中增加并不重要 - 重要的是您的每日/ CI构建仅在需要时递增。所以,我过去所做的是有一些小的XML文件包含下一个构建号,并且有一个MSBuild任务获取这个xml文件并创建一个名为Version.cs的文件(包含你通常在AssemblyInfo.cs中)。

Version.cs永远不会被检入你的源控件 - 它是由构建生成的。

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

这个主题有不同的变化,但总体思路有效。