2010-04-29 27 views
13

Diğer birçok görev tarafından tüketilecek yeniden kullanılabilir bir MSBuild Target üzerinde çalışıyorum. Bu hedef, çeşitli özelliklerin tanımlanmasını gerektirir. Bu özelliklerin tanımlandığını doğrulamanın en iyi yolu nedir, yoksa bir Hata atmaktır? Neredeyse gibi MSBuild Validating Properties

iki girişim:

<?xml version="1.0" encoding="utf-8" ?> 
    <Project ToolsVersion="3.5" DefaultTarget="Release" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="Release"> 
    <Error 
     Text="Property PropA required" 
     Condition="'$(PropA)' == ''"/> 
    <Error 
     Text="Property PropB required" 
     Condition="'$(PropB)' == ''"/> 

    <!-- The body of the task --> 

    </Target> 
</Project> 

Burada grup haline getirilmeleri bir girişim bu. Ekstra "İsim" parametresi nedeniyle çirkin. Bunun yerine Include özniteliğini kullanmak mümkün mü?

<?xml version="1.0" encoding="utf-8" ?> 
<Project ToolsVersion="3.5" DefaultTarget="Release" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="Release"> 
    <!-- MSBuild BuildInParallel="true" Projects="@(ProjectsToBuild)"/ --> 
    <ItemGroup> 
     <RequiredProperty Include="PropA"><Name>PropA</Name></RequiredProperty> 
     <RequiredProperty Include="PropB"><Name>PropB</Name></RequiredProperty> 
     <RequiredProperty Include="PropC"><Name>PropC</Name></RequiredProperty> 
    </ItemGroup> 

    <Error 
     Text="Property %(RequiredProperty.Name) required" 
     Condition="'$(%(RequiredProperty.Name))' == ''" /> 

    </Target> 

</Project> 

cevap

16

Harika soru! Bu konuda derinlemesine yazdım book ve bir blog yazısında, Elements of Reusable MSBuild Scripts: Validation. Benim yaklaşımım özellikleri ve eşyaları kapsayacaktır.

İşte işlem bitti. Paylaşılan .targets dosyasında bir doğrulama hedefi oluşturun ve bu, kullanıcıların kolayca bulabilmeleri için dosyada bildirilen ilk hedeflerden biri olmalıdır.

Özellikleri doğrulama hedefi İçinde

bu gibi özelliklerini tanımlayın:

<_RequiredProperties Include="Root"> 
    <Value>$(Root)</Value> 
</_RequiredProperties> 

I özelliğin adını yerleştirmek dahildir ve Value metadata.The nedenle neden içini değeri Bunu yapmak için Value boş olduğunda algılayabiliyorum ve sonra eksik özelliğin adını kullanıcıya geri bildirmek için include değerini kullanıyorum.

Öğeler hedef yerin İçinde

gibi bir öğenin içine gerekli öğeler: iç özelliklerine benzer

<_RequiredItems Include="AllConfigurations"> 
    <RequiredValue>@(AllConfigurations)</RequiredValue> 
</_RequiredItems> 

, öğenin adını ve ardından değeri yerleştirmek dahil RequiredValue meta verilerinde kontrol edilir. Bu örnekte, yalnızca AllConfiguraitons öğesinin boş olmadığından emin olmak için denetler. Eğer bir dosya daha sonra ek meta veriler, RequiredFilePath eklemek Varlığından emin olmak için

<_RequiredItems Include = "AllConfigurations.Configuration"> 
    <RequiredValue>%(AllConfigurations.Configuration </RequiredValue> 
</_RequiredItems> 

Sayısı: Belirli bir meta veri değeri daha sonra böyle bir şey yapmak tüm öğeler üzerinde belirtildiğinden emin olmak için.

<_RequiredItems Include ="ProjectsToBuild"> 
    <RequiredValue>%(ProjectsToBuild.Identity)</RequiredValue> 
    <RequiredFilePath>%(ProjectsToBuild.Identity)</RequiredFilePath> 
</_RequiredItems> 

Doğrulama İşte

doğrulama

gerçekleştirmek için gerekenler Bu ben aradığı şeyi adildir - tam örnek İşte

tam örnek

<Target Name="ValidateBuildSettings"> 
    <ItemGroup> 
    <_RequiredProperties Include="Root"> 
     <Value>$(Root)</Value> 
    </_RequiredProperties> 

    <_RequiredProperties Include="BuildInstallRoot"> 
     <Value>$(BuildInstallRoot)</Value> 
    </_RequiredProperties> 

    <_RequiredProperties Include="SourceRoot"> 
     <Value>$(SourceRoot)</Value> 
    </_RequiredProperties> 
    <!-- 
    _RequiredItems is the item where required items should be placed. 
    The following metadata is significant: 
     REQUIRED METADATA: 
     Identity   = This will basically be used to identify the specific required item 
     RequiredValue  = This is the specific value that will be validated to exist 

     OPTIONAL METADATA 
     RequiredFilePath = Populate this with a path that should exists, if it is not empty 
          then it will be checked to exist on disk. 
    --> 

    <_RequiredItems Include="AllConfigurations"> 
     <RequiredValue>@(AllConfigurations)</RequiredValue> 
    </_RequiredItems> 
    <_RequiredItems Include = "AllConfigurations.Configuration"> 
     <RequiredValue>%(AllConfigurations.Configuration </RequiredValue> 
    </_RequiredItems> 
    <_RequiredItems Include ="ProjectsToBuild"> 
     <RequiredValue>%(ProjectsToBuild.Identity)</RequiredValue> 
     <RequiredFilePath>%(ProjectsToBuild.Identity)</RequiredFilePath> 
    </_RequiredItems> 
    </ItemGroup> 
    <!-- Raise an error if any value in _RequiredProperties is missing --> 

    <Error Condition =" '%(_RequiredProperties.Value)'=='' " 
      Text=" Missing required property [%(_RequiredProperties.Identity)]" /> 

    <!-- Raise an error if any value in _RequiredItems is empty --> 
    <Error Condition = " '%(_RequiredItems.RequiredValue)'=='' " 
      Text = " Missing required item value [%(_RequiredItems.Identity)] " /> 

    <!-- Validate any file/directory that should exist --> 
    <Error Condition = " '%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)') " 
      Text = " Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)] " /> 
</Target> 
+0

Mükemmel olduğunu. Kitabınızın bir kopyasını almam gerekecek gibi görünüyor :) –