gpt4 book ai didi

.net - 使用来自同一解决方案的自定义 MSBuild 任务?

转载 作者:行者123 更新时间:2023-12-03 12:17:06 24 4
gpt4 key购买 nike

我是 MSBuild 的新手,想尝试一下,但我就是不明白为什么这不起作用。

所以我的解决方案有两个项目:“模型”和“BuildTasks”。 BuildTasks 只有一个类:

using Microsoft.Build.Utilities;

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

然后在 Model.csproj 我添加了这个:
  <UsingTask TaskName="BuildTasks.Test" AssemblyFile="$(SolutionDir)src\BuildTasks\bin\BuildTasks.dll" />
<Target Name="AfterBuild">
<Test />
</Target>

我已经设置了构建顺序,因此“BuildTasks”在“模型”之前构建。但是当我尝试构建模型时,我得到了这个错误:

The "BuildTasks.Test" task could not be loaded from the assembly C:\WIP\TestSolution\src\BuildTasks\bin\BuildTasks.dll. Could not load file or assembly 'file:///C:\WIP\TestSolution\src\BuildTasks\bin\BuildTasks.dll' or one of its dependencies. The system cannot find the file specified. Confirm that the <UsingTask> declaration is correct, and that the assembly and all its dependencies are available.



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

我什至尝试用硬编码“C:\WIP\TestSolution”代替“$(SolutionDir)”并得到同样的错误。但是,如果我将该 .dll 复制到我的桌面并将路径硬编码到我的桌面,它确实可以工作,我不知道为什么。

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

最佳答案

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

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

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

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

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>

关于.net - 使用来自同一解决方案的自定义 MSBuild 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/282615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com