MSBuild: как получить доступ к значению свойства, установленному объектом Target во время события Post Build в Visual Studio - PullRequest
0 голосов
/ 16 января 2020

У меня есть событие PostBuild, которое вызывает командный файл, и мне нужно передать определенный параметр в командный файл. Этот параметр заполняется через другую задачу, которая вызывается через Target, настроенную для запуска до PostBuildEvent.

Я вижу, что он успешно отображается при отображении с использованием элемента как части раздела.

Но $ (TargetFrameworkToolsFolderPath) в PostBuildEvent имеет значение "". Есть ли способ получить доступ к этому пользовательскому свойству в событии после сборки?

Пример:

<UsingTask TaskName="GetTargetFrameworkToolsFolderName" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
   <ParameterGroup>
     <SDKFolderPath ParameterType="System.String" Required="true" />
     <TargetFrameworkVersionStr ParameterType="System.String" Required="true" />
     <TargetFrameworkToolsFolder ParameterType="System.String" Output="true" />
   </ParameterGroup>
   <Task>
     <Code Type="Fragment" Language="cs">
        TargetFrameworkToolsFolder = SDKFolderPath + "\\" + "bin\\NETFX " + TargetFrameworkVersionStr.Substring(1) + " Tools\\";
     </Code>
   </Task>
</UsingTask>

<Target Name="FindTargetFrameworkToolsFolderPath" BeforeTargets="PostBuildEvent">
   <GetFrameworkSdkPath>
     <Output TaskParameter="Path" PropertyName="SdkPath" />
   </GetFrameworkSdkPath>
   <GetTargetFrameworkToolsFolderName SDKFolderPath="$(SdkPath)" TargetFrameworkVersionStr="$(TargetFrameworkVersion)">
     <Output PropertyName="TargetFrameworkToolsFolderPath" TaskParameter="TargetFrameworkToolsFolder"/>
   </GetTargetFrameworkToolsFolderName>
   <Message Text="$(TargetFrameworkToolsFolderPath)" Importance="normal" /> --> Displayed correctly here
</Target>

<PropertyGroup>
   <PostBuildEvent>
      call $(ProjectDir)AfterBuildCommands.bat $(TargetFrameworkToolsFolderPath) --> The TargetFrameworkToolsFolderPath property value here seems to be empty.
   </PostBuildEvent>
</PropertyGroup>

1 Ответ

0 голосов
/ 17 января 2020

Но $ (TargetFrameworkToolsFolderPath) в PostBuildEvent имеет значение "". Есть ли способ получить доступ к этому пользовательскому свойству в событии после сборки?

На самом деле , <PostBuildEvent> - это свойство, и MSBuild сначала читает все свойства, а затем выполняет все цели.

Если вы поместите эти значения ниже цели, которая определяет свойство TargetFrameworkToolsFolderPath, они всегда будут выполняться первыми, как и ожидалось, значения TargetFrameworkToolsFolderPath будут пустыми.

Чтобы избежать этого, вы должны поместить свойства PostBuildEvent и TargetFrameworkToolsFolderPath в одну и ту же цель и убедиться, что цель выполнена достаточно рано, например, после PrepareForBuild target.

<PropertyGroup>
   <PostBuildEvent>
      call $(ProjectDir)AfterBuildCommands.bat $(TargetFrameworkToolsFolderPath) --> The TargetFrameworkToolsFolderPath property value here seems to be empty.
   </PostBuildEvent>
</PropertyGroup>

Решение

Попробуйте это ниже:

 <UsingTask TaskName="GetTargetFrameworkToolsFolderName" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
    <ParameterGroup>
      <SDKFolderPath ParameterType="System.String" Required="true" />
      <TargetFrameworkVersionStr ParameterType="System.String" Required="true" />
      <TargetFrameworkToolsFolder ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
      <Code Type="Fragment" Language="cs">
        TargetFrameworkToolsFolder = SDKFolderPath + "\\" + "bin\\NETFX " + TargetFrameworkVersionStr.Substring(1) + " Tools\\";
      </Code>
    </Task>
  </UsingTask>
  <Target Name="MyFindTargetFrameworkToolsFolderPath" AfterTargets="PrepareForBuild">
    <GetFrameworkSdkPath>
      <Output TaskParameter="Path" PropertyName="SdkPath" />
    </GetFrameworkSdkPath>
    <GetTargetFrameworkToolsFolderName SDKFolderPath="$(SdkPath)" TargetFrameworkVersionStr="$(TargetFrameworkVersion)">
      <Output PropertyName="TargetFrameworkToolsFolderPath" TaskParameter="TargetFrameworkToolsFolder" />   
    </GetTargetFrameworkToolsFolderName>

    <PropertyGroup>
      <PostBuildEvent> call $(ProjectDir)AfterBuildCommands.bat $(TargetFrameworkToolsFolderPath) --> The TargetFrameworkToolsFolderPath property value here seems to be empty.</PostBuildEvent>
    </PropertyGroup>
    <Message Text="$(TargetFrameworkToolsFolderPath)" Importance="normal" />   

  </Target>

Надеюсь, это поможет вам.

...