有没有办法列出构建文件中所有可用的构建目标? [英] Is there a way to list all the build targets available in a build file?

查看:90
本文介绍了有没有办法列出构建文件中所有可用的构建目标?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出一个构建文件(.csproj或msbuild.xml或其他文件),我想运行一个msbuild命令,其中列出了所有可用的已定义目标.

Given a build file (.csproj or msbuild.xml or whatever), I'd like to run a msbuild command that lists all the available, defined targets.

该功能存在吗?

我知道我可以在构建文件上执行Xpath搜索或类似的操作,但是找不到包含文件中定义的目标.

I know I could do an Xpath search or something, on the build file, but that wouldn't find targets that are defined in included files.

推荐答案

使用MSBuild 2.0/3.5:自定义任务

您可以编写这样的自定义msbuild任务:

Using MSBuild 2.0/3.5 : Custom Task

You could write a custom msbuild task like this :

using System;
using System.Collections.Generic;
using Microsoft.Build.BuildEngine;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace MSBuildTasks
{
  public class GetAllTargets : Task
  {
    [Required]
    public String ProjectFile { get; set; }

    [Output]
    public ITaskItem[] Targets { get; set; }

    public override bool Execute()
    {
      var project = new Project(BuildEngine as Engine);
      project.Load(ProjectFile);

      var taskItems = new List<ITaskItem>(project.Targets.Count);
      foreach (Target target in project.Targets)
      {
        var metadata = new Dictionary<string, string>
                        {
                          {"Condition", target.Condition},
                          {"Inputs", target.Inputs},
                          {"Outputs", target.Outputs},
                          {"DependsOnTargets", target.DependsOnTargets}
                        };
        taskItems.Add(new TaskItem(target.Name, metadata));
      }

      Targets = taskItems.ToArray();

      return true;
    }
  }
}    

您将这样使用:

<Target Name="TestGetAllTargets">
  <GetAllTargets ProjectFile="$(MSBuildProjectFile)">
    <Output ItemName="TargetItems" TaskParameter="Targets"/>
  </GetAllTargets>

  <Message Text="Name: %(TargetItems.Identity) Input: %(TargetItems.Input) --> Output: %(TargetItems.Output)"/>
</Target>

使用MSBuild 4.0:内联任务

使用MSBuild 4,您可以使用新的亮点:内联任务.内联任务允许您直接在msbuild文件中定义行为.

Using MSBuild 4.0 : Inline task

With MSBuild 4 you could use the new shiny thing : the inline task. Inline task allows you to define the behavior directly in msbuild file.

<UsingTask TaskName="GetAllTargets"
           TaskFactory="CodeTaskFactory"
           AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
  <ParameterGroup>
    <ProjectFile ParameterType="System.String" Required="true"/>
    <TargetsOut ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/>
  </ParameterGroup>
  <Task>
    <Reference Include="System.Xml"/>
    <Reference Include="Microsoft.Build"/>
    <Reference Include="Microsoft.Build.Framework"/>
    <Using Namespace="Microsoft.Build.Evaluation"/>
    <Using Namespace="Microsoft.Build.Execution"/>
    <Using Namespace="Microsoft.Build.Utilities"/>
    <Using Namespace="Microsoft.Build.Framework"/>
    <Code Type="Fragment" Language="cs">
      <![CDATA[
        var project = new Project(ProjectFile);

        var taskItems = new List<ITaskItem>(project.Targets.Count);
        foreach (KeyValuePair<string, ProjectTargetInstance> kvp in project.Targets)
        {
          var target = kvp.Value;
          var metadata = new Dictionary<string, string>
                          {
                            {"Condition", target.Condition},
                            {"Inputs", target.Inputs},
                            {"Outputs", target.Outputs},
                            {"DependsOnTargets", target.DependsOnTargets}
                          };
          taskItems.Add(new TaskItem(kvp.Key, metadata));
        }

        TargetsOut = taskItems.ToArray();
      ]]>
    </Code>
  </Task>
</UsingTask>

<Target Name="Test">
  <GetAllTargets ProjectFile="$(MSBuildProjectFile)">
    <Output ItemName="TargetItems" TaskParameter="TargetsOut"/>  
  </GetAllTargets>

  <Message Text="%(TargetItems.Identity)"/>
</Target>

这篇关于有没有办法列出构建文件中所有可用的构建目标?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆