В Rails вы можете использовать String#squish
, который является active_support
расширением.
require 'active_support'
s = <<-EOS
1/2 cup
onion
EOS
s.squish
# => 1/2 cup onion
Вот фактический пример, который я собрал, который показывает то, что вы искали:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test" ToolsVersion="3.5">
<!--Declare an ItemGroup that points to your file you want to copy.-->
<ItemGroup>
<ItemToCopy Include=".\Home.aspx" />
</ItemGroup>
<!--Declare an ItemGroup that points to your destination Locations-->
<ItemGroup>
<DestLocations Include=".\abc\home.aspx" />
<DestLocations Include=".\def\home.aspx" />
<DestLocations Include=".\ghi\home.aspx" />
</ItemGroup>
<Target Name="CopyFiles">
<!--Run the copy command to copy the item to your dest locations-->
<!--This is where the magic happens. The % sign before the DestLocations reference says to use
Batching. So Copy will be run for each unique FullPath MetaData in the DestLocations ItemGroup.-->
<Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DestLocations.FullPath)" />
</Target>
</Project>
Концепция, которая должна вас заинтересовать, известна как Пакетная обработка .
] Я описал этот точный сценарий в своем блоге по адресу http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx
Вот текст этого блога запись, вы можете скачать упомянутые файлы по ссылке выше.
Сегодня кто-то рассказывал мне о коллеге, у которого были проблемы с MSBuild. Он сказал мне, что пытался скопировать набор файлов на набор разных серверов. Но проблема заключалась в том, что он не знал, как добиться этого, не выполняя несколько вызовов задачи копирования. Я сказал ему, что он может добиться этого с помощью MSBuild Batching. Пакетная обработка - это процесс выполнения задачи (или цели) над набором элементов (пакетов) за раз. Партия также может включать в себя один товар. Итак, в этом сценарии нам нужно выполнить копию один раз для каждого сервера, на котором он хотел развернуть. Я создал простой файл msbuild, который демонстрирует это двумя разными способами. Первый способ использует пакетирование задач, которое можно увидеть в тестовой цели. А другой использует целевое пакетирование, которое можно увидеть в цели DoItCore. Я также создал чистую цель, которая не имеет ничего общего с пакетной обработкой.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test">
<ItemGroup>
<SourceFiles Include="*.txt"/>
<Dest Include="One;Two;Three;Four;Five"/>
</ItemGroup>
<Target Name="Test">
<Copy SourceFiles ="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
<Message Text="Fullpath: %(Dest.FullPath)"/>
</Target>
<!-- These targets demonstrate target batching -->
<Target Name="DoIt" DependsOnTargets="DoItCore"/>
<Target Name="DoItCore" Inputs="@(SourceFiles)" Outputs="%(Dest.FullPath)">
<Copy SourceFiles="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
</Target>
<!-- This will clean up the files -->
<Target Name="Clean">
<CreateItem Include="%(Dest.FullPath)\**\*">
<Output ItemName="FilesToDelete" TaskParameter="Include"/>
</CreateItem>
<Delete Files="@(FilesToDelete)"/>
</Target>
</Project>
Пакетная обработка - это сложная тема MSBuild, которой полностью пренебрегают. Я должен признать, что виноват в том, что сам недостаточно писал об этом. Саид Ибрагим Хашими
Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build
Have an itemgroup where you build up this list of destinations ("
I'm sure you'll find plenty of examples if you search for it. http://keithhill.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3dMSBuild
You really are best off doing this yourself as a learning exercise, rather than treating MSBUILD as a magic box. This article from Patrick Smacchia gives you most of the techniques involved.