2010-10-23 2 views
2

у меня есть список элементов, как это:MSBuild: преобразование пути в пространствах имен

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

И я хочу, чтобы преобразовать, что в список предметов, как это:

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

Есть ли способ делать это с преобразованиями MSBuild? Я пробовал, но могу получить только имя файла; расширение и корневой путь, и я могу изменить разделитель. Но не разделители путей.

Если нет, то любое другое решение, которое позволяет избежать использования пользовательских задач, оценивается.

+0

Вы можете написать пользовательскую задачу на фабрике задач powershell, которая желает намного проще, чем полная задача C# в своей собственной сборка. Однако я рекомендую их только для очень маленьких задач. См. Http://blogs.msdn.com/b/visualstudio/archive/2010/02/20/msbuild-task-factories-guest-starring-windows-powershell.aspx –

+0

Да, спасибо. Это было бы моим резервным решением, но одно ниже (хотя и дрянное :) - это гораздо меньше хлопот. –

ответ

1

Это немного дрянной, но он работает в MSBuild 4.0+.

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

Мы можем сделать это легко с меньшим количеством сыра:

< сообщения Text = "$ ([System.String] :: Copy ('% (ToCompile.Identity)') Заменить (». .clj ',' '). Заменить (' \ ','. ')) "/ >

+0

Спасибо, это выглядит просто. Но почему копия? –

+0

Я считаю, что вы не можете использовать строковую ссылку '% (ToCompile.Identity) для вызова' .Replace', поэтому вам нужно использовать статический метод 'Copy' для создания ссылки, в которой может использоваться' .Replace'. – Mike

Смежные вопросы