2 ***********************************************************************************************
\r
3 Microsoft.NET.ComposeCache.targets
\r
5 WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
\r
6 created a backup copy. Incorrect changes to this file will make it
\r
7 impossible to load or build your projects from the command-line or the IDE.
\r
9 Copyright (c) .NET Foundation. All rights reserved.
\r
10 ***********************************************************************************************
\r
12 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
\r
15 ============================================================
\r
18 The main cache entry point.
\r
19 ============================================================
\r
22 <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
\r
25 <Target Name="ComposeCache"
\r
26 DependsOnTargets="PrepareForComposeCache;
\r
29 _CopyResolvedUnOptimizedFiles;
\r
33 ============================================================
\r
36 Processes the cache project files
\r
37 ============================================================
\r
40 <Target Name="CacheWorkerMain">
\r
43 <_AllProjects Include="$(AdditionalProjects.Split('%3B'))"/>
\r
44 <_AllProjects Include ="$(MSBuildProjectFullPath)"/>
\r
47 <MSBuild Projects="%(_AllProjects.Identity)"
\r
48 Targets="CacheWorkerMapper"
\r
49 BuildinParallel="$(BuildinParallel)"
\r
50 Properties="ComposeWorkingDir=$(ComposeWorkingDir);
\r
51 PublishDir=$(PublishDir);
\r
52 CacheStagingDir=$(CacheStagingDir);
\r
53 TargetFramework=$(_TFM);
\r
55 Crossgen=$(Crossgen);
\r
56 RestoreProj=$(RestoreProj);
\r
57 DisableImplicitFrameworkReferences=true;
\r
58 SkipUnchangedFiles=$(SkipUnchangedFiles);
\r
59 PreserveCacheLayout=$(PreserveCacheLayout)"
\r
60 ContinueOnError="WarnAndContinue">
\r
61 <Output ItemName="AllResolvedPackagesPublished" TaskParameter="TargetOutputs" />
\r
65 ============================================================
\r
68 Processes each package specified in a cache project file
\r
69 ============================================================
\r
72 <Target Name="CacheWorkerMapper"
\r
73 Returns ="@(ResolvedPackagesFromMapper)">
\r
76 <PackageReferencesToCache Include="$(RestoreProj)">
\r
78 CachePackageName=%(PackageReference.Identity);
\r
79 CachePackageVersion=%(PackageReference.Version);
\r
80 ComposeWorkingDir=$(ComposeWorkingDir);
\r
81 PublishDir=$(PublishDir);
\r
82 CacheStagingDir=$(CacheStagingDir);
\r
83 TargetFramework=$(TargetFramework);
\r
85 Crossgen=$(Crossgen);
\r
86 SkipUnchangedFiles=$(SkipUnchangedFiles);
\r
87 PreserveCacheLayout=$(PreserveCacheLayout)
\r
89 </PackageReferencesToCache>
\r
92 <MSBuild Projects="@(PackageReferencesToCache)"
\r
93 Targets="CacheWorker"
\r
94 BuildInParallel="$(BuildInParallel)"
\r
95 ContinueOnError="WarnAndContinue">
\r
96 <Output ItemName="ResolvedPackagesFromMapper" TaskParameter="TargetOutputs" />
\r
100 <Target Name="CacheWorker"
\r
101 Returns="@(ResolvedPackagesPublished)"
\r
102 DependsOnTargets="PrepforRestoreForComposeCache;
\r
103 CacheWorkerPerformWork"/>
\r
105 <Target Name="CacheWorkerPerformWork"
\r
106 DependsOnTargets="RestoreForComposeCache;
\r
107 ComputeAndCopyFilesToCacheDirectory;"
\r
108 Condition="!Exists($(CacheWorkerWorkingDir))" />
\r
111 ============================================================
\r
114 Cleans up and produces artifacts after completion of cache
\r
115 ============================================================
\r
117 <UsingTask TaskName="RemoveDuplicatePackageReferences" AssemblyFile="$(MicrosoftNETBuildTasksAssembly)" />
\r
118 <Target Name="CacheFinalizer"
\r
119 DependsOnTargets="CacheWorkerMain;
\r
120 _CopyResolvedOptimizedFiles">
\r
122 <RemoveDuplicatePackageReferences
\r
123 InputPackageReferences="@(AllResolvedPackagesPublished)">
\r
124 <Output TaskParameter="UniquePackageReferences" ItemName="AllResolvedPackagesPublishedAfterFilter"/>
\r
125 </RemoveDuplicatePackageReferences>
\r
128 <ListOfPackageReference Include="@(AllResolvedPackagesPublishedAfterFilter -> '%20%20%20<Package Id="%(Identity)" Version ="%(Version)"/>')"/>
\r
131 <_CacheArtifactContent>
\r
134 @(ListOfPackageReference)
\r
137 </_CacheArtifactContent>
\r
140 File="$(CacheArtifactXml)"
\r
141 Lines="$(_CacheArtifactContent)"
\r
142 Overwrite="true" />
\r
144 <Message Text="Files were composed in $(PublishDir)"
\r
145 Importance="high"/>
\r
146 <Message Text="The list of packages cached is in $(CacheArtifactXml) "
\r
147 Importance="high"/>
\r
149 Condition="'$(PreserveComposeWorkingDir)' != 'true'"
\r
150 Directories="$(ComposeWorkingDir)"
\r
151 ContinueOnError="WarnAndContinue"/>
\r
155 ============================================================
\r
156 _CopyResolvedUnOptimizedFiles
\r
158 Copy OptimizedResolvedFileToPublish items to the publish directory.
\r
159 ============================================================
\r
162 <Target Name="_CopyResolvedOptimizedFiles"
\r
163 DependsOnTargets="CacheWorkerMain;">
\r
165 <_OptimizedResolvedFileToPublish Include="$(CacheStagingDir)\**\*.*" />
\r
168 <Copy SourceFiles = "@(_OptimizedResolvedFileToPublish)"
\r
169 DestinationFolder="$(PublishDir)%(RecursiveDir)"
\r
170 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
\r
171 Retries="$(CopyRetryCount)"
\r
172 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
\r
173 Condition ="'@(_OptimizedResolvedFileToPublish)' != ''"
\r
174 SkipUnchangedFiles="$(SkipUnchangedFiles)">
\r
176 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
\r
182 ============================================================
\r
183 PrepareForComposeCache
\r
185 Prepare the prerequisites for ComposeCache.
\r
186 ============================================================
\r
189 <Target Name="PrepareForComposeCache">
\r
192 <PreserveCacheLayout Condition="'$(PreserveCacheLayout)' == ''">true</PreserveCacheLayout>
\r
193 <SkipOptimization Condition="'$(RuntimeIdentifier)' == ''">true</SkipOptimization>
\r
194 <_TFM Condition="'$(_TFM)' == ''">$(TargetFramework)</_TFM>
\r
195 <SkipUnchangedFiles Condition="'$(SkipUnchangedFiles)' == ''">true</SkipUnchangedFiles>
\r
198 <NETSdkError Condition="'$(RuntimeIdentifier)' =='' and '$(_PureManagedAssets)' == ''"
\r
199 ResourceName="RuntimeIdentifierWasNotSpecified"/>
\r
201 <NETSdkError Condition="'$(_TFM)' ==''"
\r
202 ResourceName="AtLeastOneTargetFrameworkMustBeSpecified"/>
\r
205 <DefaultComposeDir>$(HOME)</DefaultComposeDir>
\r
206 <DefaultComposeDir Condition="'$(OS)' == 'Windows_NT'">$(USERPROFILE)</DefaultComposeDir>
\r
207 <DefaultComposeDir>$([System.IO.Path]::Combine($(DefaultComposeDir), '.dotnet', $(PlatformTarget), 'packages'))</DefaultComposeDir>
\r
208 <ComposeDir Condition="'$(ComposeDir)' != '' and '$(DoNotDecorateComposeDir)' != 'true'">$([System.IO.Path]::Combine($(ComposeDir), $(PlatformTarget)))</ComposeDir>
\r
209 <ComposeDir Condition="'$(ComposeDir)' == ''">$(DefaultComposeDir)</ComposeDir>
\r
210 <ComposeDir Condition="'$(DoNotDecorateComposeDir)' != 'true'">$([System.IO.Path]::Combine($(ComposeDir), $(_TFM)))</ComposeDir>
\r
211 <CacheArtifactXml>$([System.IO.Path]::Combine($(ComposeDir),"artifact.xml"))</CacheArtifactXml>
\r
212 <PublishDir>$([System.IO.Path]::GetFullPath($(ComposeDir)))</PublishDir>
\r
213 <_RandomFileName>$([System.IO.Path]::GetRandomFileName())</_RandomFileName>
\r
214 <TEMP Condition="'$(TEMP)' == ''">$([System.IO.Path]::GetTempPath())</TEMP>
\r
215 <ComposeWorkingDir Condition="'$(ComposeWorkingDir)' == ''">$([System.IO.Path]::Combine($(TEMP), $(_RandomFileName)))</ComposeWorkingDir>
\r
216 <ComposeWorkingDir>$([System.IO.Path]::GetFullPath($(ComposeWorkingDir)))</ComposeWorkingDir>
\r
217 <CacheStagingDir>$([System.IO.Path]::Combine($(ComposeWorkingDir),"StagingDir"))</CacheStagingDir> <!-- Will contain optimized managed assemblies in nuget cache layout -->
\r
218 <RestoreProj>$([System.IO.Path]::Combine($(ComposeWorkingDir),"Restore.csproj"))</RestoreProj> <!-- To minimize parsing huge input files during restore stage for packages -->
\r
219 <!-- Ensure any PublishDir has a trailing slash, so it can be concatenated -->
\r
220 <PublishDir Condition="!HasTrailingSlash('$(PublishDir)')">$(PublishDir)\</PublishDir>
\r
224 <NETSdkError Condition="Exists($(ComposeWorkingDir))"
\r
225 ResourceName="FolderAlreadyExists"
\r
226 FormatArguments="$(ComposeWorkingDir)" />
\r
228 <MakeDir Directories="$(PublishDir)" />
\r
229 <MakeDir Directories="$(CacheStagingDir)"/>
\r
231 <!-- Create a Project to be used for restores-->
\r
233 <RestoreProjContent>
\r
235 <Project Sdk="Microsoft.NET.Sdk">
\r
239 </RestoreProjContent>
\r
243 File="$(RestoreProj)"
\r
244 Lines="$(RestoreProjContent)"
\r
245 Overwrite="true" />
\r
248 <Target Name="PrepforRestoreForComposeCache">
\r
251 <CachePackageVersion>$(CachePackageVersion.Replace('*','-'))</CachePackageVersion>
\r
252 <CacheWorkerWorkingDir>$([System.IO.Path]::Combine($(ComposeWorkingDir),"$(CachePackageName)_$(CachePackageVersion)"))</CacheWorkerWorkingDir>
\r
253 <_PackageProjFile>$([System.IO.Path]::Combine($(CacheWorkerWorkingDir), "Package.csproj"))</_PackageProjFile>
\r
254 <ProjectAssetsFile>$(CacheWorkerWorkingDir)\project.assets.json</ProjectAssetsFile>
\r
255 <_PackageProjContent>
\r
257 <Project Sdk="Microsoft.NET.Sdk">
\r
259 <PackageReference Include="$(CachePackageName)" Version ="$(CachePackageVersion)"/>
\r
263 </_PackageProjContent>
\r
269 ============================================================
\r
270 RestoreForComposeCache
\r
272 Restores the package
\r
273 ============================================================
\r
276 <Target Name="RestoreForComposeCache"
\r
277 DependsOnTargets="PrepforRestoreForComposeCache;">
\r
279 <MakeDir Directories="$(CacheWorkerWorkingDir)" />
\r
281 <!-- Create a Project to Restore Package -->
\r
283 File="$(_PackageProjFile)"
\r
284 Lines="$(_PackageProjContent)"
\r
285 Overwrite="true" />
\r
287 <MSBuild Projects="$(_PackageProjFile)"
\r
289 Properties="RestoreGraphProjectInput=$(_PackageProjFile);
\r
290 DisableImplicitFrameworkReferences=true;
\r
291 RestoreOutputPath=$(CacheWorkerWorkingDir);
\r
292 TargetFramework=$(TargetFramework);"/>
\r
296 ============================================================
\r
297 ComputeAndCopyFilesToCacheDirectory
\r
299 Computes the list of all files to copy to the publish directory and then publishes them.
\r
300 ============================================================
\r
303 <Target Name="ComputeAndCopyFilesToCacheDirectory"
\r
304 DependsOnTargets="ComputeFilesToCache;
\r
305 CopyFilesToCacheDirectory" />
\r
308 ============================================================
\r
309 CopyFilesToCacheDirectory
\r
311 Copy all build outputs, satellites and other necessary files to the publish directory.
\r
312 ============================================================
\r
315 <Target Name="CopyFilesToCacheDirectory"
\r
316 DependsOnTargets="_CopyResolvedUnOptimizedFiles"/>
\r
320 ============================================================
\r
321 _CopyResolvedUnOptimizedFiles
\r
323 Copy _UnOptimizedResolvedFileToPublish items to the publish directory.
\r
324 ============================================================
\r
327 <Target Name="_CopyResolvedUnOptimizedFiles"
\r
328 DependsOnTargets="_ComputeResolvedFilesToCacheTypes;
\r
331 <Copy SourceFiles = "@(_UnOptimizedResolvedFileToPublish)"
\r
332 DestinationFiles="$(PublishDir)%(_UnOptimizedResolvedFileToPublish.DestinationSubPath)"
\r
333 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
\r
334 Retries="$(CopyRetryCount)"
\r
335 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
\r
336 SkipUnchangedFiles="$(SkipUnchangedFiles)">
\r
338 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
\r
344 ============================================================
\r
345 _ComputeResolvedFilesToCacheTypes
\r
346 ============================================================
\r
349 <Target Name="_ComputeResolvedFilesToCacheTypes"
\r
350 DependsOnTargets="_GetResolvedFilesToCache;_SplitResolvedFiles;" />
\r
353 ============================================================
\r
354 _SplitResolvedFiles
\r
356 Splits ResolvedFileToPublish items into 'managed' and 'unmanaged' buckets.
\r
357 ============================================================
\r
360 <Target Name="_SplitResolvedFiles"
\r
361 Condition="$(SkipOptimization) !='true' "
\r
362 DependsOnTargets="_GetResolvedFilesToCache">
\r
364 <_ManagedResolvedFileToPublishCandidates Include="@(ResolvedFileToPublish)"
\r
365 Condition="'%(ResolvedFileToPublish.AssetType)'=='runtime'" />
\r
367 <_UnOptimizedResolvedFileToPublish Include="@(ResolvedFileToPublish)"
\r
368 Condition="'%(ResolvedFileToPublish.AssetType)'!='runtime'" />
\r
372 <SkipOptimization Condition="'@(_ManagedResolvedFileToPublishCandidates)'==''">true</SkipOptimization>
\r
377 ============================================================
\r
378 _GetResolvedFilesToCache
\r
379 ============================================================
\r
382 <Target Name="_GetResolvedFilesToCache"
\r
383 Condition="$(SkipOptimization) == 'true' ">
\r
385 <_UnOptimizedResolvedFileToPublish Include="@(ResolvedFileToPublish)" />
\r
390 ============================================================
\r
391 ComputeFilesToCache
\r
393 Gathers all the files that need to be copied to the publish directory.
\r
394 ============================================================
\r
397 <Target Name="ComputeFilesToCache"
\r
398 DependsOnTargets="_ComputeNetPublishAssets;
\r
399 _ComputeCopyToPublishDirectoryItems">
\r
402 <CopyBuildOutputToPublishDirectory Condition="'$(CopyBuildOutputToPublishDirectory)'==''">true</CopyBuildOutputToPublishDirectory>
\r
403 <CopyOutputSymbolsToPublishDirectory Condition="'$(CopyOutputSymbolsToPublishDirectory)'==''">true</CopyOutputSymbolsToPublishDirectory>
\r
408 <!-- Copy all the assemblies -->
\r
409 <ResolvedFileToPublish Include="@(ResolvedAssembliesToPublish)">
\r
410 </ResolvedFileToPublish>
\r