2013-06-27 3 views
2

Comment peut-on aplatir un objet dans une propriété?Comment aplatir un objet dans une propriété?

Selon ce MSDN page (section Conversions between Strings and Item Lists), il s'agit simplement de déclarer une propriété avec l'élément comme valeur.

Mais j'ai trouvé la pratique réelle complètement contraire. Quand je lance ce projet avec MSBuild 4.0, la spécification cible install ...

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(Project-to-import)" Condition="'$(Project-to-import)' != ''" /> 

    <ItemGroup> 
    <RuntimeProj Include="C:\TEMP\Design.proj" /> 
    <DesigntimeProj Include="C:\TEMP\Run.dproj" /> 
    </ItemGroup> 

    <PropertyGroup> <!-- Flatten out the items to properties. --> 
    <RuntimeProj>@(RuntimeProj)</RuntimeProj> 
    <!--^This bit doesn't work. MS documentation is wrong? --> 
    <DesigntimeProj>@(RuntimeProj)</DesigntimeProj> 
    </PropertyGroup> 

    <Target Name="install"> 
    <Message Text="Hello world!"/> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="BuildRunPackage" 
      Properties="Project-to-import=$(RuntimeProj)" /> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="BuildDesignPackage" 
      Properties="Project-to-import=$(DesigntimeProj)" /> 
    </Target> 

    <Target Name="BuildRunPackage"> 
    <CallTarget Targets="Clean" /> 
    <CallTarget Targets="Build" /> 
    </Target> 

    <Target Name="BuildDesignPackage"> 
    <CallTarget Targets="Clean" /> 
    <CallTarget Targets="Make" /> 
    <CallTarget Targets="Register" /> 
    </Target> 
<.Project> 

... une erreur est renvoyée ...

erreur MSB4012: L'expression « -to-projet import = @ (RuntimeProj) ne peut pas être utilisé dans ce contexte. listes d'articles ne peuvent pas être concaténées avec d'autres chaînes où une liste d'articles est prévu. Utilisez un point-virgule pour séparer plusieurs listes d'articles.

Répondre

4

Je ne suis pas absolument sûr mais je pense que vous vous retrouvez dans un problème d'ordre d'évaluation. Pour autant que je sache, les propriétés sont évaluées avant les éléments (voir Ordre d'évaluation des propriétés et des éléments dans http://msdn.microsoft.com/en-us/library/dd997067.aspx) Si vous pouvez essayer de déplacer le groupe de propriétés de «global» sous la cible d'installation. Ça devrait marcher.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(Project-to-import)" Condition="'$(Project-to-import)' != ''" /> 

    <ItemGroup> 
    <RuntimeProj Include="C:\TEMP\Design.proj" /> 
    <DesigntimeProj Include="C:\TEMP\Run.dproj" /> 
    </ItemGroup> 


    <Target Name="install"> 
    <PropertyGroup> <!-- Flatten out the items to properties. --> 
     <RuntimeProj>@(RuntimeProj)</RuntimeProj> 
     <DesigntimeProj>@(RuntimeProj)</DesigntimeProj> 
    </PropertyGroup> 

    <Message Text="Hello world!"/> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="BuildRunPackage" 
      Properties="Project-to-import=$(RuntimeProj)" /> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="BuildDesignPackage" 
      Properties="Project-to-import=$(DesigntimeProj)" /> 
    </Target> 

    <Target Name="BuildRunPackage"> 
    <CallTarget Targets="Clean" /> 
    <CallTarget Targets="Build" /> 
    </Target> 

    <Target Name="BuildDesignPackage"> 
    <CallTarget Targets="Clean" /> 
    <CallTarget Targets="Make" /> 
    <CallTarget Targets="Register" /> 
    </Target> 
</Project> 
+0

Oui. C'est la façon de le faire. Vous devez aplatir la propriété dans un '. –

Questions connexes