我正在创建一个自定义的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?)
答案 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>