1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <UsingTask TaskName="GenerateEncryptedNuGetConfig" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
5 <UsingTask TaskName="GenerateUnencryptedNuGetConfig" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
6 <UsingTask TaskName="EncryptedConfigNuGetRestore" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
7 <UsingTask TaskName="PrereleaseResolveNuGetPackageAssets" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
9 <Target Name="RestoreOptionalToolingPackages"
10 DependsOnTargets="RestoreOptionalToolingEncrypted;
11 RestoreOptionalToolingUnencrypted;
12 CleanOptionalToolingRestore"
14 Condition="'$(OptionalToolSource)'!=''" />
17 Create items for any feeds specified by parameters. This makes it easy to pass in an optional
18 source with an msbuild command.
20 <Target Name="CreateOptionalRestoreFeedItems">
22 <OptionalRestoreSource Include="FeedFromProperties">
23 <Uri>$(OptionalToolSource)</Uri>
24 <Username Condition="'$(OptionalToolSourceUser)'!=''">$(OptionalToolSourceUser)</Username>
25 <Password Condition="'$(OptionalToolSourcePassword)'!=''">$(OptionalToolSourcePassword)</Password>
26 </OptionalRestoreSource>
31 Determine the paths of the optional tool runtime project.json and lockfile.
33 <Target Name="GetOptionalToolingPaths">
35 <OptionalToolingDir>$(ToolsDir)optional-tool-runtime\</OptionalToolingDir>
36 <OptionalToolingJsonPath Condition="'$(OptionalToolingJsonPath)' == ''">$(OptionalToolingDir)optional.json</OptionalToolingJsonPath>
37 <OptionalToolingProjectJsonPath>$(OptionalToolingDir)project.json</OptionalToolingProjectJsonPath>
38 <OptionalToolingProjectLockJsonPath>$(OptionalToolingDir)project.lock.json</OptionalToolingProjectLockJsonPath>
43 Copy the mangled "optional.json" file to "project.json", so that we can restore it. The name
44 is optional.json so that recursive restore will not normally find the file: it contains
45 optional tooling that typical recursive restores do not provide, such as the buildtools build.
47 <Target Name="PrepareOptionalToolProjectJson"
48 DependsOnTargets="GetOptionalToolingPaths">
50 <Copy SourceFiles="$(OptionalToolingJsonPath)"
51 DestinationFiles="$(OptionalToolingProjectJsonPath)"
52 SkipUnchangedFiles="true" />
56 Restore optional tooling using a NuGet.Config on disk with encrypted credentials inside.
57 Not supported on .NET Core.
59 <Target Name="RestoreOptionalToolingEncrypted"
60 DependsOnTargets="CreateOptionalRestoreFeedItems;
61 PrepareOptionalToolProjectJson"
62 Condition="'$(MSBuildRuntimeType)'!='core'">
64 <GeneratedNuGetConfigDir>$(ObjDir)generatedNuGetConfig/</GeneratedNuGetConfigDir>
65 <OptionalRestoreConfigPath>$(GeneratedNuGetConfigDir)optional.NuGet.Config</OptionalRestoreConfigPath>
68 <GenerateEncryptedNuGetConfig ConfigPath="$(OptionalRestoreConfigPath)"
69 Sources="@(OptionalRestoreSource)" />
71 <EncryptedConfigNuGetRestore Inputs="$(OptionalToolingProjectJsonPath)"
72 ConfigFile="$(OptionalRestoreConfigPath)"
73 PackagesDir="$(PackagesDir)" />
77 Restore optional tooling by generating the XML string of a NuGet.Config with plaintext
78 credentials, then injecting it into "dotnet restore" using /dev/stdin.
79 Not supported on Windows.
81 <Target Name="RestoreOptionalToolingUnencrypted"
82 DependsOnTargets="CreateOptionalRestoreFeedItems;
83 PrepareOptionalToolProjectJson"
84 Condition="'$(MSBuildRuntimeType)'=='core'">
86 <!-- Create a new restore command with no source parameters, only configfile. -->
87 <OptionalRestoreCommand>"$(DnuToolPath)"</OptionalRestoreCommand>
88 <OptionalRestoreCommand>$(OptionalRestoreCommand) restore</OptionalRestoreCommand>
89 <OptionalRestoreCommand Condition="'$(UseNuGetHttpCache)'!='true'">$(OptionalRestoreCommand) --no-cache</OptionalRestoreCommand>
90 <OptionalRestoreCommand>$(OptionalRestoreCommand) --packages "$(PackagesDir.TrimEnd('/\'.ToCharArray()))"</OptionalRestoreCommand>
91 <OptionalRestoreCommand>$(OptionalRestoreCommand) --configfile $(OptionalRestoreConfigPath)</OptionalRestoreCommand>
94 <Error Text="Restoring optional tooling with in-memory credentials is not supported on Windows. Use the desktop framework for the encrypted credential flow."
95 Condition="'$(RunningOnUnix)'!='true'" />
97 <Error Text="Restoring optional tooling with in-memory credentials is not yet implemented. No cross-platform optional tooling exists yet." />
101 Cleanup steps: try to ensure non-authenticated restore attempts don't attempt to restore
102 optional packages and reduce credential exposure to the remaining steps in the build.
104 <Target Name="CleanOptionalToolingRestore"
105 Condition="'$(SkipCleanOptionalToolingRestore)'!='true'">
107 <OptionalRestoreTemporaryFilePath Include="$(OptionalRestoreConfigPath);
108 $(OptionalToolingProjectJsonPath)" />
111 <Delete Files="@(OptionalRestoreTemporaryFilePath)" Condition="Exists('%(Identity)')" />
115 Resolve tooling from the optional restore lockfile. Other targets can find optional tooling
116 in ResolvedOptionalToolReferences.
118 <Target Name="ResolveOptionalTools"
119 DependsOnTargets="GetOptionalToolingPaths">
121 <Error Text="Optional tooling has not been restored. Use the 'RestoreOptionalToolingPackages' target first."
122 Condition="!Exists('$(OptionalToolingProjectLockJsonPath)')" />
125 <OptionalToolingTargetMoniker Include=".NETFramework,Version=v4.5" />
128 <PrereleaseResolveNuGetPackageAssets ProjectLockFile="$(OptionalToolingProjectLockJsonPath)"
129 TargetMonikers="@(OptionalToolingTargetMoniker)">
130 <Output TaskParameter="ResolvedReferences" ItemName="ResolvedOptionalToolReferences" />
131 </PrereleaseResolveNuGetPackageAssets>