首先,我有一个基本的假设,即观看Visual Studio使用其默认的。* proj文件进行编译,如果你连续两次构建相同的解决方案,它会检测到没有任何变化,并且似乎通过解决方案构建。这是否意味着它知道项目中没有任何更改,并且不必创建新的DLL输出?
如果是这样,我有一个问题。假设我有一个包含多个类库的解决方案,并且每个项目中都有一个MSBuild任务,它通过修改AssemblyInfo.cs自动增加构建版本。事情(如果我之前的假设是正确的)它每次都这样做并触发每个类库的新重建。 MSBuild中是否有目标或属性可以判断项目是否需要重新编译,如果是,则跳过我的版本控制步骤?
我问,因为我要说我更新项目A,但不是项目B在解决方案中。如果我在解决方案上运行构建,我希望它更新项目A上的版本,但由于项目B没有改变,我想不管它。
答案 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文件,增加版本信息,然后将其签入。从那一刻开始,版本号已正式更改。
这个主题有不同的变化,但总体思路有效。