2010-04-29 7 views
13

다른 여러 작업에서 사용되는 재사용 가능한 MSBuild 대상에서 작업하고 있습니다. 이 대상은 여러 속성을 정의해야합니다. 속성이 정의되었는지 확인하는 가장 좋은 방법은 무엇입니까? 그렇지 않은 경우 오류가 발생합니다. 나는 거의 같은 MSBuild 유효성 검사 속성

두 시도 :

<?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> 

여기에 배치에서 시도입니다. 그것은 여분의 "Name"매개 변수 때문에 추악합니다. Include 속성을 대신 사용할 수 있습니까?

<?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> 

답변

16

큰 질문입니다! 나는 이것에 대해 내 book과 블로그 게시물 Elements of Reusable MSBuild Scripts: Validation에 깊이 기록했다. 내 접근 방식은 속성과 항목을 다룰 것입니다.

다음은 실행 중지입니다. 공유 .targets 파일에서 유효성 검증 대상을 작성하십시오. 그러면 사용자가 파일을 쉽게 찾을 수 있도록 파일에 선언 된 첫 번째 대상 중 하나 여야합니다.

속성 검증 대상 내부

은 다음과 같이 당신의 속성을 정의 :

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

난에서 속성의 이름을 두는 포함하고 Value metadata.The의 이유는 내부의 값 나는 이것을 수행하여 Value이 비어있을 때를 감지 한 다음 include 값을 사용하여 누락 된 속성의 이름을 다시 사용자에게보고합니다.

항목 대상 장소 내부

같은 항목의 내부 필요한 항목 : 내부 속성과 유사

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

, 당신은 항목의 이름과 그 가치를 포함 RequiredValue 메타 데이터 내부를 확인합니다. 이 예에서는 AllConfiguraitons 항목이 비어 있지 않은지 확인합니다. 이 파일은 다음 추가 메타 데이터, RequiredFilePath를 추가 존재 있는지 확인하려면

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

: 당신은 주어진 메타 데이터 값은 다음과 같이 할 모든 항목에 지정되어 있는지 확인하십시오.

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

확인 여기

는 검증

을 수행해야 할 것입니다 이것이 내가 찾던 것입니다 - 전체 예제 다음은

전체 예를

<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

우수합니다. 본인도 도서 사본을 받아야합니다. –