Проект за уеб внедряване - копиране на файлове след изграждане

В момента съм създал проект за уеб разгръщане, който компилира код в папката .\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
Също така го поправи за мен. Ура гугъл. - 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