Функции свойств MSBuild 4.0 не могут обрабатывать массивы (в основном), однако, когда вы делаете
Split(`,`, `-`)
Вы вызываете перегрузку String.Split(params string[])
, для которой требуется массив (даже в C# ключевое слово 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>
Или вы можете сначала создать (строковый) массив для передачи в 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», да. Вы будете иметь дело с этим, однако вы будете иметь дело с элементами (групп элементов); включая такие вещи, как «пакетирование» и т. д.
Вы не можете получить доступ к вещам по индексу в файлах проекта 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. Как только это назначено свойству (или группе элементов), вы больше не можете этого делать.
person
Christian.K
schedule
17.01.2012