diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/ApiCompatRunnerExtensions.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/ApiCompatRunnerExtensions.cs index cd716170e22f..bbfe642007bf 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/ApiCompatRunnerExtensions.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/ApiCompatRunnerExtensions.cs @@ -5,6 +5,7 @@ using Microsoft.DotNet.ApiCompatibility; using Microsoft.DotNet.ApiCompatibility.Logging; using Microsoft.DotNet.ApiCompatibility.Runner; +using Microsoft.DotNet.ApiSymbolExtensions.Logging; using NuGet.ContentModel; using NuGet.Frameworks; @@ -31,6 +32,19 @@ public static void QueueApiCompatFromContentItem(this IApiCompatRunner apiCompat return; } + // Don't perform api compatibility checks on placeholder files. + if (leftContentItems.IsPlaceholderFile() && rightContentItems.IsPlaceholderFile()) + { + leftContentItems[0].Properties.TryGetValue("tfm", out object? tfmRaw); + string tfm = tfmRaw?.ToString() ?? string.Empty; + + log.LogMessage(MessageImportance.Normal, string.Format(Resources.SkipApiCompatForPlaceholderFiles, tfm)); + } + + // Make sure placeholder package files aren't enqueued as api comparison check work items. + Debug.Assert(!leftContentItems.IsPlaceholderFile() && !rightContentItems.IsPlaceholderFile(), + "Placeholder files must not be enqueued for api comparison checks."); + // If a right hand side package is provided in addition to the left side, package validation runs in baseline comparison mode. // The assumption stands that the right hand side is "current" and has more information than the left, i.e. assembly references. // If the left package doesn't provide assembly references, fallback to the references from the right side if the TFMs are compatible. diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Package.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Package.cs index 4546f3678647..6379eab1bdf2 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Package.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Package.cs @@ -6,7 +6,6 @@ using NuGet.ContentModel; using NuGet.Frameworks; using NuGet.Packaging; -using NuGet.Packaging.Core; using NuGet.RuntimeModel; namespace Microsoft.DotNet.PackageValidation @@ -136,7 +135,7 @@ public static Package Create(string? packagePath, IReadOnlyDictionary packageAssets = packageReader.GetFiles().Where(t => t.EndsWith(".dll")).ToArray(); + IEnumerable packageAssets = packageReader.GetFiles().ToArray(); return new Package(packagePath!, packageId, version, packageAssets, packageAssemblyReferences); } diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/PackageExtensions.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/PackageExtensions.cs index 53ae9889d4a9..4ca047c673ad 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/PackageExtensions.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/PackageExtensions.cs @@ -1,12 +1,21 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using NuGet.ContentModel; using NuGet.Frameworks; namespace Microsoft.DotNet.PackageValidation { internal static class PackageExtensions { + private const string PlaceholderFile = "_._"; + + public static bool IsPlaceholderFile(this ContentItem contentItem) => + Path.GetFileName(contentItem.Path) == PlaceholderFile; + + public static bool IsPlaceholderFile(this IReadOnlyList contentItems) => + contentItems.Count == 1 && contentItems[0].IsPlaceholderFile(); + public static bool SupportsRuntimeIdentifier(this NuGetFramework tfm, string rid) => tfm.Framework != ".NETFramework" || rid.StartsWith("win", StringComparison.OrdinalIgnoreCase); } diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Resources.resx b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Resources.resx index 0121374e158a..b927d158ddd2 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Resources.resx +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Resources.resx @@ -1,17 +1,17 @@  - @@ -150,4 +150,7 @@ Target framework '{0}' in the baseline package is ignored but exists in the current package. - \ No newline at end of file + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/BaselinePackageValidator.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/BaselinePackageValidator.cs index 4af23b918507..3f5f509ada0d 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/BaselinePackageValidator.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/BaselinePackageValidator.cs @@ -43,13 +43,21 @@ public void Validate(PackageValidatorOption options) { // Search for compatible compile time assets in the latest package. IReadOnlyList? latestCompileAssets = options.Package.FindBestCompileAssetForFramework(baselineTargetFramework); - if (latestCompileAssets == null) + // Emit an error if + // - No latest compile time asset is available or + // - The latest compile time asset is a placeholder but the baseline compile time asset isn't. + if (latestCompileAssets == null || + (latestCompileAssets.IsPlaceholderFile() && !baselineCompileAssets.IsPlaceholderFile())) { log.LogError(new Suppression(DiagnosticIds.TargetFrameworkDropped) { Target = baselineTargetFramework.ToString() }, DiagnosticIds.TargetFrameworkDropped, string.Format(Resources.MissingTargetFramework, baselineTargetFramework)); } + else if (baselineCompileAssets.IsPlaceholderFile() && !latestCompileAssets.IsPlaceholderFile()) + { + // Ignore the newly added compile time asset in the latest package. + } else if (options.EnqueueApiCompatWorkItems) { apiCompatRunner.QueueApiCompatFromContentItem(log, @@ -67,13 +75,21 @@ public void Validate(PackageValidatorOption options) { // Search for compatible runtime assets in the latest package. IReadOnlyList? latestRuntimeAssets = options.Package.FindBestRuntimeAssetForFramework(baselineTargetFramework); - if (latestRuntimeAssets == null) + // Emit an error if + // - No latest runtime asset is available or + // - The latest runtime asset is a placeholder but the baseline runtime asset isn't. + if (latestRuntimeAssets == null || + (latestRuntimeAssets.IsPlaceholderFile() && !baselineRuntimeAssets.IsPlaceholderFile())) { log.LogError(new Suppression(DiagnosticIds.TargetFrameworkDropped) { Target = baselineTargetFramework.ToString() }, DiagnosticIds.TargetFrameworkDropped, string.Format(Resources.MissingTargetFramework, baselineTargetFramework)); } + else if (baselineRuntimeAssets.IsPlaceholderFile() && !latestRuntimeAssets.IsPlaceholderFile()) + { + // Ignore the newly added run time asset in the latest package. + } else if (options.EnqueueApiCompatWorkItems) { apiCompatRunner.QueueApiCompatFromContentItem(log, @@ -95,8 +111,13 @@ public void Validate(PackageValidatorOption options) foreach (IGrouping baselineRuntimeSpecificAssetsRidGroup in baselineRuntimeSpecificAssetsRidGroupedPerRid) { + IReadOnlyList baselineRuntimeSpecificAssetsForRid = baselineRuntimeSpecificAssetsRidGroup.ToArray(); IReadOnlyList? latestRuntimeSpecificAssets = options.Package.FindBestRuntimeAssetForFrameworkAndRuntime(baselineTargetFramework, baselineRuntimeSpecificAssetsRidGroup.Key); - if (latestRuntimeSpecificAssets == null) + // Emit an error if + // - No latest runtime specific asset is available or + // - The latest runtime specific asset is a placeholder but the baseline runtime specific asset isn't. + if (latestRuntimeSpecificAssets == null || + (latestRuntimeSpecificAssets.IsPlaceholderFile() && !baselineRuntimeSpecificAssetsForRid.IsPlaceholderFile())) { log.LogError(new Suppression(DiagnosticIds.TargetFrameworkAndRidPairDropped) { Target = baselineTargetFramework.ToString() + "-" + baselineRuntimeSpecificAssetsRidGroup.Key }, DiagnosticIds.TargetFrameworkAndRidPairDropped, @@ -104,10 +125,14 @@ public void Validate(PackageValidatorOption options) baselineTargetFramework, baselineRuntimeSpecificAssetsRidGroup.Key)); } + else if (baselineRuntimeSpecificAssetsForRid.IsPlaceholderFile() && !latestRuntimeSpecificAssets.IsPlaceholderFile()) + { + // Ignore the newly added runtime specific asset in the latest package. + } else if (options.EnqueueApiCompatWorkItems) { apiCompatRunner.QueueApiCompatFromContentItem(log, - baselineRuntimeSpecificAssetsRidGroup.ToArray(), + baselineRuntimeSpecificAssetsForRid, latestRuntimeSpecificAssets, apiCompatOptions, options.BaselinePackage, diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleFrameworkInPackageValidator.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleFrameworkInPackageValidator.cs index c599f56c00ff..e6ff8b94bf20 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleFrameworkInPackageValidator.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleFrameworkInPackageValidator.cs @@ -40,29 +40,28 @@ public void Validate(PackageValidatorOption options) foreach (NuGetFramework framework in options.Package.FrameworksInPackage.OrderByDescending(f => f.Version)) { IReadOnlyList? compileTimeAsset = options.Package.FindBestCompileAssetForFramework(framework); - if (compileTimeAsset != null) + if (compileTimeAsset != null && !compileTimeAsset.IsPlaceholderFile()) + { compileAssetsQueue.Enqueue((framework, compileTimeAsset)); + } } - while (compileAssetsQueue.Count > 0) + // Iterate as long as assets are available for comparison. + while (compileAssetsQueue.Count > 1) { (NuGetFramework framework, IReadOnlyList compileTimeAsset) = compileAssetsQueue.Dequeue(); - // If no assets are available for comparison, stop the iteration. - if (compileAssetsQueue.Count == 0) break; - SelectionCriteria managedCriteria = conventions.Criteria.ForFramework(framework); - ContentItemCollection contentItemCollection = new(); // The collection won't contain the current compile time asset as it is already dequeued. contentItemCollection.Load(compileAssetsQueue.SelectMany(a => a.Item2).Select(a => a.Path)); // Search for a compatible compile time asset and compare it. - IList? compatibleFrameworkAsset = contentItemCollection.FindBestItemGroup(managedCriteria, patternSet)?.Items; - if (compatibleFrameworkAsset != null) + IList? compatibleCompileTimeAsset = contentItemCollection.FindBestItemGroup(managedCriteria, patternSet)?.Items; + if (compatibleCompileTimeAsset != null) { apiCompatRunner.QueueApiCompatFromContentItem(log, - new ReadOnlyCollection(compatibleFrameworkAsset), + new ReadOnlyCollection(compatibleCompileTimeAsset), compileTimeAsset, apiCompatOptions, options.Package); diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleTFMValidator.cs b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleTFMValidator.cs index bae28f39fb79..8629a3a85c1d 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleTFMValidator.cs +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/Validators/CompatibleTFMValidator.cs @@ -45,18 +45,33 @@ public void Validate(PackageValidatorOption options) DiagnosticIds.ApplicableCompileTimeAsset, string.Format(Resources.NoCompatibleCompileTimeAsset, framework)); - break; + continue; } IReadOnlyList? runtimeAsset = options.Package.FindBestRuntimeAssetForFramework(framework); - if (runtimeAsset == null) + // Emit an error if + // - No runtime asset is available or + // - The runtime asset is a placeholder but the compile time asset isn't. + if (runtimeAsset == null || + (runtimeAsset.IsPlaceholderFile() && !compileTimeAsset.IsPlaceholderFile())) { log.LogError(new Suppression(DiagnosticIds.CompatibleRuntimeRidLessAsset) { Target = framework.ToString() }, DiagnosticIds.CompatibleRuntimeRidLessAsset, string.Format(Resources.NoCompatibleRuntimeAsset, framework)); } - // Invoke ApiCompat to compare the compile time asset with the runtime asset if they are not the same assembly. + // Ignore the additional runtime asset when performing in non-strict mode, otherwise emit a missing + // compile time asset error. + else if (compileTimeAsset.IsPlaceholderFile() && !runtimeAsset.IsPlaceholderFile()) + { + if (options.EnableStrictMode) + { + log.LogError(new Suppression(DiagnosticIds.ApplicableCompileTimeAsset, framework.ToString()), + DiagnosticIds.ApplicableCompileTimeAsset, + string.Format(Resources.NoCompatibleCompileTimeAsset, framework.ToString())); + } + } + // Invoke ApiCompat to compare the compile time asset with the runtime asset. else if (options.EnqueueApiCompatWorkItems) { apiCompatRunner.QueueApiCompatFromContentItem(log, @@ -69,7 +84,11 @@ public void Validate(PackageValidatorOption options) foreach (string rid in options.Package.Rids.Where(packageRid => framework.SupportsRuntimeIdentifier(packageRid))) { IReadOnlyList? runtimeRidSpecificAsset = options.Package.FindBestRuntimeAssetForFrameworkAndRuntime(framework, rid); - if (runtimeRidSpecificAsset == null) + // Emit an error if + // - No runtime specific asset is available or + // - The runtime specific asset is a placeholder but the compile time asset isn't. + if (runtimeRidSpecificAsset == null || + (runtimeRidSpecificAsset.IsPlaceholderFile() && !compileTimeAsset.IsPlaceholderFile())) { log.LogError(new Suppression(DiagnosticIds.CompatibleRuntimeRidSpecificAsset) { Target = framework.ToString() + "-" + rid }, DiagnosticIds.CompatibleRuntimeRidSpecificAsset, @@ -77,8 +96,18 @@ public void Validate(PackageValidatorOption options) framework, rid)); } - // Invoke ApiCompat to compare the compile time asset with the runtime specific asset if they are not the same and - // if the comparison hasn't already happened (when the runtime asset is the same as the runtime specific asset). + // Ignore the additional runtime specific asset when performing in non-strict mode, otherwise emit a + // missing compile time asset error. + else if (compileTimeAsset.IsPlaceholderFile() && !runtimeRidSpecificAsset.IsPlaceholderFile()) + { + if (options.EnableStrictMode) + { + log.LogError(new Suppression(DiagnosticIds.ApplicableCompileTimeAsset, framework.ToString()), + DiagnosticIds.ApplicableCompileTimeAsset, + string.Format(Resources.NoCompatibleCompileTimeAsset, framework.ToString())); + } + } + // Invoke ApiCompat to compare the compile asset with the runtime specific asset. else if (options.EnqueueApiCompatWorkItems) { apiCompatRunner.QueueApiCompatFromContentItem(log, @@ -100,7 +129,7 @@ private static Dictionary> InitializeTfm { Dictionary> packageTfmMapping = []; - // creating a map framework in package => frameworks to test based on default compatibilty mapping. + // creating a map framework in package => frameworks to test based on default compatibility mapping. foreach (OneWayCompatibilityMappingEntry item in DefaultFrameworkMappings.Instance.CompatibilityMappings) { NuGetFramework forwardTfm = item.SupportedFrameworkRange.Max; diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.cs.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.cs.xlf index 930fbc5eeba4..c94e020d1142 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.cs.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.cs.xlf @@ -57,6 +57,11 @@ Balíček {0} se nenašel. Zadejte prosím platnou cestu k balíčku. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.de.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.de.xlf index 6a0e22a3a81f..3f73821766f4 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.de.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.de.xlf @@ -57,6 +57,11 @@ Das Paket "{0}" wurde nicht gefunden. Geben Sie einen gültigen Paketpfad an. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.es.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.es.xlf index a4395fa243a9..e38a6c9dfa21 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.es.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.es.xlf @@ -57,6 +57,11 @@ No se encontró el paquete "{0}". Indique una ruta de acceso de paquete válida. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.fr.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.fr.xlf index e15f53df2b62..55cb6b176633 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.fr.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.fr.xlf @@ -57,6 +57,11 @@ Package « {0} » introuvable. Indiquez un chemin d’accès de package valide. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.it.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.it.xlf index c4113c6b5b7a..a829546713ef 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.it.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.it.xlf @@ -57,6 +57,11 @@ Pacchetto '{0}' non trovato. Specificare un percorso valido per il pacchetto. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ja.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ja.xlf index aaa4640eaff4..2e6f73ba2803 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ja.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ja.xlf @@ -57,6 +57,11 @@ パッケージ '{0}' が見つかりません。有効なパッケージ パスを指定してください。 + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ko.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ko.xlf index 4fafeeabc6b2..d3922ef75cfc 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ko.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ko.xlf @@ -57,6 +57,11 @@ 패키지 '{0}'을(를) 찾을 수 없습니다. 유효한 패키지 경로를 제공하세요. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pl.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pl.xlf index 407ca2c15162..6312bd2d82ae 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pl.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pl.xlf @@ -57,6 +57,11 @@ Nie znaleziono pakietu "{0}". Podaj prawidłową ścieżkę pakietu. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pt-BR.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pt-BR.xlf index b3bda17b4a2d..90cb16142c34 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pt-BR.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.pt-BR.xlf @@ -57,6 +57,11 @@ Pacote '{0}' não encontrado. Forneça um caminho de pacote válido. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ru.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ru.xlf index aeb399fa36f9..7142957d42e1 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ru.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.ru.xlf @@ -57,6 +57,11 @@ Пакет "{0}" не найден. Укажите допустимый путь к пакету. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.tr.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.tr.xlf index ed1c35345937..a9e65c2e8459 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.tr.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.tr.xlf @@ -57,6 +57,11 @@ “{0}“ paketi bulunamadı. Lütfen daha geçerli bir paket yolu sağlayın. + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hans.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hans.xlf index 62aef516671a..7a404d596bc8 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hans.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hans.xlf @@ -57,6 +57,11 @@ 未找到包“{0}”。请提供有效的包路径。 + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file diff --git a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hant.xlf b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hant.xlf index 5d447aab0f26..613ea9cc906a 100644 --- a/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hant.xlf +++ b/src/Compatibility/ApiCompat/Microsoft.DotNet.PackageValidation/xlf/Resources.zh-Hant.xlf @@ -57,6 +57,11 @@ 找不到套件 '{0}'。請提供有效的套件路徑。 + + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + Skipping api compatiblity check for target framework {0} as the package assets are placeholder files. + + \ No newline at end of file