2012-07-11 12 views
9

verir Oldukça geniş bir web uygulaması oluşturmak ve dağıtmak için çalışmak için bir MSBuild komut dosyası almaya çalışıyorum. (Birkaç düzine klasörde birkaç bin dosyadan bahsediyoruz. Burada kalıtsal, eski bir kod tabanı var, bu yüzden bu konuda çok fazla bir şey yapamıyorum.) Yapının kendisi iyi çalışıyor, ancak kopyalama işlemini yapamıyorum. dosyaları düzgün çalışan bir damla yere. İşte Dizin yapısını koruyarak yapı oluşturma çıktı dosyaları kopyalama, 'Yolda yasadışı karakterler'

bir pasajı ben yapı komut dosyasında ne var gösteriyor: Ben bireysel yolları doğru genişletmek doğrulamak için orada birkaç ekstra <Message/> koyduk

<PropertyGroup Condition=" '$(UseBuildNumber)' == 'true' "> 
    <ReleaseDirectory>$(ReleaseBaseDirectory)$(ReleaseName)\$(BuildNumber)</ReleaseDirectory> 
</PropertyGroup> 

<ItemGroup> 
    <OutputFiles Include=" 
       $(SourceRoot)**\*.aspx; 
       $(SourceRoot)**\*.dll; 
       $(SourceRoot)**\*.gif; 
       $(SourceRoot)**\*.ascx; 
       " /> 
</ItemGroup> 

<Message Text="Output files ==> @(OutputFiles)" /> 

<Copy 
    SourceFiles="@(OutputFiles)" 
    DestinationFolder="$(ReleaseDirectory)" 
    SkipUnchangedFiles="false" 
    /> 

ve her iki $(SourceRoot) ve $(ReleaseDirectory) gerçekten var mı doğru yollar. Ancak, üretimde, I (kısalık için elided tam yol) almak: Açıkçası

Task "Message" 
    Output files ==> ...\Requirement1866**\*.aspx;...\Requirement1866**\*.dll;...\Requirement1866**\*.gif;...\Requirement1866**\*.ascx 
Done executing task "Message". 

, joker genişletme çalışması yapılmamıştır ve sonra Copy aşağıdaki (tahmin yeterince) başarısız olur. Sadece bir tane ekliyorum; gerçekte bu, her bir dosya adı joker desenleri için tekrarlanır (ki bu da yukarıdaki yapı betiği snippet'ine dahil ettiğimden çok daha fazlasıdır).

d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path. 

I Want bu Copy Task - Illegal characters in path oldu Googling benim çabaları rastlamak, ama ben zaten bir <ItemGroup> ve <CreateItem> örnek kullanıyorum sadece makul alakalı hit (uyarlanmıştır:

Using "Copy" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
Task "Copy" 
    Copying file from "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". 
    Command: 
    copy /y "*basedir*\Requirement1866**\*.aspx" "*targetdir*\Requirement1866\*buildnumber*\*.aspx" 
d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path. 

ardından) hiç işe yaramadı, TaskParameter bilinmeyen bir hata ile erken iptal edildi (özür dilerim, önümde tam hata mesajım yok).

Bir durma önlemi olarak, ilgili dosyaları build output dizininden istediğim yere el ile kopyalayıp el ile kopyalayabilirim, ancak bu işlemin otomatik olmasını istiyorum.

MSBuild'i kullanarak, oluşturma işlemi sırasında oluşturulmuş dosyaları bir çıkış dizinine kopyalayıp, ilgili dizin yapısını koruyarak bunları tek tek listelemeden nasıl yaparım?

+0

Doğrudan bir cevabım yok, ama ben de bu problemle daha önce karşılaştım. Bunu yapmak ve post-build eylem olarak adlandırmak için bir PowerShell betiği yazmayı bitirdim. Ayrıca, soruya +1 çok etkileyici olduğu için çok iyi araştırılmış. Gönderilen doğru cevabı dört gözle bekliyorum! – allquixotic

cevap

20

Temel olarak, **, bir tek yol eleman ve böylece buna uygun olarak Include direktifte eğik çizgi ile ayrılmış olması gerekir:

<ItemGroup> 
    <OutputFiles Include=" 
       $(SourceRoot)\**\*.aspx; 
       $(SourceRoot)\**\*.dll; 
       $(SourceRoot)\**\*.gif; 
       $(SourceRoot)\**\*.ascx; 
       " /> 
</ItemGroup> 

Not örneğin belirtme arasındaki farkı $(SourceRoot)**\*.aspx'un kırılmasına karşılık $(SourceRoot)\**\*.aspx. $(SourceRoot), bir \ ile bittiyse, joker genişletme muhtemelen ilk başta çalışacaktır. Bu değişikliklerle

<Copy 
    SourceFiles="@(OutputFiles)" 
    DestinationFolder="$(ReleaseDirectory)\%(RecursiveDir)" 
    SkipUnchangedFiles="false" 
    /> 

, kadar benim istediğim gibi gibi çalışması için görünür::

İkincisi, <Copy/> yılında, %(RecursiveDir) kullanmak dosyalar istenen hedef dizine kopyalanır ve kaynağında dizin yapısı hedef konumda korunur.

2

Başka bir Öneri, her dosya türü için Dahil Et eklemek yerine, Hariç Tutulanlar eklemek kolaydır.

<ItemGroup> 
    <OutputFiles Include="$(SourceRoot)**\*.*" Exclude="$(SourceRoot)**\*.cs;$(SourceRoot)**\*.resx" " /> 
</ItemGroup> 

Bu şekilde çıkış gereken her türlü JS, HTML, DHTML ve diğer dosya türlerini içerecek.

+0

Her iki yaklaşım da kişinin ihtiyaçlarına göre çalışır. Benim özel durumumda, kopyalamak istediklerimi sıralamak ve diğer her şeyi hariç tutmak çok daha kolaydı. –

İlgili konular