MSBuild属性经过多次评估

时间:2018-09-18 14:17:52

标签: visual-studio msbuild visual-studio-2017

在更新到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的值为什么在CopyMessage中使用的值为什么不同?似乎该属性中的表达式被评估了多次。有办法避免这种情况吗?

1 个答案:

答案 0 :(得分:0)

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

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

对您有用吗?