多次评估 MSBuild 属性



这在更新到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)BuildTasksbin$(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 返回错误:

无法加载文件或程序集 'file:///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声明的目录中。

为什么在UsingTask中使用时TempFolder的值与在CopyMessage中使用时不同?似乎多次计算属性中的表达式。有没有办法避免这种情况?

我不知道为什么它会被多次评估。 作为解决方法,可以将 GUID 的值保存到其自己的属性中,如下所示:

<PropertyGroup>
<myguid>$([System.Guid]::NewGuid())</myguid>
<TempFolder>$([System.IO.Path]::GetTempPath())$(myguid)</TempFolder>
</PropertyGroup>

这对你有用吗?

最新更新