3

Msbuild を使用して、6 か月以上経過したフォルダー内のファイルを削除したい。

MsBuild の %ModifiedTime (Well-known Item Metadata) を使いたい

カスタム タスクは使用せず、msbuild のデフォルトと Microsoft.Sdc.Tasks のみを使用します。私はVS 2008、.net .35を使用しています。

助言がありますか ?

<Target Name="SomeTarget"> 

<ItemGroup> 
    <FilesToDelete Include="Path\**\*.zip"/> 
</ItemGroup> 

<Delete Files="@(FilesToDelete)" /> 

</Target> 
4

1 に答える 1

7

ネイティブの 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

于 2010-08-18T15:56:51.423 に答える