2015-06-11 2 views
0

Я создаю пользовательскую задачу msbuild, которая будет обрабатывать конфигурацию из пользовательского XML-файла. Я хочу разрешить использовать атрибут Condition в этом XML-файле. Синтаксис этого атрибута должен совпадать с условиями MSBuild (https://msdn.microsoft.com/en-us/library/7szfhaft.aspx)Как вручную оценить состояние msbuild?

Как оценить значение этого атрибута? Есть ли существующая библиотека, которая автоматизирует это, или я вынужден написать собственный парсер?

До сих пор я был в состоянии только получить значения всех переменных, которые, вероятно, будет необходимо оценить, что условия (How to access the MSBuild 's properties list when coding a custom task?)

ответ

0

Я не уверен, если это будет полезно для вас. Я решал аналогичные проблемы C++-проектов. Я думал использовать класс Microsoft.Build.BuildEngine.Project, но позже передумал. Наконец, я создал мою конфигурацию в стиле msbuild (включая пространство имен). Я принудительно импортировал свой конфиг с помощью msbuild (я неправильно использовал свойство ForceImportAfterCppTargets). Msbuild оценил все для меня. Введенная в шахту конфигурация (или реквизит/целевой файл) содержала цель, которая была введена в процесс сборки, переопределив некоторое свойство сборки (на уровне проекта) так, как была вызвана моя цель. Mine custom target, называемый моей пользовательской задачей, передал все необходимые свойства и элементы по параметрам.


После содержания ответа на Уриэля 12 июн в 16:26:

Потому что вы пометили вопрос с тегом C# Я пытался сделать образец с C# против 2010

Я сделал образец действительно простой. Я поставил конфигурационный файл задачи и xml в один файл с именем my.props. Моя пользовательская задача просто печатает значения моей конфигурации, предоставляемые элементом. Он печатает метаданные элемента. Думаете, вам нужно вручную изменить ваш .csproj, добавив одну простую строку. После строки, где импортируется файл Microsoft.CSharp.targets, добавьте импорт пользовательского файла my.props. Этот пример ожидает, что ваш my.props находится в том же каталоге, что и .csproj. Diff изменить стиль: +

Содержание my.props:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<UsingTask TaskName="MyTool" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > 
    <ParameterGroup> 
    <Cfg ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> 
    </ParameterGroup> 
    <Task> 
    <Code Type="Fragment" Language="cs"> 
<![CDATA[ 
     if (Cfg.Length > 0) 
     { 
     for (int i = 0; i < Cfg.Length; ++i) 
     { 
      ITaskItem item = Cfg[i]; 
      string value1 = item.GetMetadata("Value1"); 
      string value2 = item.GetMetadata("Value2"); 
      Log.LogMessage(MessageImportance.High, "MyTool: {0} - {1}", value1, value2); 
     } 
     } 
]]> 
    </Code> 
    </Task> 
</UsingTask> 

<ItemDefinitionGroup Condition=" '$(Configuration)' == 'Release' "> 
    <MyConfig> 
     <Value1>Hello</Value1> 
    <Value2>World</Value2> 
    </MyConfig> 
</ItemDefinitionGroup> 

<ItemDefinitionGroup Condition=" '$(Configuration)' == 'Debug' "> 
    <MyConfig> 
     <Value1>Hello</Value1> 
    <Value2>Debug world</Value2> 
    </MyConfig> 
</ItemDefinitionGroup> 

<ItemGroup> 
    <MyConfig Include="MyCfg" /> 
</ItemGroup> 

    <Target Name="AfterBuild"> 
    <MyTool Cfg="@(MyConfig)" /> 
    </Target> 
</Project> 
+0

Ваше решение звучит интересно. Не могли бы вы предоставить рабочий образец проекта? – cezarypiatek

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