|
4 | 4 | <PropertyGroup> |
5 | 5 | <_FullOutputPath>$([MSBuild]::NormalizePath($(MSBuildProjectDirectory), '$(OutputPath)'))</_FullOutputPath> |
6 | 6 | <_FullIntermediateOutputPath>$([MSBuild]::NormalizePath($(MSBuildProjectDirectory), '$(IntermediateOutputPath)'))</_FullIntermediateOutputPath> |
7 | | - <EFGeneratedSourcesFile Condition="'$(EFGeneratedSourcesFile)' == ''">$(_FullIntermediateOutputPath)$(AssemblyName).EFGeneratedSources.txt</EFGeneratedSourcesFile> |
| 7 | + <EFGeneratedSourcesBuildFile Condition="'$(EFGeneratedSourcesBuildFile)' == ''">$(_FullIntermediateOutputPath)$(AssemblyName).EFGeneratedSources.Build.txt</EFGeneratedSourcesBuildFile> |
| 8 | + <EFGeneratedSourcesPublishFile Condition="'$(EFGeneratedSourcesPublishFile)' == ''">$(_FullIntermediateOutputPath)$(AssemblyName).EFGeneratedSources.Publish.txt</EFGeneratedSourcesPublishFile> |
8 | 9 | <EFProjectsToOptimizePath Condition="'$(EFProjectsToOptimizePath)' == ''">$(_FullIntermediateOutputPath)EFProjectsToOptimize\</EFProjectsToOptimizePath> |
9 | 10 | <_AssemblyFullName>$(_FullOutputPath)$(AssemblyName).dll</_AssemblyFullName> |
10 | 11 | <CoreCompileDependsOn>$(CoreCompileDependsOn);_EFPrepareForCompile</CoreCompileDependsOn> |
|
14 | 15 | <_AssemblyFullName>$(_FullOutputPath)$(AssemblyName).exe</_AssemblyFullName> |
15 | 16 | </PropertyGroup> |
16 | 17 |
|
| 18 | + <Target Name="_EFGenerateFilesAfterBuild" |
| 19 | + AfterTargets="Build" |
| 20 | + Condition="Exists($(EFProjectsToOptimizePath)) And '$(_EFGenerationStage)'==''"> |
| 21 | + <MSBuild Projects="$(MSBuildProjectFullPath)" |
| 22 | + Targets="_EFGenerateFiles" |
| 23 | + BuildInParallel="$(BuildInParallel)" |
| 24 | + ContinueOnError="$(ContinueOnError)" |
| 25 | + Properties="Configuration=$(Configuration);Platform=$(Platform);_EFGenerationStage=build" /> |
| 26 | + </Target> |
| 27 | + |
| 28 | + <Target Name="_EFGenerateFilesBeforePublish" |
| 29 | + AfterTargets="GetCopyToPublishDirectoryItems" |
| 30 | + BeforeTargets="GeneratePublishDependencyFile" |
| 31 | + Condition="Exists($(EFProjectsToOptimizePath)) And '$(_EFGenerationStage)'==''"> |
| 32 | + <MSBuild Projects="$(MSBuildProjectFullPath)" |
| 33 | + Targets="_EFGenerateFiles" |
| 34 | + BuildInParallel="$(BuildInParallel)" |
| 35 | + ContinueOnError="$(ContinueOnError)" |
| 36 | + Properties="Configuration=$(Configuration);Platform=$(Platform);_EFGenerationStage=publish" /> |
| 37 | + </Target> |
| 38 | + |
17 | 39 | <!-- Invokes OptimizeDbContext on projects that had changes since the last time they were optimized --> |
18 | | - <Target Name="_EFGenerateFiles" |
19 | | - AfterTargets="Build" |
20 | | - Condition="Exists($(EFProjectsToOptimizePath)) And '$(_InEFGenerateFiles)'!='true'"> |
| 40 | + <Target Name="_EFGenerateFiles"> |
21 | 41 | <ItemGroup> |
22 | 42 | <_EFProjectsToOptimizeFiles Include="$(EFProjectsToOptimizePath)*.*" /> |
23 | 43 | </ItemGroup> |
|
31 | 51 | <!-- The startup assembly used for file generation should be compiled without using AOT mode --> |
32 | 52 | <MSBuild Projects="$(MSBuildProjectFullPath)" |
33 | 53 | Targets="Build" |
34 | | - BuildInParallel="true" |
| 54 | + BuildInParallel="$(BuildInParallel)" |
| 55 | + ContinueOnError="$(ContinueOnError)" |
35 | 56 | Condition="'$(PublishAot)'=='true'" |
36 | | - Properties="Configuration=$(Configuration);Platform=$(Platform);EFOptimizeContext=false;PublishAot=false" /> |
| 57 | + Properties="Configuration=$(Configuration);Platform=$(Platform);PublishAot=false;_EFGenerationStage=$(_EFGenerationStage)" /> |
37 | 58 |
|
38 | 59 | <MSBuild Projects="@(_EFProjectsToOptimize)" |
39 | 60 | Targets="OptimizeDbContext" |
40 | | - BuildInParallel="true" |
41 | | - Properties="Configuration=$(Configuration);Platform=$(Platform);EFStartupAssembly=$(_AssemblyFullName)" /> |
| 61 | + BuildInParallel="$(BuildInParallel)" |
| 62 | + ContinueOnError="$(ContinueOnError)" |
| 63 | + Properties="Configuration=$(Configuration);Platform=$(Platform);EFStartupAssembly=$(_AssemblyFullName);_EFGenerationStage=$(_EFGenerationStage)" /> |
42 | 64 |
|
43 | 65 | <ItemGroup> |
44 | 66 | <_EFProjectsToOptimize Remove="$(MSBuildProjectFullPath)" /> |
|
47 | 69 | <!-- This assumes that the optimized projects are dependencies, so the current project needs to be recompiled too --> |
48 | 70 | <MSBuild Projects="$(MSBuildProjectFullPath)" |
49 | 71 | Targets="Build" |
50 | | - BuildInParallel="true" |
| 72 | + BuildInParallel="$(BuildInParallel)" |
| 73 | + ContinueOnError="$(ContinueOnError)" |
51 | 74 | Condition="@(_EFProjectsToOptimize->Count()) > 0" |
52 | | - Properties="Configuration=$(Configuration);Platform=$(Platform);_InEFGenerateFiles=true" /> |
| 75 | + Properties="Configuration=$(Configuration);Platform=$(Platform);_EFGenerationStage=$(_EFGenerationStage)" /> |
53 | 76 | </Target> |
54 | 77 |
|
55 | | - <Target Name="OptimizeDbContext" |
56 | | - Inputs="$(_AssemblyFullName)" |
57 | | - Outputs="$(EFGeneratedSourcesFile)" |
58 | | - Returns="$(_EFGeneratedFiles)"> |
| 78 | + <Target Name="OptimizeDbContext"> |
59 | 79 | <PropertyGroup> |
60 | 80 | <EFRootNamespace Condition="'$(EFRootNamespace)'==''">$(RootNamespace)</EFRootNamespace> |
61 | 81 | <EFRootNamespace Condition="'$(EFRootNamespace)'==''">$(AssemblyName)</EFRootNamespace> |
62 | 82 | <EFTargetNamespace Condition="'$(EFTargetNamespace)'==''">$(EFRootNamespace)</EFTargetNamespace> |
63 | 83 | <EFOutputDir Condition="'$(EFOutputDir)'==''">$(_FullIntermediateOutputPath)</EFOutputDir> |
64 | | - <EFNullable>false</EFNullable> |
65 | | - </PropertyGroup> |
66 | | - |
67 | | - <PropertyGroup Condition="'$(Nullable)'=='enable' Or '$(Nullable)'=='annotations'"> |
68 | | - <EFNullable>true</EFNullable> |
| 84 | + <_EFNoScaffold>true</_EFNoScaffold> |
| 85 | + <_EFNoScaffold Condition="'$(_EFGenerationStage)'=='$(EFScaffoldModelStage)'">false</_EFNoScaffold> |
| 86 | + <_EFPrecompileQueries>false</_EFPrecompileQueries> |
| 87 | + <_EFPrecompileQueries Condition="'$(_EFGenerationStage)'=='$(EFPrecompileQueriesStage)'">true</_EFPrecompileQueries> |
| 88 | + <EFNullable Condition="'$(Nullable)'=='enable' Or '$(Nullable)'=='annotations'">true</EFNullable> |
| 89 | + <EFNullable Condition="'$(EFNullable)'==''">false</EFNullable> |
69 | 90 | </PropertyGroup> |
70 | 91 |
|
71 | 92 | <OptimizeDbContext Assembly="$(_AssemblyFullName)" |
|
79 | 100 | Language="$(Language)" |
80 | 101 | Nullable="$(EFNullable)" |
81 | 102 | OutputDir="$(EFOutputDir)" |
82 | | - ProjectDir="$(MSBuildProjectDirectory)"> |
| 103 | + Project="$(MSBuildProjectFullPath)" |
| 104 | + ProjectDir="$(MSBuildProjectDirectory)" |
| 105 | + NoScaffold="$(_EFNoScaffold)" |
| 106 | + PrecompileQueries="$(_EFPrecompileQueries)"> |
83 | 107 | <Output TaskParameter="GeneratedFiles" PropertyName="_EFGeneratedFiles" /> |
84 | 108 | </OptimizeDbContext> |
85 | 109 |
|
86 | | - <Delete Files="$(EFGeneratedSourcesFile)" /> |
| 110 | + <Delete Files="$(EFGeneratedSourcesBuildFile)" |
| 111 | + Condition="'$(_EFGenerationStage)'=='build'"/> |
| 112 | + <Delete Files="$(EFGeneratedSourcesPublishFile)" |
| 113 | + Condition="'$(_EFGenerationStage)'=='publish'"/> |
87 | 114 |
|
88 | 115 | <CallTarget Targets="Build"/> |
89 | 116 |
|
90 | | - <WriteLinesToFile File="$(EFGeneratedSourcesFile)" Lines="$(_EFGeneratedFiles)"/> |
| 117 | + <WriteLinesToFile File="$(EFGeneratedSourcesBuildFile)" |
| 118 | + Lines="$(_EFGeneratedFiles)" |
| 119 | + Condition="'$(_EFGenerationStage)'=='build'"/> |
| 120 | + <WriteLinesToFile File="$(EFGeneratedSourcesPublishFile)" |
| 121 | + Lines="$(_EFGeneratedFiles)" |
| 122 | + Condition="'$(_EFGenerationStage)'=='publish'"/> |
| 123 | + </Target> |
| 124 | + |
| 125 | + <Target Name="_EFValidateProperties" |
| 126 | + BeforeTargets="CoreCompile"> |
| 127 | + <Error Condition="'$(EFScaffoldModelStage)'=='publish' And '$(EFPrecompileQueriesStage)'=='build'" |
| 128 | + Text="If %24(EFScaffoldModelStage) is set to 'publish' then %24(EFPrecompileQueriesStage) must also be set to 'publish'."/> |
91 | 129 | </Target> |
92 | 130 |
|
93 | 131 | <!-- Read the previously generated files --> |
94 | 132 | <Target Name="_EFReadGeneratedFilesList" |
95 | | - BeforeTargets="_EFProcessGeneratedFiles;_EFCleanupGeneratedFiles" |
96 | | - Condition="'$(EFOptimizeContext)'=='true' And Exists($(EFGeneratedSourcesFile))"> |
97 | | - <ReadLinesFromFile File="$(EFGeneratedSourcesFile)"> |
| 133 | + BeforeTargets="_EFProcessGeneratedFiles;_EFCleanGeneratedFiles"> |
| 134 | + <ReadLinesFromFile File="$(EFGeneratedSourcesBuildFile)" |
| 135 | + Condition="Exists($(EFGeneratedSourcesBuildFile))"> |
| 136 | + <Output TaskParameter="Lines" ItemName="_ReadGeneratedFiles"/> |
| 137 | + </ReadLinesFromFile> |
| 138 | + <ReadLinesFromFile File="$(EFGeneratedSourcesPublishFile)" |
| 139 | + Condition="Exists($(EFGeneratedSourcesPublishFile))"> |
98 | 140 | <Output TaskParameter="Lines" ItemName="_ReadGeneratedFiles"/> |
99 | 141 | </ReadLinesFromFile> |
100 | 142 |
|
|
111 | 153 | </ItemGroup> |
112 | 154 | </Target> |
113 | 155 |
|
114 | | - <!-- Removes the outdated generated files from compilation and registers this project for optimization |
| 156 | + <!-- Removes the outdated generated files from compilation and registers this project for after-compile optimization |
115 | 157 | This target has the same Inputs and Outputs as CoreCompile to run only if CoreCompile isn't going to be skipped --> |
116 | 158 | <Target Name="_EFPrepareForCompile" |
117 | 159 | DependsOnTargets="_EFProcessGeneratedFiles" |
118 | | - Condition="'$(EFOptimizeContext)'=='true' And '$(_InEFGenerateFiles)'!='true'" |
| 160 | + Condition="'$(_EFGenerationStage)'==''" |
119 | 161 | Inputs="$(MSBuildAllProjects); |
120 | 162 | @(Compile); |
121 | 163 | @(_CoreCompileResourceInputs); |
|
144 | 186 | <Compile Remove="@(_EFGeneratedFiles)" /> |
145 | 187 | </ItemGroup> |
146 | 188 |
|
| 189 | + <Delete Files="$(EFGeneratedSourcesBuildFile)" /> |
| 190 | + <Delete Files="$(EFGeneratedSourcesPublishFile)" /> |
| 191 | + |
| 192 | + <MSBuild Projects="$(EFStartupProject)" |
| 193 | + Targets="_EFRegisterProjectToOptimize" |
| 194 | + Condition="'$(EFOptimizeContext)'=='true' And ('$(EFScaffoldModelStage)'=='build' Or '$(EFPrecompileQueriesStage)'=='build')" |
| 195 | + Properties="Configuration=$(Configuration);Platform=$(Platform);_EFProjectToOptimize=$(MSBuildProjectFullPath)" /> |
| 196 | + </Target> |
| 197 | + |
| 198 | + <!-- Registers this project for before-publish optimization --> |
| 199 | + <Target Name="_EFPrepareForPublish" |
| 200 | + BeforeTargets="GetCopyToPublishDirectoryItems" |
| 201 | + Condition="'$(_EFGenerationStage)'=='' And ('$(EFScaffoldModelStage)'=='publish' Or '$(EFPrecompileQueriesStage)'=='publish') And ('$(EFOptimizeContext)'=='true' Or ('$(EFOptimizeContext)'=='' And ('$(_EFPublishAOT)'=='true' Or '$(PublishAOT)'=='true')))"> |
147 | 202 | <MSBuild Projects="$(EFStartupProject)" |
148 | 203 | Targets="_EFRegisterProjectToOptimize" |
149 | 204 | Properties="Configuration=$(Configuration);Platform=$(Platform);_EFProjectToOptimize=$(MSBuildProjectFullPath)" /> |
150 | 205 | </Target> |
151 | 206 |
|
| 207 | + <!-- Go through the dependencies to check whether they need code generated for Native AOT --> |
| 208 | + <Target Name="_EFPrepareDependenciesForPublishAOT" |
| 209 | + BeforeTargets="GetCopyToPublishDirectoryItems" |
| 210 | + Condition="'$(PublishAOT)'=='true' And '$(_EFGenerationStage)'=='' and '@(_MSBuildProjectReferenceExistent)' != ''"> |
| 211 | + <MSBuild |
| 212 | + Projects="@(_MSBuildProjectReferenceExistent)" |
| 213 | + Targets="_EFPrepareForPublish" |
| 214 | + BuildInParallel="$(BuildInParallel)" |
| 215 | + Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform); %(_MSBuildProjectReferenceExistent.SetTargetFramework); _EFPublishAOT=true" |
| 216 | + Condition="'%(_MSBuildProjectReferenceExistent.BuildReference)' == 'true' and '@(ProjectReferenceWithConfiguration)' != '' " |
| 217 | + ContinueOnError="$(ContinueOnError)" |
| 218 | + SkipNonexistentTargets="true" |
| 219 | + RemoveProperties="%(_MSBuildProjectReferenceExistent.GlobalPropertiesToRemove)$(_GlobalPropertiesToRemoveFromProjectReferences)"> |
| 220 | + |
| 221 | + <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths"/> |
| 222 | + </MSBuild> |
| 223 | + </Target> |
| 224 | + |
152 | 225 | <Target Name="_EFRegisterProjectToOptimize"> |
153 | 226 | <PropertyGroup> |
154 | 227 | <_ProjectName>$([System.IO.Path]::GetFileName('$(_EFProjectToOptimize)'))</_ProjectName> |
|
159 | 232 |
|
160 | 233 | <Target Name="_EFCleanGeneratedFiles" AfterTargets="Clean"> |
161 | 234 | <Delete Files="@(_EFGeneratedFiles)" /> |
162 | | - <Delete Files="$(EFGeneratedSourcesFile)" /> |
| 235 | + <Delete Files="$(EFGeneratedSourcesBuildFile)" /> |
| 236 | + <Delete Files="$(EFGeneratedSourcesPublishFile)" /> |
163 | 237 | <RemoveDir Directories="$(EFProjectsToOptimizePath)" /> |
164 | 238 | </Target> |
165 | 239 |
|
|
0 commit comments