2010-10-23 3 views
2

j'ai liste des articles comme celui-ci:MSBuild: chemins de transformation pour les espaces de noms

<ItemGroup> 
    <ToCompile Include="clojure\core.clj;clojure\set.clj;clojure\zip.clj;clojure\test\junit.clj;"/> 
</ItemGroup> 

Et je veux transformer ce à une liste d'articles comme celui-ci:

 
clojure.core clojure.set clojure.zip clojure.test.junit 

est-il un moyen de faire cela avec les transformations MSBuild? J'ai essayé mais je peux seulement obtenir au nom de dossier; l'extension et le chemin de la racine, et je peux changer le séparateur. Mais pas les séparateurs de chemin. Dans le cas contraire, toute autre solution qui évite d'utiliser des tâches personnalisées est appréciée.

+0

Vous pouvez écrire une tâche personnalisée dans une fabrique de tâches PowerShell, ce qui est beaucoup plus simple qu'une tâche C# complète dans sa propre Assemblée. Je les recommande pour de très petites tâches seulement, cependant. Voir: http://blogs.msdn.com/b/visualstudio/archive/2010/02/20/msbuild-task-factories-guest-starring-windows-powershell.aspx –

+0

Ouais, merci. Cela aurait été ma solution de sauvegarde, mais celui ci-dessous (bien que cheesy :) est beaucoup moins compliqué. –

Répondre

1

C'est un peu ringard, mais cela fonctionne dans MSBuild 4.0+.

<Target Name="Namespaces"> 
    <PropertyGroup> 
    <Cheesy>@(ToCompile -> '%(relativedir)%(filename)', ' ')</Cheesy> 
    </PropertyGroup> 
    <Message Text="$(Cheesy.Replace(`\`, `.`))" /> 
</Target> 
3

Nous pouvons le faire facilement avec moins de fromage:

< message Text = "$ ([System.String] :: Copy ('% (ToCompile.Identity)') REPLACE (». Remplacer ('\', '.')) "/ >

+0

Merci, cela semble plus facile en effet. Mais pourquoi la copie? –

+0

Je crois que vous ne pouvez pas utiliser la référence de chaîne '% (ToCompile.Identity)' pour appeler '.Replace', donc vous devez utiliser la méthode statique' Copy' pour créer une référence où '.Replace' peut être utilisé. – Mike

Questions connexes