使用同一解决方案中的自定义MSBuild任务?

Tin*_*ter 20 .net msbuild

我是MSBuild的新手,想要稍微玩一下,但我无法弄清楚为什么这不起作用.

所以我的解决方案有两个项目:"Model"和"BuildTasks".BuildTasks只有一个类:

using Microsoft.Build.Utilities;

namespace BuildTasks
{
    public class Test : Task
    {
        public override bool Execute()
        {
            Log.LogMessage( "FASDfasdf" );
            return true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在Model.csproj中我添加了这个:

  <UsingTask TaskName="BuildTasks.Test" AssemblyFile="$(SolutionDir)src\BuildTasks\bin\BuildTasks.dll" />
  <Target Name="AfterBuild">
    <Test />
  </Target>
Run Code Online (Sandbox Code Playgroud)

我已经设置了构建顺序,因此"BuildTasks"会在"Model"之前构建.但是,当我尝试构建模型时,我收到此错误:

无法从程序集C:\ WIP\TestSolution\src\BuildTasks\bin\BuildTasks.dll加载"BuildTasks.Test"任务.无法加载文件或程序集'file:/// C:\ WIP\TestSolution\src\BuildTasks\bin\BuildTasks.dll'或其依赖项之一.该系统找不到指定的文件.确认<UsingTask>声明是正确的,并且程序集及其所有依赖项都可用.

这个文件肯定存在,为什么MSBuild不能找到它呢?

我甚至尝试用硬编码"C:\ WIP\TestSolution"代替"$(SolutionDir)"并得到同样的错误.但是,如果我复制.dll文件到我的桌面和硬编码路径到我的桌面,它DOES工作,我想不通为什么.

编辑:我没有错路.我修改了BuildTasks的Debug/Release版本,将.dll输出到bin文件夹,因为我不希望Debug/Release有不同的路径.

Gar*_*ton 12

我们尝试了这个,我们发现你必须将UsingTask放在项目文件的顶部(并使所有路径都正确).然而,一旦到位并且任务加载,它将只工作一次.之后构建开始失败,因为它无法复制任务所在的DLL.我们实际上正在运行一个post build任务,它位于我们正在构建的同一个程序集/项目中.

我们要解决的问题是在单独的MSBuild文件上启动单独的MSBuild进程来运行Post Build任务.这样,DLL在构建并复制到bin目录之后才会加载.

<Target Name="AfterBuild">
    <Exec Command="$(MSBuildBinPath)\MSBuild.exe 
          &quot;$(MSBuildProjectDirectory)\PostBuild.msbuild&quot; 
          /property:SomeProperty=$(SomeProperty)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在命令行上将属性传递到此子构建任务.

而PostBuild.msbuild看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="PostBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <UsingTask TaskName="PostBuild" AssemblyFile="$(MSBuildProjectDirectory)\bin\AssemblyThatJustBuiltAndContainsBuildTask.dll" />
    <PropertyGroup>
        <SomeProperty>SomePropertyDefaultValue</SomeProperty>
    </PropertyGroup>

    <Target Name="PostBuild">
        <MyPostBuildTask SomeProperty="$(SomeProperty)" />
    </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)


Aar*_*ell 0

你确定你的路径写了吗?不应该在吗bin\Configuration Type\BuildTasks.dll

我找到了这个链接:http://bartdesmet.net/blogs/bart/archive/2008/02/15/the-custom-msbuild-task-cookbook.aspx存档副本)在开始编写 MSBuild 任务时非常有帮助。