2010-09-02 3 views
0

Je me demande pourquoi dans le code suivant, MsBuild refuse de définir les métadonnées de suffixe. Il fonctionne avec une tâche CreateItem au lieu de la déclaration ItemGroup (car CreateItem est calculé au moment de la construction) mais je ne peux pas le faire ici car ce code est dans un "fichier de propriétés": le projet n'a pas de cible, c'est juste un tas des propriétés/éléments que j'inclus dans les projets réels. Les destinations sont bien construites mais les métadonnées des suffixes ne sont pas définies. Pour l'instant, j'ai dupliqué la définition des destinations dans chaque projet dont j'avais besoin, mais ce n'est pas très propre. Si quelqu'un a une meilleure solution, je suis intéressé!Étendue et ordre d'évaluation des éléments dans MsBuild

Répondre

0

Il semble que j'essaie de mettre les métadonnées dynamiquement en dehors d'une cible ce qui est impossible. J'essaie de définir les métadonnées des suffixes en effectuant un traitement par lot sur les éléments de mise en page, mais les éléments de mise en page ne sont pas correctement définis lorsque le traitement par lot est terminé. Le traitement par lots est effectué lorsque msbuild analyse mes fichiers de propriétés, il n'attend pas que la mise en page soit déclarée. Néanmoins, comme MadGnome l'a fait remarquer, je peux effectuer un traitement par lot sur LayoutFolder (qui est l'élément source de mes includes) car MSBuild attend qu'il soit déclaré.

2

Avec MSBuild 4 vous pouvez utiliser les métadonnées des éléments précédents dans la déclaration de l'article comme celui-ci:

<ItemGroup> 
    <Layout Include="Bla"> 
     <PartnerCode>bla</PartnerCode> 
    </Layout> 
    <Layout Include="Bli"> 
     <PartnerCode>bli</PartnerCode> 
    </Layout> 
</ItemGroup> 

<ItemGroup> 
    <Destinations Include="@(Layout)" > 
     <Suffix>%(PartnerCode)</Suffix> 
    </Destinations> 
</ItemGroup> 

(Il est étrange que vous lots sur LayoutFolder et essayer d'obtenir Layout métadonnées Quelle valeur voulez vous Suffixe bla. ou bli?)

+0

En fait, je peux. Je l'ai fait plusieurs fois. C'est bien si vous écrivez explicitement le nom du groupe d'articles sur lequel vous voulez effectuer un lot comme% (LAYOUT.PartnerCode). Mais peut-être que je ne peux pas lotir si ce n'est pas dans un élément cible ... –

+0

Si vous écrivez% (Layout.PartnerCode) dans Destinations.Suffix quelle valeur voulez-vous? bla ou bli? –

+0

Disons Layout.Count = n. Je veux une collection avec 2 éléments: tous les éléments de Layout, une fois avec bla et une autre fois avec bli. –

0

Le problème que vous rencontrez est que vous faites référence à des métadonnées dans une liste. Le %(Layout.PartnerCode) parcourt le groupe d'objets "Mise en page", qui dans ce cas renvoie deux éléments. Même avec 1, cela provoque des résultats inattendus non souhaités lorsque vous pointez sur une liste. MSBuild renvoie deux balises META et ne sait pas lequel vous voulez avoir. Le résultat étant qu'il n'en choisit aucun à la place ... ou bien ... bien, MSBuild finit par le mettre à zéro.

Je vous suggère de fixer un ItemDefinition par défaut, comme celui-ci (MSBuild 3,5)

<ItemDefinitionGroup> 
    <Layout> 
    <PartnerCode>%(Identity)</PartnerCode> 
    <Suffix>%(PartnerCode)</Suffix> 
    <Destination Condition="'$(LayoutENV)'=='Preprod'">..\Compile\layout\pre\</Destination> 
    </Layout> 
</ItemDefinitionGroup> 

Et puis les définir comme vous auriez.

<ItemGroup> 
    <Layout Include="Bla" /> 
    <Layout Include="Bli" /> 
    <Layout Include="Bloop"> 
     <PartnerCode>B2</PartnerCode> 
     <Suffix>%(PartnerCode)</Suffix> 
    </Layout> 
</ItemGroup> 

Sidenotes


Remarque. Les métadonnées ne semblent être analysées qu'une fois par groupe de définition/groupe d'items, donc si vous définissez PartnerCode, vous devez également réinitialiser Suffix, comme dans le second exemple. Je ne suis pas familier avec le comportement dans MSBuild 3.5, mais c'est le cas dans MSBuild 4.0.

Remarque. Je suppose que vous voulez que votre nom de fichier soit un suffixe, Identity fait l'affaire, voir ici "MSBuild Metadata éléments connus": (https://msdn.microsoft.com/en-us/library/ms164313.aspx), si ce n'est pas le cas, vous pouvez toujours suivre l'exemple de remplacement personnalisé ou écrire votre propre fonction basée sur elle.En savoir plus sur ce genre de choses ici "MSBuild Property Functions": (https://msdn.microsoft.com/en-us/library/dd633440.aspx)

Questions connexes