Проект веб-развертывания - копирование файлов после сборки

В настоящее время я создал проект веб-развертывания, который компилирует код в папку .\Release. После сборки я хочу скопировать файлы на другой компьютер (потому что какой бы каталог вы ни создавали, он удаляется, а затем создается заново).

ItemGroup для определения копируемых файлов настраивается следующим образом:

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

«веб-сайт» - это код, который используется для нескольких сайтов, поэтому в рамках решения настроено несколько проектов веб-развертывания.

Затем у меня есть цель 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 каждый раз может отличаться, но даже если это сообщение не появляется, файлы все равно не копируются.

Проблема в том, что раньше это работало.


person SamWM    schedule 08.10.2009    source источник


Ответы (1)


Основная проблема заключается в том, что ItemGroup в вашем примере оценивается во время загрузки файла MSBuild - и в то время, скорее всего, эти файлы еще не существуют ...

Поэтому ваши коллекции «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>

Теперь все должно быть в порядке, и задача копирования должна работать.

Марк

person marc_s    schedule 08.10.2009
comment
Подходит ли CreateItem к ItemGroup или Target? - person SamWM; 08.10.2009
comment
Вы должны поместить его в цель AfterBuild перед задачами копирования. - person marc_s; 08.10.2009
comment
Также исправил это для меня. Ура, Google. - person roufamatic; 19.06.2010
comment
Такой способ работы устарел. Из msdn.microsoft.com/en-us/library/s2y3e43x.aspx Начиная с .NET 3.5, вы можете поместить ‹ItemGroup› внутри ‹Target› для достижения тех же результатов. - person Steve J; 30.03.2012