我正在尝试开发自定义MSBuild任务,并通过从同一解决方案的另一个项目中调用它来对其进行测试。最初,我在测试项目中设置UsingTask
来引用任务项目中的.dll:
<UsingTask TaskName="FooTask" AssemblyFile="..\Task\bin\$(Configuration)\Task.dll"/>
<Target Name="RunFooTask" BeforeTargets="Compile">
<FooTask/>
</Target>
多数情况下有效。但是构建测试项目经常且看似随意,但使任务项目.dll被MSBuild和/或Visual Studio锁定,这需要终止恶意的MSBuild进程并重新启动Visual Studio。这听起来类似于Visual Studio 2008 locks custom MSBuild Task assemblies和Visual Studio 2008 locks dll in bin folder and doesn't let go of it。但是我的任务已经是AppDomainIsolatedTask
,并且我尝试设置GenerateResourceNeverLockTypeAssemblies
。这不能解决问题。
因此,我尝试将测试项目中的项目引用添加到目标项目,以为它将.dll复制到测试项目中,UsingTask
可以在其中找到它:
<UsingTask TaskName="FooTask" AssemblyFile="$(OutputPath)Task.dll" />
此似乎用于解决.dll处于锁定状态的问题。现在的问题是,调用任务时尚未复制.dll。如果我理解正确,BeforeTargets="Compile"
表示在编译之前的任何时间,而不一定在编译之前。因此,我认为我还需要指定AfterTargets
,无论目标是从引用的项目中复制.dll还是目标。 那是什么目标?
偶然地,我也尝试将BeforeTargets="Compile"
更改为BeforeTargets="Build"
。现在,.dll是在任务运行之前复制的,但这是因为它在生成后 之后运行!我将其归结为完全不涉及UsingTask
的测试目标:
<Target Name="Hello" BeforeTargets="Build">
<Message Importance="high" Text="Hello" />
</Target>
输出:
1>------ Rebuild All started: Project: Test, Configuration: Debug Any CPU ------
1> Test -> C:\[redacted]\MSBuildTest2\Test\bin\Debug\Test.exe
1> Hello
这使我怀疑我以为我对所发生的一切了解。