2014-01-30 4 views
2

Я застрял в следующем выпуске, который у меня есть в MSBuild. У меня есть текстовый файл (buildsolutions1.txt), содержащий список (строка за строкой) со всеми решениями, которые мне нужно построить, и связанными с ними сообщениями разработчиков, разделенными запятой:Прочтите текстовый файл и разделите каждую строку в MSBuild

Common \ Common.sln, am @ email, com
ExcGw/ExcDataService.sln, pm @ email.com; am @ email, com; [email protected]; [email protected]; [email protected]
MessB/MessB/Message.sln, am @ email, com RiskS/RiskS2.sln, jp @ email.com; [email protected]; [email protected]; [email protected]; [email protected]

Мне нужно прочитать эту строку файла по отдельности, скомпилировать каждое решение, а в случае его отказа - отправить электронную почту связанным разработчикам (-ам)

Моя идея - создать группу элементов Линии, где каждый элемент является строкой из этого файла и имеет 2 значения метаданных: Решение - первая часть строки до запятой Письма - вторая часть строки от запятой до конец строки

Итак, я создал группу свойств и целевые ReadSolutions, как показано ниже.

Я прочитал файл построчно, но я не знаю, как установить метаданные для каждой позиции:
FirstPartOfTheCurrentLine (% (LinesFromFile.Identity))
SecondPartOfTheCurrentLine (% (LinesFromFile.Identity))

Этот синтаксис не работает:
% (LinesFromFile.Identity.Split (' ') [0])
% (LinesFromFile.Identity.Split (',') [1])

Возможно, кто-то k теперь, как правильно установить метаданные или, возможно, имеет другой подход к этой задаче. Благодаря

Вот код:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0" DefaultTargets="CoreBuild"> 

    <PropertyGroup> 
    <TPath>$(MSBuildProjectDirectory)\..\tools\MSBuild Extension Pack Binaries\MSBuild.ExtensionPack.tasks</TPath> 
    </PropertyGroup> 
    <Import Project="$(TPath)"/> 

<PropertyGroup> 
    <!-- Default working folder --> 
    <RootFolder Condition=" '$(RootFolder)' == '' " >c:\ff\</RootFolder> 
    <BuildSolutionsFile >buildsolutions1.txt</BuildSolutionsFile> 
    <BuildSolutionsFileFullPath >$(RootFolder)$(BuildSolutionsFile)</BuildSolutionsFileFullPath> 
</PropertyGroup> 


<Target Name="ReadSolutions"> 
    <Message Text=" Build solutions text file is : $(BuildSolutionsFileFullPath)" /> 

    <!—Read the file and store each line as an item into LinesFromFile item group--> 
    <ReadLinesFromFile 
    File="$(BuildSolutionsFileFullPath)" > 
    <Output 
     TaskParameter="Lines" 
     ItemName="LinesFromFile"/> 
    </ReadLinesFromFile> 

    <Message Text="Current line : %(LinesFromFile.Identity)" /> 
    <Message Text="===================================" /> 

    <!—Create the other item group where each item is a line and has the metadata Solution and Emails --> 

    <ItemGroup> 
    <Lines Include="%(LinesFromFile.Identity)" > 
     <Solution>FirstPartOfTheCurrentLine(%(LinesFromFile.Identity))</Solution> 
     <Emails>SecondPartOfTheCurrentLine(%(LinesFromFile.Identity)) </Emails> 

    </Lines> 

    </ItemGroup> 


    <Message Text="All the Lines :%[email protected](Lines,'%0A')" /> 



</Target> 

ответ

6

Вот данные, которые я работал с:

Common\Common.sln,[email protected],com 
ExcGw/ExcDataService.sln,[email protected];[email protected],com;[email protected];[email protected];[email protected] 
MessB/MessB/Message.sln,[email protected],com 
RiskS/RiskS2.sln,[email protected];[email protected];[email protected];[email protected];[email protected] 

слегка модифицирована ваш образец включить разрыв строки для четвертого решения.

Вот измененный код:

<ItemGroup> 
    <Lines Include="@(LinesFromFile)" > 
     <Solution>$([System.String]::Copy('%(LinesFromFile.Identity)').Split(',')[0])</Solution> 
     <Emails>$([System.String]::Copy('%(LinesFromFile.Identity)').Split(',')[1])</Emails> 
    </Lines> 
</ItemGroup> 
<Message Text="Solutions to Emails-> %(Lines.Solution) -> %(Lines.Emails)" /> 

Мы скопировав значение свойства таким образом, мы можем использовать функцию свойства, чтобы разделить стоимость и получить часть нам нужно.

Вот результат:

Solutions to Emails-> Common\Common.sln -> [email protected] 
Solutions to Emails-> ExcGw/ExcDataService.sln -> [email protected];[email protected] 
Solutions to Emails-> MessB/MessB/Message.sln -> [email protected] 
Solutions to Emails-> RiskS/RiskS2.sln -> [email protected];[email protected];[email protected];[email protected];[email protected] 
+0

Вы жизнь спасителя, спасибо !!! Я бы не догадался, как это в год :-) Так что трюк нужно скопировать. значение предмета в свойство, а затем разделить его. – Teognost

+0

Да. Я попытался использовать подстроку, но вам также нужно было бы выложить вышеуказанные вызовы, чтобы установить индекс, и это было довольно непроницаемо :) – Nicodemeus

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