|
<!--
***********************************************************************************************
Microsoft.NET.ComposeStore.targets
WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
created a backup copy. Incorrect changes to this file will make it
impossible to load or build your projects from the command-line or the IDE.
Copyright (c) .NET Foundation. All rights reserved.
***********************************************************************************************
-->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--
============================================================
ComposeStore
The main store entry point.
============================================================
-->
<Target Name="ComposeStore"
DependsOnTargets="PrepareForComposeStore;
PrepOptimizer;
StoreWorkerMain;
_CopyResolvedUnOptimizedFiles;
StoreFinalizer;"/>
<!--
============================================================
StoreWorkerMain
Processes the store project files
============================================================
-->
<Target Name="StoreWorkerMain">
<ItemGroup>
<_AllProjects Include="$(AdditionalProjects.Split('%3B'))"/>
<_AllProjects Include ="$(MSBuildProjectFullPath)"/>
</ItemGroup>
<MSBuild Projects="%(_AllProjects.Identity)"
Targets="StoreWorkerMapper"
BuildinParallel="$(BuildinParallel)"
Properties="ComposeWorkingDir=$(ComposeWorkingDir);
PublishDir=$(PublishDir);
StoreStagingDir=$(StoreStagingDir);
TargetFramework=$(_TFM);
JitPath=$(JitPath);
Crossgen=$(Crossgen);
DisableImplicitFrameworkReferences=true;
SkipUnchangedFiles=$(SkipUnchangedFiles);
PreserveStoreLayout=$(PreserveStoreLayout);
CreateProfilingSymbols=$(CreateProfilingSymbols);
StoreSymbolsStagingDir=$(StoreSymbolsStagingDir)">
<Output ItemName="AllResolvedPackagesPublished" TaskParameter="TargetOutputs" />
</MSBuild>
</Target>
<!--
============================================================
StoreWorkerMapper
Processes each package specified in a store project file
============================================================
-->
<Target Name="StoreWorkerMapper"
Returns ="@(ResolvedPackagesFromMapper)">
<ItemGroup>
<PackageReferencesToStore Include="$(MSBuildProjectFullPath)">
<PackageName>%(PackageReference.Identity)</PackageName>
<PackageVersion>%(PackageReference.Version)</PackageVersion>
<AdditionalProperties>
StorePackageName=%(PackageReference.Identity);
StorePackageVersion=%(PackageReference.Version);
ComposeWorkingDir=$(ComposeWorkingDir);
PublishDir=$(PublishDir);
StoreStagingDir=$(StoreStagingDir);
TargetFramework=$(TargetFramework);
RuntimeIdentifier=$(RuntimeIdentifier);
JitPath=$(JitPath);
Crossgen=$(Crossgen);
SkipUnchangedFiles=$(SkipUnchangedFiles);
PreserveStoreLayout=$(PreserveStoreLayout);
CreateProfilingSymbols=$(CreateProfilingSymbols);
StoreSymbolsStagingDir=$(StoreSymbolsStagingDir);
DisableImplicitFrameworkReferences=false;
</AdditionalProperties>
</PackageReferencesToStore>
</ItemGroup>
<!-- Restore phase -->
<MSBuild Projects="@(PackageReferencesToStore)"
Targets="RestoreForComposeStore"
BuildInParallel="$(BuildInParallel)">
</MSBuild>
<!-- Resolve phase-->
<MSBuild Projects="@(PackageReferencesToStore)"
Targets="StoreResolver"
Properties="SelfContained=false;UseAppHost=false;MSBuildProjectExtensionsPath=$(ComposeWorkingDir)\%(PackageReferencesToStore.PackageName)_$([System.String]::Copy('%(PackageReferencesToStore.PackageVersion)').Replace('*','-'))\;"
BuildInParallel="$(BuildInParallel)">
<Output ItemName="ResolvedPackagesFromMapper" TaskParameter="TargetOutputs" />
</MSBuild>
</Target>
<Target Name="StoreResolver"
Returns="@(ResolvedPackagesPublished)"
DependsOnTargets="PrepforRestoreForComposeStore;
StoreWorkerPerformWork"/>
<Target Name="StoreWorkerPerformWork"
DependsOnTargets="ComputeAndCopyFilesToStoreDirectory;"
Condition="Exists($(StoreWorkerWorkingDir))" />
<!--
============================================================
StoreFinalizer
Cleans up and produces artifacts after completion of store
============================================================
-->
<UsingTask TaskName="RemoveDuplicatePackageReferences" AssemblyFile="$(MicrosoftNETBuildTasksAssembly)" />
<Target Name="StoreFinalizer"
DependsOnTargets="StoreWorkerMain;
_CopyResolvedOptimizedFiles">
<RemoveDuplicatePackageReferences
InputPackageReferences="@(AllResolvedPackagesPublished)">
<Output TaskParameter="UniquePackageReferences" ItemName="AllResolvedPackagesPublishedAfterFilter"/>
</RemoveDuplicatePackageReferences>
<ItemGroup>
<ListOfPackageReference Include="@(AllResolvedPackagesPublishedAfterFilter -> '%20%20<Package Id="%(Identity)" Version="%(Version)" />')"/>
</ItemGroup>
<PropertyGroup>
<_StoreArtifactContent>
<![CDATA[
<StoreArtifacts>
@(ListOfPackageReference)
</StoreArtifacts>
]]>
</_StoreArtifactContent>
</PropertyGroup>
<WriteLinesToFile
File="$(StoreArtifactXml)"
Lines="$(_StoreArtifactContent)"
Overwrite="true" />
<Message Text="Files were composed in $(PublishDir)"
Importance="high"/>
<Message Text="The list of packages stored is in $(StoreArtifactXml) "
Importance="high"/>
<RemoveDir
Condition="'$(PreserveComposeWorkingDir)' != 'true'"
Directories="$(ComposeWorkingDir)" />
</Target>
<!--
============================================================
_CopyResolvedUnOptimizedFiles
Copy OptimizedResolvedFileToPublish items to the publish directory.
============================================================
-->
<Target Name="_CopyResolvedOptimizedFiles"
DependsOnTargets="StoreWorkerMain;">
<ItemGroup>
<_OptimizedResolvedFileToPublish Include="$(StoreStagingDir)\**\*.*" />
<_OptimizedSymbolFileToPublish Include="$(StoreSymbolsStagingDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles = "@(_OptimizedResolvedFileToPublish)"
DestinationFolder="$(PublishDir)%(_OptimizedResolvedFileToPublish.RecursiveDir)"
OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
Retries="$(CopyRetryCount)"
RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
Condition ="'@(_OptimizedResolvedFileToPublish)' != ''"
SkipUnchangedFiles="$(SkipUnchangedFiles)">
<Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
</Copy>
<Copy SourceFiles="@(_OptimizedSymbolFileToPublish)"
DestinationFolder="$(ProfilingSymbolsDir)%(_OptimizedSymbolFileToPublish.RecursiveDir)"
OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
Retries="$(CopyRetryCount)"
RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
Condition="'@(_OptimizedSymbolFileToPublish)' != ''"
SkipUnchangedFiles="$(SkipUnchangedFiles)">
<Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
</Copy>
</Target>
<!--
============================================================
PrepareForComposeStore
Prepare the prerequisites for ComposeStore.
============================================================
-->
<Target Name="PrepareForComposeStore">
<PropertyGroup>
<PreserveStoreLayout Condition="'$(PreserveStoreLayout)' == ''">true</PreserveStoreLayout>
<SkipOptimization Condition="'$(RuntimeIdentifier)' == ''">true</SkipOptimization>
<_TFM Condition="'$(_TFM)' == ''">$(TargetFramework)</_TFM>
<SkipUnchangedFiles Condition="'$(SkipUnchangedFiles)' == ''">true</SkipUnchangedFiles>
</PropertyGroup>
<NETSdkError Condition="'2.0' > '$(_TargetFrameworkVersionWithoutV)'"
ResourceName="UnuspportedFramework"
FormatArguments="$(TargetFrameworkMoniker)"/>
<NETSdkError Condition="'$(RuntimeIdentifier)' =='' and '$(_PureManagedAssets)' == ''"
ResourceName="RuntimeIdentifierWasNotSpecified"/>
<NETSdkError Condition="'$(_TFM)' ==''"
ResourceName="AtLeastOneTargetFrameworkMustBeSpecified"/>
<PropertyGroup>
<DefaultComposeDir>$(UserProfileRuntimeStorePath)</DefaultComposeDir>
<_ProfilingSymbolsDirectoryName>symbols</_ProfilingSymbolsDirectoryName>
<DefaultProfilingSymbolsDir>$([System.IO.Path]::Combine($(DefaultComposeDir), $(_ProfilingSymbolsDirectoryName)))</DefaultProfilingSymbolsDir>
<ProfilingSymbolsDir Condition="'$(ProfilingSymbolsDir)' == '' and '$(ComposeDir)' != ''">$([System.IO.Path]::Combine($(ComposeDir), $(_ProfilingSymbolsDirectoryName)))</ProfilingSymbolsDir>
<ProfilingSymbolsDir Condition="'$(ProfilingSymbolsDir)' != '' and '$(DoNotDecorateComposeDir)' != 'true'">$([System.IO.Path]::Combine($(ProfilingSymbolsDir), $(PlatformTarget)))</ProfilingSymbolsDir>
<ProfilingSymbolsDir Condition="'$(ProfilingSymbolsDir)' == ''">$(DefaultProfilingSymbolsDir)</ProfilingSymbolsDir>
<ProfilingSymbolsDir Condition="'$(DoNotDecorateComposeDir)' != 'true'">$([System.IO.Path]::Combine($(ProfilingSymbolsDir), $(_TFM)))</ProfilingSymbolsDir>
<ProfilingSymbolsDir Condition="!HasTrailingSlash('$(ProfilingSymbolsDir)')">$(ProfilingSymbolsDir)\</ProfilingSymbolsDir>
<ComposeDir Condition="'$(ComposeDir)' == ''">$(DefaultComposeDir)</ComposeDir>
<ComposeDir Condition="'$(DoNotDecorateComposeDir)' != 'true'">$([System.IO.Path]::Combine($(ComposeDir), $(PlatformTarget)))</ComposeDir>
<ComposeDir Condition="'$(DoNotDecorateComposeDir)' != 'true'">$([System.IO.Path]::Combine($(ComposeDir), $(_TFM)))</ComposeDir>
<StoreArtifactXml>$([System.IO.Path]::Combine($(ComposeDir),"artifact.xml"))</StoreArtifactXml>
<PublishDir>$([System.IO.Path]::GetFullPath($(ComposeDir)))</PublishDir>
<_RandomFileName>$([System.IO.Path]::GetRandomFileName())</_RandomFileName>
<TEMP Condition="'$(TEMP)' == ''">$([System.IO.Path]::GetTempPath())</TEMP>
<ComposeWorkingDir Condition="'$(ComposeWorkingDir)' == ''">$([System.IO.Path]::Combine($(TEMP), $(_RandomFileName)))</ComposeWorkingDir>
<ComposeWorkingDir>$([System.IO.Path]::GetFullPath($(ComposeWorkingDir)))</ComposeWorkingDir>
<StoreStagingDir>$([System.IO.Path]::Combine($(ComposeWorkingDir),"StagingDir"))</StoreStagingDir> <!-- Will contain optimized managed assemblies in nuget cache layout -->
<StoreSymbolsStagingDir>$([System.IO.Path]::Combine($(ComposeWorkingDir),"SymbolsStagingDir"))</StoreSymbolsStagingDir>
<!-- Ensure any PublishDir has a trailing slash, so it can be concatenated -->
<PublishDir Condition="!HasTrailingSlash('$(PublishDir)')">$(PublishDir)\</PublishDir>
</PropertyGroup>
<PropertyGroup Condition="'$(CreateProfilingSymbols)' == ''">
<!-- There is no support for profiling symbols on OSX -->
<CreateProfilingSymbols Condition="$(RuntimeIdentifier.StartsWith('osx'))">false</CreateProfilingSymbols>
<CreateProfilingSymbols Condition="'$(CreateProfilingSymbols)' == ''">true</CreateProfilingSymbols>
</PropertyGroup>
<NETSdkError Condition="Exists($(ComposeWorkingDir))"
ResourceName="FolderAlreadyExists"
FormatArguments="$(ComposeWorkingDir)" />
<MakeDir Directories="$(PublishDir)" />
<MakeDir Directories="$(StoreStagingDir)"/>
</Target>
<Target Name="PrepforRestoreForComposeStore"
DependsOnTargets="_DefaultMicrosoftNETPlatformLibrary">
<PropertyGroup>
<StorePackageVersionForFolderName>$(StorePackageVersion.Replace('*','-'))</StorePackageVersionForFolderName>
<StoreWorkerWorkingDir>$([System.IO.Path]::Combine($(ComposeWorkingDir),"$(StorePackageName)_$(StorePackageVersionForFolderName)"))</StoreWorkerWorkingDir>
<_PackageProjFile>$([System.IO.Path]::Combine($(StoreWorkerWorkingDir), "Restore.csproj"))</_PackageProjFile>
<BaseIntermediateOutputPath>$(StoreWorkerWorkingDir)\</BaseIntermediateOutputPath>
<ProjectAssetsFile>$(BaseIntermediateOutputPath)\project.assets.json</ProjectAssetsFile>
</PropertyGroup>
<PropertyGroup>
<PackagesToPrune>$(MicrosoftNETPlatformLibrary)</PackagesToPrune>
<SelfContained Condition="'$(SelfContained)' == ''">true</SelfContained>
</PropertyGroup>
</Target>
<!--
============================================================
RestoreForComposeStore
Restores the package
============================================================
-->
<Target Name="RestoreForComposeStore"
DependsOnTargets="PrepforRestoreForComposeStore;"
Condition="!Exists($(StoreWorkerWorkingDir))">
<MakeDir Directories="$(StoreWorkerWorkingDir)" />
<MSBuild Projects="$(MSBuildProjectFullPath)"
Targets="Restore"
Properties="RestoreGraphProjectInput=$(MSBuildProjectFullPath);
RestoreOutputPath=$(BaseIntermediateOutputPath);
StorePackageName=$(StorePackageName);
StorePackageVersion=$(StorePackageVersion);
RuntimeIdentifier=$(RuntimeIdentifier);
TargetFramework=$(TargetFramework);"/>
</Target>
<!--
============================================================
ComputeAndCopyFilesToStoreDirectory
Computes the list of all files to copy to the publish directory and then publishes them.
============================================================
-->
<Target Name="ComputeAndCopyFilesToStoreDirectory"
DependsOnTargets="ComputeFilesToStore;
CopyFilesToStoreDirectory" />
<!--
============================================================
CopyFilesToStoreDirectory
Copy all build outputs, satellites and other necessary files to the publish directory.
============================================================
-->
<Target Name="CopyFilesToStoreDirectory"
DependsOnTargets="_CopyResolvedUnOptimizedFiles"/>
<!--
============================================================
_CopyResolvedUnOptimizedFiles
Copy _UnOptimizedResolvedFileToPublish items to the publish directory.
============================================================
-->
<Target Name="_CopyResolvedUnOptimizedFiles"
DependsOnTargets="_ComputeResolvedFilesToStoreTypes;
_RunOptimizer">
<Copy SourceFiles = "@(_UnOptimizedResolvedFileToPublish)"
DestinationFiles="$(PublishDir)%(_UnOptimizedResolvedFileToPublish.DestinationSubPath)"
OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
Retries="$(CopyRetryCount)"
RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
SkipUnchangedFiles="$(SkipUnchangedFiles)">
<Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
</Copy>
</Target>
<!--
============================================================
_ComputeResolvedFilesToStoreTypes
============================================================
-->
<Target Name="_ComputeResolvedFilesToStoreTypes"
DependsOnTargets="_GetResolvedFilesToStore;_SplitResolvedFiles;" />
<!--
============================================================
_SplitResolvedFiles
Splits ResolvedFileToPublish items into 'managed' and 'unmanaged' buckets.
============================================================
-->
<Target Name="_SplitResolvedFiles"
Condition="$(SkipOptimization) !='true' "
DependsOnTargets="_GetResolvedFilesToStore">
<ItemGroup>
<_ManagedResolvedFileToPublishCandidates Include="@(ResolvedFileToPublish)"
Condition="'%(ResolvedFileToPublish.AssetType)'=='runtime'" />
<_UnOptimizedResolvedFileToPublish Include="@(ResolvedFileToPublish)"
Condition="'%(ResolvedFileToPublish.AssetType)'!='runtime'" />
</ItemGroup>
<PropertyGroup>
<SkipOptimization Condition="'@(_ManagedResolvedFileToPublishCandidates)'==''">true</SkipOptimization>
</PropertyGroup>
</Target>
<!--
============================================================
_GetResolvedFilesToStore
============================================================
-->
<Target Name="_GetResolvedFilesToStore"
Condition="$(SkipOptimization) == 'true' ">
<ItemGroup>
<_UnOptimizedResolvedFileToPublish Include="@(ResolvedFileToPublish)" />
</ItemGroup>
</Target>
<!--
============================================================
ComputeFilesToStore
Gathers all the files that need to be copied to the publish directory.
============================================================
-->
<UsingTask TaskName="FilterResolvedFiles" AssemblyFile="$(MicrosoftNETBuildTasksAssembly)" />
<Target Name="ComputeFilesToStore"
DependsOnTargets="_ComputeResolvedCopyLocalPublishAssets;
_ComputeCopyToPublishDirectoryItems">
<PropertyGroup>
<CopyBuildOutputToPublishDirectory Condition="'$(CopyBuildOutputToPublishDirectory)'==''">true</CopyBuildOutputToPublishDirectory>
<CopyOutputSymbolsToPublishDirectory Condition="'$(CopyOutputSymbolsToPublishDirectory)'==''">true</CopyOutputSymbolsToPublishDirectory>
</PropertyGroup>
<FilterResolvedFiles AssetsFilePath="$(ProjectAssetsFile)"
ResolvedFiles ="@(_ResolvedCopyLocalPublishAssets)"
PackagesToPrune="$(PackagesToPrune)"
TargetFramework="$(TargetFramework)"
RuntimeIdentifier="$(RuntimeIdentifier)"
IsSelfContained="$(SelfContained)" >
<Output TaskParameter="AssembliesToPublish" ItemName="ResolvedFileToPublish" />
<Output TaskParameter="PublishedPackages" ItemName="PackagesThatWereResolved" />
</FilterResolvedFiles>
<ItemGroup>
<ResolvedPackagesPublished Include="@(PackagesThatWereResolved)"
Condition="$(DoNotTrackPackageAsResolved) !='true'"/>
</ItemGroup>
</Target>
<!--
============================================================
PrepRestoreForStoreProjects
Removes specified PackageReference for store and inserts the specified StorePackageName
============================================================
-->
<Target Name="PrepRestoreForStoreProjects"
BeforeTargets="_GenerateProjectRestoreGraphPerFramework;"
Condition="'$(StorePackageName)' != ''" >
<ItemGroup>
<PackageReference Remove="@(PackageReference)" Condition="'%(PackageReference.IsImplicitlyDefined)' != 'true'"/>
<PackageReference Include="$(StorePackageName)" Version="$(StorePackageVersion)"/>
</ItemGroup>
</Target>
</Project>
|