2011-05-17 11 views
37

MSBuild ItemGroups ile "döngü" de EXEC görevini nasıl gerçekleştiririm? Bunun yerine şöyle tekrar tekrar bu komutu yinelenenMSBuild ItemGroups ile bir "döngüsünde" EXEC görevini nasıl gerçekleştiririm?

:

<Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22account%22 -i data\add_sql_cache.sql -b" /> 
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22services%22 -i data\add_sql_cache.sql -b" /> 
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22servicesGroup%22 -i data\add_sql_cache.sql -b" /> 
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22servicesCategory%22 -i data\add_sql_cache.sql -b" /> 

doğrusu bir ItemGroup tanımlamak ve sadece bir "döngü" yürütme ediyorum. Ben ItemGroup aşağı var:

<ItemGroup> 
    <CachedTables Include="account" /> 
    <CachedTables Include="services" /> 
    <CachedTables Include="servicesGroup" /> 
    <CachedTables Include="servicesCategory" /> 

Ama MsBuild en inanılmaz unintuitive sözdizimi, nasıl yukarıda girdi olarak ItemGroup ile bir döngü içinde Exec görevi gerçekleştirmek için hiçbir fikrim yok dolayı.

+2

bu cevabım silindi ama kayda benim deneyim beri için belirtmek istiyorum Bu soruyu yazmak bana oldukça güçlü bir fikir olduğunu hissetmeme neden oldu: Bu kötü bir fikir: böyle şeyler yapmak için Psake ya da gulp gibi bir araç kullanmalısın. –

cevap

45

hem "yumuşatma yapılması"

Toplu bir hedef olabilir ve Exec ve diğer işlemleri gerçekleştirmek şekilleridir Bunu yapmanın iki yolu,

<Target Name="ExecMany" 
    Outputs="%(CachedTables.Identity)"> 
    <Exec 
    Command="sqlcmd -S ... TableName=%22%(CachedTables.Identity)%22 -i ..." 
    /> 
    <SomeOtherTask ThatUses="%(CachedTables.Identity)" /> 
</Target> 

diğer görev istifleme kullanmaktır vardır Sadece Exec görevinde. Benzer şekilde, bunların nasıl işleyeceği de aynıdır. İlk olarak, yığınlama tüm hedef için (Çıkışlar özniteliği ile elde edilen), Exec görevi olduğundan, gruptaki her öğe için SomeOtherTask çalıştırılacaktır. Başka bir deyişle,

Exec with "account" 
SomeOtherTask with "account" 
Exec with "services" 
SomeOtherTask with "services" 
... 

ikinci seçenek, ayrı ayrı her görevi dozajları, soruyu anlamak, bu daha basit biraz yapılabilir

Exec with "account" 
Exec with "services" 
... 
SomeOtherTask with "account" 
SomeOtherTask with "services" 
... 
+2

Sadece Brian'ın cevabını okuduktan sonra bulabildiğim ilgili MSDN bağlantıları: [MSBuild batching] (http://msdn.microsoft.com/en-us/library/ms171473.aspx), [transforms] (http://msdn.microsoft.com/en-us/library/ms171476.aspx) ve [item metadata] (http://msdn.microsoft.com/en-us/library/ms171474.aspx). –

26

aşağıdaki diziyi, üretecektir. Aşağıdaki örnek her bir öğeyi dışarı yankı < Exec /> kullanan bir < ItemGroup />

<ItemGroup> 
    <MySpecialItem Include="one" /> 
    <MySpecialItem Include="two" /> 
    <MySpecialItem Include="three" /> 
    </ItemGroup>  

    <Target Name="MyTarget"> 
    <Exec Command="echo %(MySpecialItem.Identity)"/> 
    </Target> 
+0

MySpecialItem öğesinin ne olduğunu bilmediğinizde bunu nasıl yaparsınız? Örneğin, MySPecialItem çok satırlı değişkenin içeriği olabilir –