在更新到Visual Studio 15.8.4之前,此方法有效:
<PropertyGroup>
<TempFolder>$([System.IO.Path]::GetTempPath())$([System.Guid]::NewGuid())</TempFolder>
</PropertyGroup>
<UsingTask TaskName="RTL_CSS_Compiler.Build.NodeInstaller" AssemblyFile="$(TempFolder)\BuildTasks.dll" />
<Target Name="AfterBuild">
<ItemGroup>
<_TargetItems Include="$(SolutionDir)\BuildTasks\bin\$(Configuration)\*.*">
<InProject>false</InProject>
</_TargetItems>
</ItemGroup>
<Message Text="$(TempFolder)" Importance="high" />
<!-- Copy BuildTasks and its dependencies and execute them from a temp directory to avoid
MSBuild error due to Visual Studio node reuse locking the output assemblies.
https://mnaoumov.wordpress.com/2015/07/13/msbuild-custom-task-and-assembly-locks/ -->
<Copy SourceFiles="@(_TargetItems)" DestinationFolder="$(TempFolder)%(RecursiveDir)" />
<NodeInstaller />
</Target>
它正确地将构建的BuildTasks及其依赖项复制到一个临时目录,然后从那里执行它。现在,MSBuild返回错误:
无法加载文件或程序集 '文件:/// C:\ Users \ Username \ AppData \ Local \ Temp \ fb69480f-28f1-49be-882e-a6d4beb68f7e \ BuildTasks.dll' 或其依赖项之一。该系统找不到指定的文件。 确认声明正确,装配正确 并且其所有依赖项都可用,并且该任务包含一个 实现Microsoft.Build.Framework.ITask的公共类。
Message
命令的输出为:
C:\ Users \ Username \ AppData \ Local \ Temp \ 62fe9a44-6fcd-4b78-9de6-98a4d8247dd4
二进制文件已正确复制到Message
声明的目录中。
在TempFolder
中使用的UsingTask
的值为什么在Copy
和Message
中使用的值为什么不同?似乎该属性中的表达式被评估了多次。有办法避免这种情况吗?
答案 0 :(得分:0)
我不知道为什么要对其进行多次评估。 解决方法是,可以将GUID的值保存到它自己的属性中,如下所示:
<PropertyGroup>
<myguid>$([System.Guid]::NewGuid())</myguid>
<TempFolder>$([System.IO.Path]::GetTempPath())$(myguid)</TempFolder>
</PropertyGroup>
对您有用吗?