Msbuild批处理任务输出

时间:2014-05-14 08:22:20

标签: msbuild

我为项目提供了几个解决方案(插件),为每个解决方案定义了元数据范围

<ItemGroup>
    <Plugins Include="Plugin1\Plugin1.sln">
            <Disabled>false</Disabled>
            <ProjectDirectory>plugin1\</ProjectDirectory>
            <ProjectName>Plugin1</ProjectName>
    </Plugins>
    <Plugins Include="Plugin2\Plugin2.sln">
            <Disabled>true</Disabled>
            <ProjectDirectory>plugin2\</ProjectDirectory>
            <ProjectName>Plugin2</ProjectName>
    </Plugins>
    <Plugins Include="Plugin3\Plugin3.sln">
            <Disabled>false</Disabled>
            <ProjectDirectory>plugin3\</ProjectDirectory>
            <ProjectName>Plugin3</ProjectName>
    </Plugins>
</ItemGroup>

我需要通过运行自己的构建脚本来构建非Disabled插件,并将结果目录添加到Plugins元数据以进行后续处理(例如:将每个插件构建输出复制到自己的文件夹)。

但我无法找到连接它的方法。

低于我的目标:

<Target Name="BuildPlugin" Inputs="%(Plugins.Identity)" Outputs="%(Plugins.Identity -> %(PluginOutput.Identity))" Returns="%(PluginOutput.Identity)">
    <MSBuild 
        Condition="!%(Disabled)"
        Projects='%(ProjectDirectory)BuildProject.target'
        Targets="Clean;Build;" >
            <Output ItemName="PluginOutput" TaskParameter="TargetOutputs"/>
    </MSBuild>

    <ItemGroup>
        <Plugins Condition="%(ProjectName)=%(Plugins.ProjectName)">
            <PluginOutput>%(PluginOutput.Identity)</PluginOutput>
        </Plugins>
    </ItemGroup>

    <Message Text="%(Plugins.ProjectName) %(PluginOutput.Identity)"  Condition="%(Plugins.Disabled)" />
</Target>

BuildProject.target返回输出目录(例如:Plugin1\Plugin1\bin\Release\

在这种情况下,buuilding失败并出现下一个错误:

  

错误MSB4096:项目列表&#34; PluginOutput&#34;没有为...定义值   元数据&#34; ProjectName&#34;。要使用此元数据,要么符合条件   它通过指定%(PluginOutput.ProjectName),或确保所有项目   在此列表中定义此元数据的值。

     

错误MSB4113:指定条件&#34;%(Plugins.Disabled)&#34;评估为   &#34;&#34;而不是布尔值。

但是如果删除ItemGroup任务的Message和条件

<Target Name="BuildPlugin" Inputs="%(Plugins.Identity)" Outputs="%(Plugins.Identity -> %(PluginOutput.Identity))" Returns="%(PluginOutput.Identity)">
    <MSBuild 
        Condition="!%(Disabled)"
        Projects='%(ProjectDirectory)BuildProject.target'
        Targets="Clean;Build;" >
            <Output ItemName="PluginOutput" TaskParameter="TargetOutputs"/>
    </MSBuild>

    <Message Text="%(Plugins.ProjectName) %(PluginOutput.Identity)"  />
</Target>

似乎msbuild正确批量插件。 BuildPlugin任务生成的Message目标输出是:

 BuildPlugin:
   Plugin1
     Plugin1\Plugin1\bin\Release\ 
 BuildPlugin:
   Plugin2
 BuildPlugin:  
   Plugin3
     Plugin3\Plugin3\bin\Release

但在这种情况下,我无法过滤禁用的插件并将插件输出文件夹添加到元数据中。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我无法测试所有步骤,因为缺少BuildProject.target,但这应该有效:

<Target  Name="BuildPlugin"
     Inputs="%(Plugins.Identity)"
     Outputs="%(Plugins.Identity)\dummy.txt"
     Returns="%(PluginOutput.Identity)">

 <PropertyGroup> <!-- transform Metadata to Properties -->
   <ProjectName>%(Plugins.ProjectName)</ProjectName>
   <PluginDisabled>%(Plugins.Disabled)</PluginDisabled>
 </PropertyGroup>

 <MSBuild
     Condition="'$(PluginDisabled)' != 'true'"
     Projects='%(Plugins.ProjectDirectory)BuildProject.target'
     Targets="Clean;Build;" >
   <Output ItemName="PluginOutput" TaskParameter="TargetOutputs"/>
 </MSBuild>

 <ItemGroup>
    <!-- batching 2 ItemGroups in one task is usually not working or creates side effects-->
   <Plugins Condition="'%(PluginOutput.ProjectName)' == '$(ProjectName)'">
     <PluginOutput>%(PluginOutput.Identity)</PluginOutput>
   </Plugins>
 </ItemGroup>

   <!-- batching 2 ItemGroups in one task is usually not working or creates side effects-->
 <Message Text="$(ProjectName) %(PluginOutput.Identity)"  Condition="$(PluginDisabled)" />
</Target>