调用MSBuild将一个任务传递给它

时间:2015-06-01 15:37:04

标签: msbuild csproj

我们可以在csproj文件中定义目标,然后在从命令行调用msbuild时指定该目标。看起来像这样:

my.csproj

<Target Name="CopyFiles">
    <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFolder="c:\MyProject\Destination" />
</Target>

msbuild

msbuild my.csproj /t:CopyFiles

CopyFiles目标要求msbuild运行Copy任务。

如果我们不想编辑csproj文件,该怎么办?我们如何仅从命令行定义目标?或者,仅使用命令行,我们如何让msbuild只运行一个或两个任务?

伪代码

msbuild my.csproj /t:"Copy SourceFiles=@(MySourceFiles) DestinationFolder=..."

1 个答案:

答案 0 :(得分:2)

基于MSBuild Command-Line Reference,这与您描述的完全不可能,即MSBuild不会从命令行输入中获取目标定义。它们必须在某个文件中定义。

但是,你可以有一个脚本(甚至可能是.bat?),它可以做类似的事情:

  1. 创建一个新的,基本上为空的项目文件。
  2. 使用.csproj
  3. 导入<Import Project="foo.csproj" />
  4. 添加目标
  5. 使用包含所需目标的新项目文件调用MSBuild。多个/t:开关可以指定多个目标。可以使用/p:
  6. 指定属性

    最终的,以编程方式/脚本生成的项目文件可能如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="foo.csproj" />
      <Target Name="CopyFiles">
      <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFolder="$(Destination)" />
      </Target>
    </Project>
    

    调用的实际MSBuild命令可能是:

    msbuild temp.proj /t:CopyFiles /p:"Destination=c:\MyProject\Destination"