Запрос определений сборки с определенным настраиваемым аргументом
Мне нужна помощь с SQL-запросом, который вернет список определений сборки, в которых есть определенный пользовательский аргумент.
Я натолкнулся на этот запрос, но у меня возникли некоторые затруднения с выяснением, как углубляться дальше.
;WITH XMLNAMESPACES('clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow' AS mtbwa,
DEFAULT 'clr-namespace:System.Collections.Generic;assembly=mscorlib'),
q AS (
SELECT CAST(bd.ProcessParameters AS XML) p
FROM dbo.tbl_BuildDefinition bd
)
SELECT
X.Doc.query('mtbwa:BuildSettings') AS 'Node',
X.Doc.value('(mtbwa:BuildSettings/@ProjectsToBuild)[1]', 'VARCHAR(100)') AS 'ProjectsToBuild'
FROM q
CROSS APPLY p.nodes('/Dictionary') AS X(Doc)
Вот пример XML, возвращенного этим запросом:
<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<mtbwa:BuildSettings x:Key="BuildSettings" ProjectsToBuild="$/ACME/Dev/v1.0.0/Source/ACME/ACME.sln">
<mtbwa:BuildSettings.PlatformConfigurations>
<mtbwa:PlatformConfigurationList Capacity="1">
<mtbwa:PlatformConfiguration Configuration="ACMS Website" Platform="Any CPU" />
</mtbwa:PlatformConfigurationList>
</mtbwa:BuildSettings.PlatformConfigurations>
</mtbwa:BuildSettings>
<mtbwa:TestSpecList x:Key="TestSpecs" Capacity="1">
<mtbwa:TestAssemblySpec MSTestCommandLineArgs="{x:Null}" TestSettingsFileName="{x:Null}" AssemblyFileSpec="**\*test*.dll" CategoryFilter="!CodedUITest" />
</mtbwa:TestSpecList>
<mtbwa:SourceAndSymbolServerSettings x:Key="SourceAndSymbolServerSettings" SymbolStorePath="\\ACME.com\dfs\USA\AppDev\TeamBuild\Symbols" />
<mtbwa:AgentSettings x:Key="AgentSettings" MaxWaitTime="04:00:00" Name="*" Tags="" />
<x:Boolean x:Key="SCA">False</x:Boolean>
<x:String x:Key="SSCProjectVersion">ACME v1.0.0</x:String>
</Dictionary>
Я пытаюсь добраться до <x:Boolean x:Key="SCA">False</x:Boolean>
часть возвращенного XML. Любые идеи о том, как я могу это сделать, всегда приветствуются.
РЕШЕНИЕ
Кредит идет к jessehouwing за предложение.
TfsTeamProjectCollection server = new TfsTeamProjectCollection(new Uri("http://acmetfs:8080/tfs"));
server.EnsureAuthenticated();
IBuildServer build = (IBuildServer)server.GetService(typeof(IBuildServer));
IBuildDefinition buildDefinition = build.GetBuildDefinition("ACME", "ACME_v1.0.0");
object argumentValue;
if (WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters).TryGetValue("SCA", out argumentValue))
{
Console.WriteLine(argumentValue);
}
1 ответ
ПРЕДУПРЕЖДЕНИЕ
Непосредственный запрос оперативных хранилищ данных TFS не рекомендуется, и содержимое этих полей может изменяться между выпусками и даже исправлениями без предварительного уведомления. Официальный способ сделать это - использовать объектную модель клиента. Любые изменения, которые вы случайно вносите в данные, оставят ваш сервер в неподдерживаемом состоянии.
Клиентская объектная модель TFS предоставляет относительно простой API для запроса определений сборки. И оттуда вы можете использовать стандартные классы.NET XML (либо Linq-2-XML, либо стандартный XPathNavigator), чтобы быстро получить нужную вам информацию. Параметр, который вы ищете, может даже храниться в метаданных сборки.
Это приведет к следующему коду (как предусмотрено OP):
TfsTeamProjectCollection server = new TfsTeamProjectCollection(new Uri("http://acmetfs:8080/tfs"));
server.EnsureAuthenticated();
IBuildServer build = (IBuildServer)server.GetService(typeof(IBuildServer));
IBuildDefinition buildDefinition = build.GetBuildDefinition("ACME", "ACME_v1.0.0");
object argumentValue;
if (WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters).TryGetValue("SCA", out argumentValue))
{
Console.WriteLine(argumentValue);
}