Это работало до обновления до 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 возвращается с ошибкой:
Не удалось загрузить файл или сборку 'file: /// C: \ Users \ Имя пользователя \ AppData \ Local \ Temp \ fb69480f-28f1-49be-882e-a6d4beb68f7e\ BuildTasks.dll 'или одна из его зависимостей.Система не может найти указанный файл.Убедитесь, что объявление правильное, что сборка и все ее зависимости доступны и что задача содержит открытый класс, реализующий Microsoft.Build.Framework.ITask.
При выводе Message
команда:
C: \ Users \ Имя пользователя \ AppData \ Local \ Temp \ 62fe9a44-6fcd-4b78-9de6-98a4d8247dd4
Двоичные файлы правильно скопированыв каталог, указанный в Message
.
Почему значение TempFolder
отличается при использовании в UsingTask
, чем при использовании в Copy
и Message
?Кажется, что выражение в свойстве оценивается несколько раз.Есть ли способ избежать этого?