55using System . Collections . Generic ;
66using System . Globalization ;
77using System . Linq ;
8+ using NuGet . Common ;
89using NuGet . Frameworks ;
910using NuGet . LibraryModel ;
1011using NuGet . ProjectModel ;
@@ -27,6 +28,13 @@ public static void ValidateDependencySpec(DependencyGraphSpec spec)
2728 /// </summary>
2829 public static void ValidateDependencySpec ( DependencyGraphSpec spec , HashSet < string > projectsToSkip )
2930 {
31+ ValidateDependencySpec ( spec , projectsToSkip , NullLogger . Instance ) ;
32+ }
33+
34+ public static void ValidateDependencySpec ( DependencyGraphSpec spec , HashSet < string > projectsToSkip , ILogger logger )
35+ {
36+ logger ??= NullLogger . Instance ;
37+
3038 if ( spec == null )
3139 {
3240 throw new ArgumentNullException ( nameof ( spec ) ) ;
@@ -39,7 +47,7 @@ public static void ValidateDependencySpec(DependencyGraphSpec spec, HashSet<stri
3947 {
4048 if ( ! projectsToSkip . Contains ( projectSpec . FilePath ) )
4149 {
42- ValidateProjectSpec ( projectSpec ) ;
50+ ValidateProjectSpec ( projectSpec , logger ) ;
4351 }
4452 }
4553
@@ -77,6 +85,11 @@ public static void ValidateDependencySpec(DependencyGraphSpec spec, HashSet<stri
7785 }
7886
7987 public static void ValidateProjectSpec ( PackageSpec spec )
88+ {
89+ ValidateProjectSpec ( spec , NullLogger . Instance ) ;
90+ }
91+
92+ private static void ValidateProjectSpec ( PackageSpec spec , ILogger logger )
8093 {
8194 if ( spec == null )
8295 {
@@ -123,15 +136,15 @@ public static void ValidateProjectSpec(PackageSpec spec)
123136 switch ( projectStyle )
124137 {
125138 case ProjectStyle . PackageReference :
126- ValidateProjectSpecPackageReference ( spec , files ) ;
139+ ValidateProjectSpecPackageReference ( spec , files , logger ) ;
127140 break ;
128141
129142 case ProjectStyle . DotnetToolReference :
130- ValidateProjectSpecPackageReference ( spec , files ) ;
143+ ValidateProjectSpecPackageReference ( spec , files , logger ) ;
131144 break ;
132145
133146 case ProjectStyle . ProjectJson :
134- ValidateProjectSpecUAP ( spec , files ) ;
147+ ValidateProjectSpecUAP ( spec , files , logger ) ;
135148 break ;
136149
137150 default :
@@ -141,44 +154,56 @@ public static void ValidateProjectSpec(PackageSpec spec)
141154 }
142155 }
143156
144- private static void ValidateFrameworks ( PackageSpec spec , IEnumerable < string > files )
157+ private static void ValidateFrameworks ( PackageSpec spec , IEnumerable < string > files , ILogger logger )
145158 {
146- var frameworks = spec . TargetFrameworks . Select ( f => f . FrameworkName ) . ToArray ( ) ;
159+ if ( spec . TargetFrameworks == null )
160+ {
161+ throw RestoreSpecException . Create ( Strings . SpecValidationNoFrameworks , files ) ;
162+ }
147163
148- // Verify frameworks are valid
149- foreach ( var framework in frameworks . Where ( f => ! f . IsSpecificFramework ) )
164+ bool hasInvalidFrameworks = false ;
165+ List < NuGetFramework > frameworkNames = new List < NuGetFramework > ( spec . TargetFrameworks . Count ) ;
166+
167+ foreach ( var framework in spec . TargetFrameworks )
150168 {
151- var message = string . Format (
152- CultureInfo . CurrentCulture ,
153- Strings . SpecValidationInvalidFramework ,
154- framework . GetShortFolderName ( ) ) ;
169+ frameworkNames . Add ( framework . FrameworkName ) ;
155170
156- throw RestoreSpecException . Create ( message , files ) ;
171+ if ( ! framework . FrameworkName . IsSpecificFramework )
172+ {
173+ hasInvalidFrameworks |= true ;
174+ var message = string . Format ( CultureInfo . CurrentCulture , Strings . SpecValidationInvalidFramework , framework . TargetAlias ) ;
175+ logger . Log ( new RestoreLogMessage ( LogLevel . Error , NuGetLogCode . NU1105 , message ) { FilePath = spec . FilePath , ProjectPath = spec . FilePath } ) ;
176+ }
177+ }
178+
179+ if ( hasInvalidFrameworks )
180+ {
181+ throw RestoreSpecException . Create ( string . Format ( CultureInfo . CurrentCulture , Strings . Invalid_Framework ) , files ) ;
157182 }
158183
159184 // Must have at least 1 framework
160- if ( frameworks . Length < 1 )
185+ if ( frameworkNames . Count < 1 )
161186 {
162187 throw RestoreSpecException . Create ( Strings . SpecValidationNoFrameworks , files ) ;
163188 }
164189
165190 // Duplicate frameworks may not exist
166191 // Change in ATF should *not* affect our duplicate check, so we use the full framework comparer.
167- if ( frameworks . Length != frameworks . Distinct ( NuGetFrameworkFullComparer . Instance ) . Count ( ) )
192+ if ( frameworkNames . Count != frameworkNames . Distinct ( NuGetFrameworkFullComparer . Instance ) . Count ( ) )
168193 {
169194 var message = string . Format (
170195 CultureInfo . CurrentCulture ,
171196 Strings . SpecValidationDuplicateFrameworks ,
172- string . Join ( ", " , frameworks . Select ( f => f . GetShortFolderName ( ) ) ) ) ;
197+ string . Join ( ", " , frameworkNames . Select ( f => f . GetShortFolderName ( ) ) ) ) ;
173198
174199 throw RestoreSpecException . Create ( message , files ) ;
175200 }
176201 }
177202
178- private static void ValidateProjectSpecPackageReference ( PackageSpec spec , IEnumerable < string > files )
203+ private static void ValidateProjectSpecPackageReference ( PackageSpec spec , IEnumerable < string > files , ILogger logger )
179204 {
180205 // Verify frameworks
181- ValidateFrameworks ( spec , files ) ;
206+ ValidateFrameworks ( spec , files , logger ) ;
182207
183208 // NETCore may not specify a project.json file
184209 if ( ! string . IsNullOrEmpty ( spec . RestoreMetadata . ProjectJsonPath ) )
@@ -234,10 +259,10 @@ private static void ValidateProjectSpecPackageReference(PackageSpec spec, IEnume
234259 }
235260 }
236261
237- private static void ValidateProjectSpecUAP ( PackageSpec spec , IEnumerable < string > files )
262+ private static void ValidateProjectSpecUAP ( PackageSpec spec , IEnumerable < string > files , ILogger logger )
238263 {
239264 // Verify frameworks
240- ValidateFrameworks ( spec , files ) ;
265+ ValidateFrameworks ( spec , files , logger ) ;
241266
242267 // UAP may contain only 1 framework
243268 if ( spec . TargetFrameworks . Count != 1 )
0 commit comments