Mam imprezę postbuild, która wywołuje plik wsadowy i muszę przejść w określonym parametrze do pliku wsadowego. Ten parametr jest wypełniony przez inne zadanie, które jest wywołane przez cel skonfigurowany do uruchamiania przed postbuildEventem.

Widzę, że jest pomyślnie wyświetlany, gdy jest wyświetlany przy użyciu elementu jako część sekcji.

Ale $ (TargetframeworkToolsfolderpath) w ramach Postbuildevent ma wartość "". Czy istnieje sposób na dostęp do tej niestandardowej nieruchomości w imprezie Budowania postu?

Przykład:

<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>
0
Nidhin 16 styczeń 2020, 18:11

1 odpowiedź

Najlepsza odpowiedź

Ale $ (TargetframeworkToolsfolderpath) w ramach Postbuildevent ma wartość "". Czy istnieje sposób na dostęp do tej niestandardowej nieruchomości w imprezie Budowania postu?

W rzeczywistości , <PostBuildEvent> to właściwość, a MSBuild brzmi wszystkie właściwości, a następnie wykonuje wszystkie cele.

Jeśli umieściłeś te poniżej poza celem, który definiuje właściwość TargetFrameworkToolsFolderPath, te poniżej zawsze będą działać najpierw, zgodnie z oczekiwaniami, wartości TargetFrameworkToolsFolderPath będą puste.

Aby go uniknąć, powinieneś umieścić właściwości PostBuildEvent i TargetFrameworkToolsFolderPath w tym samym celu i upewnij się, że cel jest wykonywany na tyle wcześnie, na przykład, przebieg po celu PrepareForBuild.

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

Rozwiązanie

Spróbuj tego poniżej:

 <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>

Mam nadzieję, że to może ci pomóc.

0
Perry Qian-MSFT 17 styczeń 2020, 08:04