summaryrefslogtreecommitdiff
path: root/packages/microsoft.dotnet.buildtools/2.1.0-rc1-03006-01/lib/OptionalTooling.targets
blob: f6df60b44382f1815411847c5cdee8b7f0819a2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <UsingTask TaskName="GenerateEncryptedNuGetConfig" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
  <UsingTask TaskName="GenerateUnencryptedNuGetConfig" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
  <UsingTask TaskName="EncryptedConfigNuGetRestore" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
  <UsingTask TaskName="PrereleaseResolveNuGetPackageAssets" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />

  <Target Name="RestoreOptionalToolingPackages"
          DependsOnTargets="RestoreOptionalToolingEncrypted;
                            RestoreOptionalToolingUnencrypted;
                            CleanOptionalToolingRestore"
          BeforeTargets="Sync"
          Condition="'$(OptionalToolSource)'!=''" />

  <!--
    Create items for any feeds specified by parameters. This makes it easy to pass in an optional
    source with an msbuild command.
  -->
  <Target Name="CreateOptionalRestoreFeedItems">
    <ItemGroup>
      <OptionalRestoreSource Include="FeedFromProperties">
        <Uri>$(OptionalToolSource)</Uri>
        <Username Condition="'$(OptionalToolSourceUser)'!=''">$(OptionalToolSourceUser)</Username>
        <Password Condition="'$(OptionalToolSourcePassword)'!=''">$(OptionalToolSourcePassword)</Password>
      </OptionalRestoreSource>
    </ItemGroup>
  </Target>

  <!--
    Determine the paths of the optional tool runtime project.json and lockfile.
  -->
  <Target Name="GetOptionalToolingPaths">
    <PropertyGroup>
      <OptionalToolingDir>$(ToolsDir)optional-tool-runtime\</OptionalToolingDir>
      <OptionalToolingJsonPath Condition="'$(OptionalToolingJsonPath)' == ''">$(OptionalToolingDir)optional.json</OptionalToolingJsonPath>
      <OptionalToolingProjectJsonPath>$(OptionalToolingDir)project.json</OptionalToolingProjectJsonPath>
      <OptionalToolingProjectLockJsonPath>$(OptionalToolingDir)project.lock.json</OptionalToolingProjectLockJsonPath>
    </PropertyGroup>
  </Target>

  <!--
    Copy the mangled "optional.json" file to "project.json", so that we can restore it. The name
    is optional.json so that recursive restore will not normally find the file: it contains
    optional tooling that typical recursive restores do not provide, such as the buildtools build.
  -->
  <Target Name="PrepareOptionalToolProjectJson"
          DependsOnTargets="GetOptionalToolingPaths">

    <Copy SourceFiles="$(OptionalToolingJsonPath)"
          DestinationFiles="$(OptionalToolingProjectJsonPath)"
          SkipUnchangedFiles="true" />
  </Target>

  <!--
    Restore optional tooling using a NuGet.Config on disk with encrypted credentials inside.
    Not supported on .NET Core.
  -->
  <Target Name="RestoreOptionalToolingEncrypted"
          DependsOnTargets="CreateOptionalRestoreFeedItems;
                            PrepareOptionalToolProjectJson"
          Condition="'$(MSBuildRuntimeType)'!='core'">
    <PropertyGroup>
      <GeneratedNuGetConfigDir>$(ObjDir)generatedNuGetConfig/</GeneratedNuGetConfigDir>
      <OptionalRestoreConfigPath>$(GeneratedNuGetConfigDir)optional.NuGet.Config</OptionalRestoreConfigPath>
    </PropertyGroup>

    <GenerateEncryptedNuGetConfig ConfigPath="$(OptionalRestoreConfigPath)"
                                  Sources="@(OptionalRestoreSource)" />

    <EncryptedConfigNuGetRestore Inputs="$(OptionalToolingProjectJsonPath)"
                                 ConfigFile="$(OptionalRestoreConfigPath)"
                                 PackagesDir="$(PackagesDir)" />
  </Target>

  <!--
    Restore optional tooling by generating the XML string of a NuGet.Config with plaintext
    credentials, then injecting it into "dotnet restore" using /dev/stdin.
    Not supported on Windows.
  -->
  <Target Name="RestoreOptionalToolingUnencrypted"
          DependsOnTargets="CreateOptionalRestoreFeedItems;
                            PrepareOptionalToolProjectJson"
          Condition="'$(MSBuildRuntimeType)'=='core'">
    <PropertyGroup>
      <!-- Create a new restore command with no source parameters, only configfile. -->
      <OptionalRestoreCommand>"$(DnuToolPath)"</OptionalRestoreCommand>
      <OptionalRestoreCommand>$(OptionalRestoreCommand) restore</OptionalRestoreCommand>
      <OptionalRestoreCommand Condition="'$(UseNuGetHttpCache)'!='true'">$(OptionalRestoreCommand) --no-cache</OptionalRestoreCommand>
      <OptionalRestoreCommand>$(OptionalRestoreCommand) --packages "$(PackagesDir.TrimEnd('/\'.ToCharArray()))"</OptionalRestoreCommand>
      <OptionalRestoreCommand>$(OptionalRestoreCommand) --configfile $(OptionalRestoreConfigPath)</OptionalRestoreCommand>
    </PropertyGroup>

    <Error Text="Restoring optional tooling with in-memory credentials is not supported on Windows. Use the desktop framework for the encrypted credential flow."
           Condition="'$(RunningOnUnix)'!='true'" />

    <Error Text="Restoring optional tooling with in-memory credentials is not yet implemented. No cross-platform optional tooling exists yet." />
  </Target>

  <!--
    Cleanup steps: try to ensure non-authenticated restore attempts don't attempt to restore
    optional packages and reduce credential exposure to the remaining steps in the build.
  -->
  <Target Name="CleanOptionalToolingRestore"
          Condition="'$(SkipCleanOptionalToolingRestore)'!='true'">
    <ItemGroup>
      <OptionalRestoreTemporaryFilePath Include="$(OptionalRestoreConfigPath);
                                                 $(OptionalToolingProjectJsonPath)" />
    </ItemGroup>

    <Delete Files="@(OptionalRestoreTemporaryFilePath)" Condition="Exists('%(Identity)')" />
  </Target>

  <!--
    Resolve tooling from the optional restore lockfile. Other targets can find optional tooling
    in ResolvedOptionalToolReferences.
  -->
  <Target Name="ResolveOptionalTools"
          DependsOnTargets="GetOptionalToolingPaths">

    <Error Text="Optional tooling has not been restored. Use the 'RestoreOptionalToolingPackages' target first."
           Condition="!Exists('$(OptionalToolingProjectLockJsonPath)')" />

    <ItemGroup>
      <OptionalToolingTargetMoniker Include=".NETFramework,Version=v4.5" />
    </ItemGroup>

    <PrereleaseResolveNuGetPackageAssets ProjectLockFile="$(OptionalToolingProjectLockJsonPath)"
                                         TargetMonikers="@(OptionalToolingTargetMoniker)">
      <Output TaskParameter="ResolvedReferences" ItemName="ResolvedOptionalToolReferences" />
    </PrereleaseResolveNuGetPackageAssets>
  </Target>

</Project>