2

ディレクトリ内の各ビルドで生成されたファイルのリストがありますC:\BuildArtifacts

ディレクトリの内容は次のようになります。

TestBuild-1.0.0.1.zip
TestBuild-1.0.0.2.zip
TestBuild-1.0.0.3.zip
TestBuild-1.0.0.4.zip
TestBuild-1.0.0.5.zip
TestBuild-1.0.0.6.zip

さて、インクリメンタルビルドごとに、最近の2つのアーティファクトを保持し、残りを削除したいと思います。したがって、この例では、保持TestBuild-1.0.0.5.zipしてTestBuild-1.0.0.6.zip

MSBuildでそれを行うにはどうすればよいですか?

ノート:

上記のリストをアイテムに取り込むことができました

 <Exec WorkingDirectory="$(Artifacts)\.." Command="dir /B /A:-D /O:-N" Outputs="ArchiveFileList" />
4

2 に答える 2

7

ファイルを名前でソートし、削除するファイルのリスト (リストの最初の 2 つを除く) を出力するカスタム タスクを作成しました。Item

カスタム タスク:

 <UsingTask
    TaskName="Cleanup"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup>
      <TargetPath ParameterType="System.String" Required="true"/>
      <BackupLength ParameterType="System.Int32" Required="true"/>
      <FilesToExclude ParameterType="System.String[]" Output="true" />
      <FilesToDelete ParameterType="System.String[]" Output="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System.IO" />
      <Using Namespace="System.Linq" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
        var diInfo = new DirectoryInfo(TargetPath);
            if (diInfo.Exists)
            {
                var fiInfo = diInfo.GetFiles().OrderByDescending(file => file.Name);

                FilesToExclude = fiInfo.Take(BackupLength).Select(file => file.FullName).ToArray();
                FilesToDelete = fiInfo.Skip(BackupLength).Select(file => file.FullName).ToArray();
            }
        ]]>
      </Code>
    </Task>
  </UsingTask>

使用法:

<!-- Clean old archives. Keep the recent two and deletes rest. -->
<Cleanup TargetPath="$(PackageRoot)" BackupLength="2">
  <Output TaskParameter="FilesToDelete" ItemName="FilesToClean" />
</Cleanup>

<Message Text="Cleaning Old Archives" Importance="High" />
<Delete Files="@(FilesToClean)" />
于 2012-06-05T06:26:02.140 に答える
2

このコマンドをテストし<exec ...>てから、del代わりに次のコマンドを使用してくださいecho

for /f %x in ('cmd /c "dir /B /A-D /O-N | more +2"') do echo %x
于 2012-06-01T04:16:59.627 に答える