如何从多个源文件创建MSBuild内联任务

7

我有几个CS文件(一个DLL项目),都在同一个目录下,其中一个类扩展了ITask。现在,有关如何从一个源文件创建内联任务的方法是易于操作并有文档记录的,但是否可以从多个源文件中执行此操作呢?我无法编译和使用DLL作为任务,而且我宁愿不把所有源代码塞到一个大文件中。

我希望实现以下目标:

<UsingTask TaskName="foo" TaskFactory="CodeTaskFactory" AssemblyFile="Microsoft.Build.Tasks.v4.0.dll">
  <Task>
    <Code Type="Class" Language="cs" Source="mydir\*.cs"/>
  </Task>
</UsingTask>

为什么你无法编译和使用dll?因为这应该可以工作(使用Cs任务),并且似乎是正确的解决方案。 - stijn
我现在的情况是,虽然我已经有了一个任务,但我希望能够轻松地更改它。如果我只有一个DLL(最好不要将其检入版本控制系统),那么更改源代码并提交二进制DLL就会非常麻烦。另一个混合选项(我可能会采用)是将任务的源代码作为一个项目保存在版本控制系统中,在我的项目中使用任务DLL时只需引用任务项目,并知道DLL将落在哪里并执行<UsingTask>。我考虑将所有内容都保存在源代码中。 - stalker314314
我的观点是,你应该将源代码和 msbuild 文件等放在版本控制系统中,并在调用 msbuild 文件的同时构建 dll,然后在同一个构建文件(或任何其他构建文件)中使用它。这是两全其美的最佳选择,也很好展示:P - stijn
1个回答

9

既然没有其他答案,我来提供一个完整的示例,演示如何像评论中讨论的那样从任意数量的源文件构建dll。这里有两个源文件:

sometask.cs:

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Bar;

namespace Foo
{
  public class CustomTask : Task
  {
    public override bool Execute()
    {
      Log.LogWarning( LogString.Get() );
      return true;
    }
  }
}

sometask_impl.cs:

namespace Bar
{
  public static class LogString
  {
    public static string Get()
    {
      return "task impl";
    }
  }
}

同时,msbuild文件中有一个目标使用了Foo.CustomTask,但是要先构建它:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="MyBuild">

  <PropertyGroup>
    <SomeTaskDll>SomeTask.dll</SomeTaskDll>
  </PropertyGroup>

  <Target Name="BuildSomeTaskDll">
    <Csc Sources="$(MSBuildThisFileDirectory)sometask*.cs"
         References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll"
         TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)$(SomeTaskDll)"/>
  </Target>

  <UsingTask TaskName="Foo.CustomTask" AssemblyFile="$(SomeTaskDll)"/>

  <Target Name="MyBuild" DependsOnTargets="BuildSomeTaskDll">
    <Foo.CustomTask />
  </Target>

</Project>

相关的输出:

> msbuild sometask.targets
Project sometask.targets on node 1 (default targets).
BuildSomeTaskDll:
<here it's building SomeTask.dll>

sometask.targets(17,5): warning : task impl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接