Msbuild 是否有方法列出生成文件中可用的所有生成目标?

Msbuild 是否有方法列出生成文件中可用的所有生成目标?,msbuild,Msbuild,给定生成文件(.csproj或msbuild.xml或其他任何文件),我希望运行一个msbuild命令,列出所有可用的已定义目标 这个功能存在吗 我知道我可以对构建文件执行Xpath搜索或其他操作,但这不会找到包含文件中定义的目标 使用MSBuild 2.0/3.5:自定义任务 您可以编写如下自定义msbuild任务: using System; using System.Collections.Generic; using Microsoft.Build.BuildEngine; using

给定生成文件(.csproj或msbuild.xml或其他任何文件),我希望运行一个msbuild命令,列出所有可用的已定义目标

这个功能存在吗

我知道我可以对构建文件执行Xpath搜索或其他操作,但这不会找到包含文件中定义的目标

使用MSBuild 2.0/3.5:自定义任务 您可以编写如下自定义msbuild任务:

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;
    }
  }
}    
使用系统;
使用System.Collections.Generic;
使用Microsoft.Build.BuildEngine;
使用Microsoft.Build.Framework;
使用Microsoft.Build.Utilities;
命名空间MSBuildTasks
{
公共类GetAllTargets:任务
{
[必需]
公共字符串项目文件{get;set;}
[输出]
公共ITaskItem[]目标{get;set;}
公共重写bool Execute()
{
var项目=新项目(BuildEngine作为引擎);
project.Load(ProjectFile);
var taskItems=新列表(project.Targets.Count);
foreach(project.Targets中的目标)
{
var元数据=新字典
{
{“条件”,target.Condition},
{“Inputs”,target.Inputs},
{“Outputs”,target.Outputs},
{“DependsOnTargets”,target.DependsOnTargets}
};
添加(新任务项(target.Name,元数据));
}
Targets=taskItems.ToArray();
返回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文件中定义行为

<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>


(项目。目标。计数);
foreach(project.Targets中的KeyValuePair kvp)
{
var目标=kvp.值;
var元数据=新字典
{
{“条件”,target.Condition},
{“Inputs”,target.Inputs},
{“Outputs”,target.Outputs},
{“DependsOnTargets”,target.DependsOnTargets}
};
添加(新任务项(kvp.Key,元数据));
}
TargetsOut=taskItems.ToArray();
]]>


从Visual Studio 16.6 preview 1开始,这是在MSBuild中实现的

用法示例:
msbuild myProject.proj-目标

这应该与VisualStudio16.6预览版1一起推出(在将来的某个时候)

(来源:)

文件:

-targets[:file]
                 Prints a list of available targets without executing the
                 actual build process. By default the output is written to
                 the console window. If the path to an output file
                 is provided that will be used instead.
                 (Short form: -ts)
                 Example:
                   -ts:out.txt

也许是复制品?接近!我真的很想从msbuild本身开始。我想答案是否定的。你可以在PowerShell脚本中执行上面提到的代码。是的,这是真的。编写脚本并不困难。要使用它,您应该打开terminal并编写下一步:
msbuild Solution\Project.csproj-targets
有办法列出任务吗?