2011-10-04 13 views
8

Çözüm oluşturma işlemimin bir parçası olarak, tüm "İçerik" dosyalarını (asp? X etc) başka bir klasöre kopyalamak istiyorum. Bunlar projede çok açık bir şekilde etiketlendiğinden, xcopy ile kendi post-build adımı yazmak yerine bunları kopyalamanın kolay bir yolu olması gerektiğini düşündüm. Maalesef, bunu çözemedim - bu msbuild olayı beynim ile uyuşmuyor. Sadece gibi bir adımı istiyorum, ancak kullanılacak sözdizimini çözemiyorum. Sadece saf Msbuild çözümleri tüm içerik dosyalarını paketlemek için özelliği dağıtmak web kullanınMSBuild'i İçerik olarak işaretlenmiş tüm dosyaları bir klasöre kopyalayıp klasör yapısını korumak için nasıl alabilirim?

sayesinde

cevap

10

Kolayca izleyerek bunu yapabilirsiniz:

<PropertyGroup> 
    <DestFolder>..\Copy\</DestFolder> 
</PropertyGroup> 

<Target Name="CopyContentFiles"> 
    <Copy SourceFiles="@(Content)" 
     DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/> 
</Target> 

siz bu yürütmek isterseniz bir post-build sadece AfterTargets = örneğin "İnşa" ekleyebilirsiniz ardından adımları:

<PropertyGroup> 
    <DestFolder>..\Copy\</DestFolder> 
</PropertyGroup> 

<Target Name="CopyContentFiles" AfterTargets="Build"> 
    <Copy SourceFiles="@(Content)" 
     DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/> 
</Target> 
+0

Orijinal "csproj" dosyasını düzenlemeden bunu nasıl yapabiliriz? http://stackoverflow.com/questions/30577036/without-editing-the-csproj-file-get-msbuild-to-copy-all-files-marked-as-content –

+0

@ShaunLuttin http://sedodream.com adresine bakın. /2012/07/28/MSBuildHowToExecuteATargetAfterCoreCompilePart2.aspx –

+0

MSBuild'in, yanıtlanmasından bu yana yıllar içinde daha az ayrıntıya sahip olup olmadığından emin değil, DestinationFiles = "$ (DestFolder) \% (RelativeDir)% (Dosya adı)% (Uzantı)" çalıştı Benim için (yani Content-> bit'i atla) – piers7

1

Başına uygulayıp sonra acaba -

Bat dosyası sözdizimi önerileri bu soruya bir cevap olmaz Web dağıtımı bir seçenek değilse, bir siteyle eşitlemek için web dağıtımı kullanın veya xcopy veya RoboCopy kullanın.

RoboCopy görevi MSBuild Community Tasks'da bulunur.

<PropertyGroup> 
    <Configuration>Release</Configuration> 
    <PackageDir>$(MSBuildProjectDirectory)\obj\$(Configuration)\Package\PackageTmp</PackageDir> 
    <ServerPath>\\server\path</ServerPath> 
    <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\...</MSBuildCommunityTasksPath> 
</PropertyGroup>  

<ItemGroup> 
    <Project Include="WebApplication.csproj"/> 
</ItemGroup> 

<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> 

<Target Name="Deploy"> 
    <MSBuild Projects="@(Project)" Targets="Build;Package" Properties="Configuration=$(Configuration)"/> 
    <RoboCopy 
     SourceFolder="@(PackageDir)" 
     DestinationFolder="$(ServerPath)" 
     Subdirectories="true" 
     Mirror="true" 
     /> 
</Target> 
0

Sayed'in yanıtı benim için işe yaramadı çünkü orijinal ana dizini de korudu. Bunun yerine aşağıdaki değiştirilmiş versiyonu kullandım ve güzel çalıştı ve biraz daha zarif!

<PropertyGroup> 
    <DestFolder>..\Copy\</DestFolder> 
</PropertyGroup> 

<Target Name="CopyContentFiles"> 
    <Copy SourceFiles="@(Content)" 
     DestinationFiles="$(DestFolder)\%(RecursiveDir)"/> 
</Target> 
+0

RecursiveDir'in projedeki * içerik * dosyaları için çalıştığını, sadece dosya sistemine karşı globbing'den yüklediğiniz dosya kümeleri için olduğunu düşünmüyorum. – piers7

İlgili konular