如何手动评估msbuild条件?

时间:2015-06-11 17:00:07

标签: c# .net msbuild

我正在创建一个自定义的msbuild任务,该任务将处理来自自定义XML文件的配置。我想允许在该xml文件中使用Condition属性。该属性的语法应与MSBuild条件(https://msdn.microsoft.com/en-us/library/7szfhaft.aspx

相同

如何评估该属性的值?是否有现有的库自动执行该操作,或者我被迫编写自己的解析器?

到目前为止,我只能获得评估这些条件可能需要的所有变量的值(How to access the MSBuild 's properties list when coding a custom task?

1 个答案:

答案 0 :(得分:0)

我不确定这对你有帮助。我正在解决类似问题的c ++项目。我当时正在考虑使用Microsoft.Build.BuildEngine.Project类,但后来改变了主意。最后我用msbuild样式创建了我的配置(包括命名空间)。我已经强制通过msbuild导入我的配置(我误用了ForceImportAfterCppTargets属性)。 Msbuild为我评估了一切。我注入的配置(或道具/目标文件)包含通过覆盖一些构建属性(在项目级别)以我的目标被调用的方式注入到构建过程中的目标。我的自定义目标称为我的自定义任务,并通过参数传递所有必需的属性和项目。

以下内容是对Uriel Jun 12 16:26的回复:

因为您已使用标记c#标记了问题,我尝试使用C#vs 2010进行示例。

我制作的样本非常简单。我将task和xml配置文件放入一个名为my.props的文件中。我的自定义任务只打印由item提供的配置值。它打印项目的元数据。 有人认为您需要做的是通过添加一条简单的行来手动修改.csproj。在导入Microsoft.CSharp.targets的行之后添加自定义my.props文件的导入。 此示例期望您的my.props与.csproj位于同一目录中。 差异样式变化:          +

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>