Ответ 1
Функции свойств MSBuild 4.0 не могут обрабатывать массивы (ну в основном), однако, когда вы делаете
Split(',', '-')
Вы вызываете String.Split(params string[])
, для которой требуется массив (даже в С# ключевое слово params
создаст массив позади сцены и сделает что-то вроде Split(new string[] { ',', '-' })
внутренне).
Что вы могли бы сделать, это следующее:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0">
<PropertyGroup>
<MasterVersion>1.1-SNAPSHOT</MasterVersion>
</PropertyGroup>
<ItemGroup>
<SplitVersion Include="$(MasterVersion.Replace('-', '.').Split('.'))" />
</ItemGroup>
<Target Name="Test">
<Message Importance="high" Text="@(SplitVersion)"/>
</Target>
</Project>
Или вы можете сначала создать массив (string) для передачи в Split:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<MasterVersion>1.1-SNAPSHOT</MasterVersion>
<Delimiters>.;-</Delimiters>
<DelimitersArray>$(Delimiters.Split(';'))</DelimitersArray>
</PropertyGroup>
<ItemGroup>
<SplitVersion Include="$(MasterVersion.Split($(DelimitersArray)))" />
</ItemGroup>
<Target Name="Test">
<Message Importance="high" Text="@(SplitVersion)"/>
</Target>
</Project>
Что не очень лучше в этом случае ;-)
О, и вы можете проверить эту запись в блоге MSDN для получения более полезной информации.
Обновление для комментария:
-
"Содержимое"
SplitVersion
технически является "массивом ITaskItem", да. Вы будете иметь дело с этим, однако вы будете иметь дело с Предметами (из ItemGroups); включая такие вещи, как "пакетирование" и т.д. -
Вы не можете действительно "получить доступ к индексам" в файлах проекта msbuild. Такие выражения, как
$(SplitVersion)[0]
или@(SplitVersion)[0]
или@(SplitVersion[0])
, не выполняют то, что вы думаете или хотели бы. Если вы действительно хотите, вы можете назначить отдельные свойства для "элементов массива" по "индексу".
Пример:
<PropertyGroup>
<SplitVersion0>$(MasterVersion.Split($(DelimitersArray))[0])</SplitVersion0>
<SplitVersion1>$(MasterVersion.Split($(DelimitersArray))[1])</SplitVersion1>
<SplitVersion2>$(MasterVersion.Split($(DelimitersArray))[2])</SplitVersion2>
</PropertyGroup>
Здесь работает оператор индексирования массива, потому что в этом случае вы все еще находитесь "в контексте" выражения .NET. Как только это будет присвоено свойству (или группе товаров), вы больше не сможете этого делать.