8

目前我已经建立了一个将代码编译到.\Release文件夹中的 Web 部署项目。构建后,我想将文件复制到另一台机器上(因为您构建到的任何目录都被删除然后重新创建)。

用于定义要复制哪些文件的 ItemGroup 设置如下:

<ItemGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
    <ReleaseFiles Include=".\Release\**\*" />
    <OverrideFiles Include="..\website\App_Code\override\site.com\**\*" />
</ItemGroup>

“网站”是用于多个站点的代码,因此在解决方案中设置了多个 Web 部署项目。

然后,我有 AfterBuild 目标来复制文件:

<Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <Copy SourceFiles="@(ReleaseFiles)" ContinueOnError="true" SkipUnchangedFiles="true" DestinationFiles="@(ReleaseFiles->'\\server\web\site.com\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Copy SourceFiles="@(OverrideFiles)" DestinationFiles="@(OverrideFiles->'\\server\web\site.com\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>

但是,没有复制 ReleaseFiles,这可能是什么原因?我遇到了每次可能不同的错误,但即使没有出现该消息,文件仍然没有被复制.\TempBuildDir\folder\subfolder - The process cannot access the file because it is being used by another process.folder\subfolder

问题是,它以前工作过。

4

1 回答 1

9

核心问题是在加载 MSBuild 文件时正在评估您的示例中的 ItemGroup - 那时,很可能这些文件还不存在......

因此,您的“ReleaseFiles”和“OverrideFiles”集合是空的,然后没有任何内容被复制。

您需要做的是在构建发生后动态创建您的 ItemGroups(并且此处引用的文件确实存在):

<CreateItem Include=".\Release\**\*">
   <Output TaskParameter="Include" ItemName="ReleaseFiles"/>
</CreateItem>
<CreateItem Include="..\website\App_Code\override\site.com\**\*">
   <Output TaskParameter="Include" ItemName="OverrideFiles"/>
</CreateItem>

现在你应该没事了,复制任务应该可以工作了。

马克

于 2009-10-08T11:49:10.483 回答