in src/Microsoft.NuGet.Build.Tasks/ResolveNuGetPackageAssets.cs [659:720]
private JObject GetTargetOrAttemptFallback(JObject lockFile, bool needsRuntimeIdentifier)
{
var targets = (JObject)lockFile["targets"];
foreach (var preferredTargetMoniker in TargetMonikers)
{
var preferredTargetMonikerWithOptionalRuntimeIdentifier = GetTargetMonikerWithOptionalRuntimeIdentifier(preferredTargetMoniker, needsRuntimeIdentifier);
var target = (JObject)targets[preferredTargetMonikerWithOptionalRuntimeIdentifier];
if (target != null)
{
return target;
}
}
// If we need a runtime identifier, let's see if we have the framework targeted. If we do,
// then we can give a better error message.
bool onlyNeedsRuntimeInProjectJson = false;
if (needsRuntimeIdentifier)
{
foreach (var targetMoniker in TargetMonikers)
{
var targetMonikerWithoutRuntimeIdentifier = GetTargetMonikerWithOptionalRuntimeIdentifier(targetMoniker, needsRuntimeIdentifier: false);
if (targets[targetMonikerWithoutRuntimeIdentifier] != null)
{
// We do have a TXM being targeted, so we just are missing the runtime
onlyNeedsRuntimeInProjectJson = true;
break;
}
}
}
if (onlyNeedsRuntimeInProjectJson)
{
GiveErrorForMissingRuntimeIdentifier();
}
else
{
GiveErrorForMissingFramework();
}
// If we're still here, that means we're allowing fallback, so let's try
foreach (var fallback in TargetMonikers)
{
var target = (JObject)targets[GetTargetMonikerWithOptionalRuntimeIdentifier(fallback, needsRuntimeIdentifier: false)];
if (target != null)
{
return target;
}
}
// Anything goes
var enumerableTargets = targets.Cast<KeyValuePair<string, JToken>>();
var firstTarget = (JObject)enumerableTargets.FirstOrDefault().Value;
if (firstTarget == null)
{
GiveErrorForNoTargets();
}
return firstTarget;
}