2009-08-19 6 views
3

J'essaie de configurer certaines propriétés que j'utilise plusieurs fois dans mon script MSBuild. J'ai la section de propriété suivante:Erreur lors de l'utilisation des jetons MSBuild dans PropertyGroup

<PropertyGroup> 
    <BuildDependsOn>$(BuildDependsOn); MyAfterBuild </BuildDependsOn> 
    <SubstitutionsFilePath>$(ProjectDir)app.config.substitutions.xml </SubstitutionsFilePath> 
    <AppConfig>$(TargetPath).config</AppConfig> 
    <HostConfig>$(TargetDir)$(TargetName).vshost.exe.config</HostConfig> 
</PropertyGroup> 

Quand je lance ce que je reçois l'erreur suivante:

The expression "@(TargetPath).config" cannot be used in this context. Item lists cannot be concatenated with other strings where an item list is expected. Use a semicolon to separate multiple item lists. 

Je ne comprends pas cette erreur, comme l'utilisation du $(BuildDependsOn) et $(ProjectDir) excellent travail. Et je sais que les valeurs $(TargetXXX) génèrent correctement car quand je les mets directement dans la section Tâches ci-dessous, elles fonctionnent bien.

Répondre

1

Essayez d'abord d'exécuter votre build avec l'option/v: diag, qui affichera beaucoup plus d'informations et vous donnera une idée de la partie de la compilation qui échoue.

Un indice peut-être dans le fichier Microsoft.Common.targets (situé dans% SystemRoot% \ Microsoft.NET \ Framework \ v2.0.50727) dans la cible PrepareForBuild:

<!-- 
    These CreateProperty calls are required because TargetDir and TargetPath are defined 
    to contain an item list. We want that item list to be expanded so that it can be used 
    as a regular property value and not as an item-list-with-transform. 
    --> 
    <CreateProperty Value="$(TargetDir)"> 
     <Output TaskParameter="Value" PropertyName="TargetDir" /> 
    </CreateProperty> 

    <CreateProperty Value="$(TargetPath)"> 
     <Output TaskParameter="Value" PropertyName="TargetPath" /> 
    </CreateProperty> 
2

La raison de ce problème est que TargetDir est défini comme une liste d'éléments, pas une propriété; probablement pour répondre au scénario où vos sorties sont réparties entre plusieurs répertoires de sortie?

J'ai rencontré ce même problème et j'ai réussi à contourner ce problème en utilisant la propriété $ (OutDir) au lieu de $ (TargetDir).

(La OutDir propriété est définie dans Microsoft.Common.targets (lignes 100-102) comme une version normalisée du OutputPath définie dans votre fichier de projet.)

Questions connexes