2009-09-02 19 views
14

MSBuild dosyasımda üç özellik belirtmek ve bir özelliği diğerinin üzerine yazmak (çağrılan hedefe bağlı olarak) yazmak istiyorum, ancak bunun nasıl yapılacağını anlayamıyorum. Ben buna göre değer olduğunu ayar özelliğini yeniden ilan etmeye çalışıyorum ama bu olmuyor Şu andaMSBuild öğesinin üzerine yazma özellikleri

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="Deploy-TEST"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-LIVE"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
     DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 

: My yapı dosyası şuna benzer.

cevap

13

Mehmet başka tesise özellik değerini nasıl ayarlanacağı konusunda haklı olmakla birlikte, aynı Target CreateProperty ve CallTarget ararsanız olduğunu, yeni özellik olmayacak demektir MSBuild bir hata/özellik vardır Küresel olarak diğer hedeflere (described here) ulaşılabilir.

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-TEST"> 
    <CallTarget Targets="SetDeployPath-TEST"/> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 
+0

Teşekkürler, bu yararlı oldu. Ben hala topluca yeniyim ve MS benim düşünceme göre ilgili kavramları açıklayan iyi bir iş yapmıyor. Bir not daha. Küresel bir mülk yaratmadan aslında kaçtım; Bu, içeriği biraz daraltmak için kodu okumak daha kolaydır: Hedef A, B ve C çağrıları hedefleri B, bir liste özelliği ayarlar ve C, bu özelliğin değeri üzerinde toplu işlem yapar. mdresser, mülkün aynı hedefe ayarlandığını belirttiği gibi işe yaramadı. Umarım birisine yardım eder; Bu yazıyı bulmadan önce bunu anlamaya çalışmak için 3-4 saat harcadım. – AlexeiOst

+0

Bir nokta daha, sadece Cat'in değiştiğine dair bir bildirim aldığınızı, değişiklikleri kaydetmeyi denediniz mi diyorsunuz? Çalışıyor mu? (Şüphe duyuyorum) –

8

Varolan bir özelliğin değerinin üzerine yazmak için CreateProperty görevini kullanabilirsiniz.

<Target Name="Deploy-LIVE"> 
    <CreateProperty Value="$(DeployPath_LIVE)"> 
    <Output PropertyName="DeployPath" TaskParameter="Value"/> 
    </CreateProperty> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 
+0

. DeployPath özelliğinin değerini CreateProperty bloğundan hemen sonra kullanabilirim, ancak Deploy-Sub hedefi içindeki değerini kaybeder. –

+2

Haa, bu makaleyi http://weblogs.asp.net/bhouse/archive/2006/03/20/440648.aspx, CreateProperty göreviyle bir hata/özellik tanımlayarak buldu. –

+0

İlginç Bu hatayı bilmedim. Daha önce CreateProperty kullandım, ancak üzerine yazılan hedefin üzerine yazılan nesneye erişmek için gereken hiçbir şey yok. Teşekkürler. –

4

Ben genellikle CallTarget görevi kaçının:

Yani burada sorununa nihai çözümdür. Hedef bağımlılıkları kullanmak çok daha iyi.

+0

Biraz detaylandırır mısınız? Neden senin için daha iyi? –

+2

@HaymoKutschbach bu hata nedeniyle http://sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx ve bence CallTarget, msbuild'in nasıl kullanılması gerektiğine dair zihinsel modele karşı geliyor. MSBuild bildiricidir, CallTarget çok zorunluluktur. Bununla birlikte, ihtiyaç duyulduğunda bazı durumlar olduğu, ancak CallTarget'ten önce DependsOn'u tercih etmeliyiz. –

+0

Teşekkürler! Katılıyorum ve msbuild takımının, ithal edilen projelerde özelliklerin global olarak belirlenmesini sağlamak için DependsOn'u da teşvik ettiği görülüyor. –

0

Ayrıca, yol aşağıdaki kullanabilirsiniz: Bu benim için çalışmak görünmüyor

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-Sub" DependsOnTargets="SetDeployPath-TEST"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target>