2009-11-03 25 views
8

Lorsqu'une seule propriété contient des points-virgules, MSBuild analyse automatiquement la propriété dans une liste de propriétés lorsqu'elle est utilisée dans un groupe d'éléments. Voici un extrait de mon projet:MSBuild: comment contrôler l'analyse d'une propriété délimitée par des points-virgules

<PropertyGroup> 
    <ConnectionString>workstation id=.;packet size=4096;Integrated Security=SSPI;data source=.;initial catalog=$(SqlDbName)</ConnectionString> 
</PropertyGroup> 

<ItemGroup> 
    <InstallShieldProperties Include=" 
     CONNECTIONSTRING=$(ConnectionString); 
     Another=$(value)"/> 
</ItemGroup> 

Lorsqu'une tâche consomme le @ (InstallShieldProperties) ItemGroup, MSBuild analysera la propriété ConnectionString dans une liste de propriétés de sous-ensemble, car il contient des points-virgules. Je sais que je peux changer le délimiteur du groupe d'articles, mais cela ne fera aucune différence. J'essaie d'éviter de manipuler le tableau string [] dans la tâche personnalisée.

Répondre

9

AFAICS, vous pouvez échapper à la virgule dans le $ (ConnectionString) propriété comme:

<ConnectionString>workstation id=.%3Bpacket size=4096%3B.."</ConnectionString> 

Ou utiliser une tâche de remplacer le ';' dans la propriété ConnectionString à '% 3B', puis utilisez cette propriété dans l'élément InstallShieldProperties. L'autre façon pourrait être de changer le type de propriété dans la tâche personnalisée de la chaîne [] à la chaîne, et ensuite le diviser vous-même, comme vous le souhaitez. Vous pouvez utiliser des guillemets pour séparer la partie de chaîne de connexion des autres paires clé/valeur.

Ou si cela a du sens pour votre tâche personnalisée, alors peut-être que la chaîne de connexion est une propriété suffisamment spéciale pour avoir une propriété de tâche distincte.

8

Dans MSBuild 4.0, il existe maintenant Property Functions. Une chose que vous pouvez faire est d'appeler les méthodes d'instance .NET String directement sur vos propriétés comme si elles étaient des chaînes (ce qu'elles sont).

Dans votre exemple, au lieu d'utiliser:

$(ConnectionString) 

Vous pouvez utiliser:

$(ConnectionString.Replace(';', '%3B')) 

qui va appeler la méthode String Remplacer() pour remplacer des points-virgules avec% 3B

9

En MSBuild 4.0, vous pouvez utiliser $([MSBuild]::Escape($(ConnectionString))).

+1

Très utile! Et [voici un lien vers la documentation des fonctions de propriété] (http://msdn.microsoft.com/en-us/library/dd633440.aspx). –