我是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
"$(MSBuildProjectDirectory)\PostBuild.msbuild"
/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)
归档时间: |
|
查看次数: |
12570 次 |
最近记录: |