复制任务的输出参数'CopiedFiles'返回指定要复制的所有文件,即使它没有复制任何给定SkipUnchangedFiles =“true”

时间:2011-05-10 04:40:41

标签: msbuild copy task

CopiedFiles参数返回所有要复制的文件。但是考虑到SkipUnchangedFiles被设置为true并且ttask本身没有复制任何东西,这可以在命令行上看到(没有复制消息)。那么,为什么不,CopiedFiles是空的?

我需要将CopiedFiles参数仅填充实际复制的文件(因为它们已被更改),以便将这些文件进一步复制到其他文件夹中。这是为了维护一个最新的版本文件夹,以及只提取那些实际需要传播到UAT /生产服务器上的文件。

为了便于参考,我正在使用的复制任务代码如下:

<Copy SkipUnchangedFiles="true"
            SourceFiles="@(cfile)"
                DestinationFiles="@(cfile->'$(PublishDir)\%(Identity)')">

        <Output
                    TaskParameter="CopiedFiles"
                    ItemName="Changed" />

</Copy>

<Message Text="changed:@(Changed)" Importance="high" />

复制任务中是否存在错误,或者这是预期的行为。

1 个答案:

答案 0 :(得分:3)

您所看到的行为是设计上的。 MSBuild使用任务输出跟踪文件依赖性。如果不这样做,任何依赖@(Changed)项数组作为输入的东西都不能完全处理大多数情况下所需的所有文件。由于同样的原因,它甚至可以跟踪在输入和输出是最新的情况下甚至不执行的目标中创建的属性和项目。考虑使用附加的输出参数CopiedFilesCopiedByTask创建自己的不同复制任务(此命名镜像在其他已失效的CreateProperty任务中ValueSetByTask的命名和行为)。