Свойство MSBuild оценивается несколько раз - PullRequest
0 голосов
/ 18 сентября 2018

Это работало до обновления до 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?Кажется, что выражение в свойстве оценивается несколько раз.Есть ли способ избежать этого?

1 Ответ

0 голосов
/ 18 сентября 2018

Понятия не имею, почему его оценивают несколько раз.В качестве обходного пути вы можете сохранить значение GUID в его собственном свойстве, например:

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

Это работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...