我认为你可以做到这一点,而无需在本地的MSBuild 4使用自定义的任务,但我还没有开始用,玩,所以无法评论。
但是,对于本机MSBuild 3.5,我不认为这是可能的 - 为了操纵日期,你需要分解成代码。你看,ModifiedDate元数据在内部是一个字符串 - 并且需要进行合理的操作来转换为日期。
我不确定Sdc任务是什么 - 我不使用它们,因为我更喜欢CommunityTasks,但即使执行了这些任务,我也无法想到任何可行的任务。
自定义MSBuild任务并不那么可怕 - 我建议每个(可调整大小)项目都应该有一个解决方案,它是在任何其他解决方案之前构建的,该解决方案将包含自定义msbuild任务的DLL输出到众所周知的位置(例如“源”的根目录下的“lib”文件夹)。
如果你可以让这个作为一个解决方案,然后在这里是一个任务我只是敲了那达到你想要什么:
using System;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace Build.MsBuildTasks
{
public class FindFilesOlderThan : Task
{
[Required]
public ITaskItem[] Files { get; set; }
public int Months { get; set; }
public int Days { get; set; }
public int Years { get; set; }
[Output]
public ITaskItem[] MatchingFiles { get; set; }
public override bool Execute()
{
var olderThan = DateTime.UtcNow.AddYears(-Years).AddMonths(-Months).AddDays(-Days);
MatchingFiles = (from f in Files
where DateTime.Parse(f.GetMetadata("ModifiedTime")) < olderThan
select f).ToArray();
return true;
}
}
}
你可以这样使用它,像这样:
<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\..\lib\Build.MsBuildTasks.dll"
TaskName="Build.MsBuildTasks.FindFilesOlderThan" />
<Target Name="Purge">
<ItemGroup>
<FilesToConsider Include="f:\temp\AzurePackages\**\*.*" />
</ItemGroup>
<FindFilesOlderThan
Files="@(FilesToConsider)"
Months="6">
<Output
TaskParameter="MatchingFiles"
ItemName="FilesToPurge"/>
</FindFilesOlderThan>
<Message Text="FilesToPurge: @(FilesToPurge)" />
</Target>
中当然,YMMV
什么是YMMV? thmm – Kiquenet 2010-08-19 10:05:43
YMMV:你的Milage May Vary ... – 2010-08-19 10:30:17