diff --git a/NuGet.config b/NuGet.config index cc148e3a0bda..91d796ee1d29 100644 --- a/NuGet.config +++ b/NuGet.config @@ -14,6 +14,8 @@ + + diff --git a/build/RunTestsOnHelix.cmd b/build/RunTestsOnHelix.cmd index b3d7c133baf5..e42f06e7e5f7 100644 --- a/build/RunTestsOnHelix.cmd +++ b/build/RunTestsOnHelix.cmd @@ -25,6 +25,10 @@ set DOTNET_CLI_HOME=%TestExecutionDirectory%\.dotnet mkdir %TestExecutionDirectory% robocopy %HELIX_CORRELATION_PAYLOAD%\t\TestExecutionDirectoryFiles %TestExecutionDirectory% /s +set DOTNET_SDK_TEST_EXECUTION_DIRECTORY=%TestExecutionDirectory% +set DOTNET_SDK_TEST_MSBUILDSDKRESOLVER_FOLDER=%HELIX_CORRELATION_PAYLOAD%\r +set DOTNET_SDK_TEST_ASSETS_DIRECTORY=%TestExecutionDirectory%\assets + REM call dotnet new so the first run message doesn't interfere with the first test dotnet new --debug:ephemeral-hive REM avoid potetial concurrency issues when nuget is creating nuget.config diff --git a/build/RunTestsOnHelix.sh b/build/RunTestsOnHelix.sh index 1614333b1201..3e5535b738d7 100644 --- a/build/RunTestsOnHelix.sh +++ b/build/RunTestsOnHelix.sh @@ -14,6 +14,10 @@ mkdir $TestExecutionDirectory export DOTNET_CLI_HOME=$TestExecutionDirectory/.dotnet cp -a $HELIX_CORRELATION_PAYLOAD/t/TestExecutionDirectoryFiles/. $TestExecutionDirectory/ +export DOTNET_SDK_TEST_EXECUTION_DIRECTORY=$TestExecutionDirectory +export DOTNET_SDK_TEST_MSBUILDSDKRESOLVER_FOLDER=$HELIX_CORRELATION_PAYLOAD/r +export DOTNET_SDK_TEST_ASSETS_DIRECTORY=$TestExecutionDirectory/Assets + # call dotnet new so the first run message doesn't interfere with the first test dotnet new --debug:ephemeral-hive # We downloaded a special zip of files to the .nuget folder so add that as a source diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b23afbb16980..cb302ba23665 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -10,41 +10,41 @@ 1aba81f29698f89023e1c6e22d8dd225885be910 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime 5b20af47d99620150c53eaf5db8636fdf730b126 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime d099f075e45d2aa6007a22b71b45a08758559f80 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 https://github.com/dotnet/msbuild @@ -58,13 +58,13 @@ https://github.com/dotnet/msbuild 5785ed5c22cebcbf3a7c79dc8c91c3ce7954b2f5 - + https://github.com/dotnet/fsharp - 6f9c92a4453adc06e346cdad745e00d8728b1c55 + 521a4efba79d9afcfb18bc946d3dda5133252939 - + https://github.com/dotnet/fsharp - 6f9c92a4453adc06e346cdad745e00d8728b1c55 + 521a4efba79d9afcfb18bc946d3dda5133252939 @@ -72,46 +72,46 @@ 3c30490bb2ecae8967a3b5e79c97ab98de334676 - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://github.com/dotnet/roslyn - bdbf1cb87abc8f9554ee331a1113d533ae5ec5fb + b2bd4936daed91d4efd10c71177f7766823e615c - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://github.com/nuget/nuget.client - 4b6a87bfe90d247f961eba41d63dbf418a56fdcc + 13f2b6af6e9864711e815cfbffd7aa5015c52cec https://github.com/microsoft/vstest @@ -122,9 +122,9 @@ 13a94b5bdc9d01ecd9eb2bd699bd34d597c3ec19 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - 5b20af47d99620150c53eaf5db8636fdf730b126 + 4b0550942d7e38bf28dcfddb955e616290b83787 @@ -155,103 +155,103 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime d099f075e45d2aa6007a22b71b45a08758559f80 - + https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop - eacd999cfa912fdb8ff68aa20fb8f3f8eb1c6170 + 952eba8226df6323cee48d83e9351a3ea7a9dd35 - + https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop - eacd999cfa912fdb8ff68aa20fb8f3f8eb1c6170 + 952eba8226df6323cee48d83e9351a3ea7a9dd35 - + https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop - eacd999cfa912fdb8ff68aa20fb8f3f8eb1c6170 + 952eba8226df6323cee48d83e9351a3ea7a9dd35 - + https://dev.azure.com/dnceng/internal/_git/dotnet-windowsdesktop - eacd999cfa912fdb8ff68aa20fb8f3f8eb1c6170 + 952eba8226df6323cee48d83e9351a3ea7a9dd35 - + https://dev.azure.com/dnceng/internal/_git/dotnet-wpf - 512eac4b458953da405f51ec0ae7766bcb7b32e5 + b10173d88dc484c1462d387c131bdd4c639927e9 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://github.com/dotnet/razor - 4d1ba4fcaee5a6ce6376145d9bd619c5c83ba0cb + 0ab18affdf2a37647768d0e25f5f021bee6257a1 - + https://github.com/dotnet/razor - 4d1ba4fcaee5a6ce6376145d9bd619c5c83ba0cb + 0ab18affdf2a37647768d0e25f5f021bee6257a1 https://github.com/dotnet/razor 6d470d921df7c2244786e157397efb2082b4ad9d - + https://github.com/dotnet/razor - 4d1ba4fcaee5a6ce6376145d9bd619c5c83ba0cb + 0ab18affdf2a37647768d0e25f5f021bee6257a1 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 - + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore - 3dfc6fda80a10797b8c8fda1970e7b377fd8ed8d + 3c37ef8f5358abb303c05d299f029fca7d867d56 https://github.com/dotnet/xdt diff --git a/eng/Versions.props b/eng/Versions.props index 8d0619d4421b..5d2dbb7b036d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -49,13 +49,13 @@ - 7.0.7 - 7.0.7-servicing.23274.4 - 7.0.7 + 7.0.8 + 7.0.8-servicing.23318.7 + 7.0.8 $(MicrosoftNETCoreAppRuntimewinx64PackageVersion) 7.0.0 - 7.0.7 - 7.0.7-servicing.23274.4 + 7.0.8 + 7.0.8-servicing.23318.7 6.0.0 $(MicrosoftExtensionsDependencyModelPackageVersion) 6.0.0 @@ -65,7 +65,7 @@ - 6.7.0-rc.106 + 6.7.0-rc.111 $(NuGetBuildTasksPackageVersion) 6.0.0-rc.278 $(NuGetBuildTasksPackageVersion) @@ -96,7 +96,7 @@ 7.0.0 7.0.0 7.0.0 - 7.0.7 + 7.0.8 @@ -140,38 +140,38 @@ - 12.7.0-beta.23323.1 + 12.7.0-beta.23328.4 - 4.7.0-3.23326.8 - 4.7.0-3.23326.8 - 4.7.0-3.23326.8 - 4.7.0-3.23326.8 - 4.7.0-3.23326.8 - 4.7.0-3.23326.8 - 4.7.0-3.23326.8 + 4.7.0-3.23329.1 + 4.7.0-3.23329.1 + 4.7.0-3.23329.1 + 4.7.0-3.23329.1 + 4.7.0-3.23329.1 + 4.7.0-3.23329.1 + 4.7.0-3.23329.1 $(MicrosoftNetCompilersToolsetPackageVersion) - 7.0.7-servicing.23274.8 - 7.0.7-servicing.23274.8 - 7.0.7-servicing.23274.8 - 7.0.7-servicing.23274.8 - 7.0.7-servicing.23274.8 - 7.0.7 + 7.0.8-servicing.23318.7 + 7.0.8-servicing.23318.7 + 7.0.8-servicing.23318.7 + 7.0.8-servicing.23318.7 + 7.0.8-servicing.23318.7 + 7.0.8 - 7.0.0-preview.23326.2 - 7.0.0-preview.23326.2 + 7.0.0-preview.23330.1 + 7.0.0-preview.23330.1 7.0.0-preview.23167.3 - 7.0.0-preview.23326.2 + 7.0.0-preview.23330.1 - 7.0.7-servicing.23274.5 + 7.0.8-servicing.23318.3 @@ -191,7 +191,7 @@ 6.10.0 6.1.0 7.0.0-beta.23316.4 - 4.8.2 + 4.18.4 6.0.0-beta.22262.1 diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf index 887ee23a0e67..691493ab4e14 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf @@ -99,7 +99,7 @@ Si usa zsh, puede agregarlo a su perfil mediante la ejecución del comando sigui cat << \EOF >> ~/.zprofile # Agregue las herramientas del SDK de .NET Core -exporte PATH="$PATH:{0}" +export PATH="$PATH:{0}" EOF Y ejecute "zsh -l" para que esté disponible para la sesión actual. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf index 1e8b74ff5e7b..6a8101b46dce 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf @@ -70,12 +70,12 @@ export PATH="$PATH:{0}" cat << \EOF >> ~/.bash_profile # 添加 .NET Core SDK 工具 -导出 PATH="$PATH:{0}" +export PATH="$PATH:{0}" EOF 可运行以下命令将其添加到当前会话: -导出 PATH ="$PATH:{0}" +export PATH="$PATH:{0}" @@ -99,14 +99,14 @@ export PATH="$PATH:{0}" cat << \EOF >> ~/.zprofile # 添加 .NET Core SDK 工具 -导出 PATH="$PATH:{0}" +export PATH="$PATH:{0}" EOF 并运行 `zsh -l` 使其用于当前会话。 只可通过运行以下命令将其添加到当前会话: -导出 PATH="$PATH:{0}" +export PATH="$PATH:{0}" @@ -864,12 +864,12 @@ export PATH="$PATH:{0}" cat << \EOF >> ~/.bash_profile # 添加 .NET Core SDK 工具 -导出 PATH="$PATH:{0}" +export PATH="$PATH:{0}" EOF 可运行以下命令将其添加到当前会话: -导出 PATH ="$PATH:{0}" +export PATH="$PATH:{0}" diff --git a/src/Containers/Microsoft.NET.Build.Containers/ContainerBuilder.cs b/src/Containers/Microsoft.NET.Build.Containers/ContainerBuilder.cs index d8532f970ebe..ab230803e507 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/ContainerBuilder.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/ContainerBuilder.cs @@ -124,7 +124,6 @@ public static async Task ContainerizeAsync( builtImage, sourceImageReference, destinationImageReference, - message => Console.WriteLine($"Containerize: {message}"), cancellationToken)).ConfigureAwait(false); logger.LogInformation(Strings.ContainerBuilder_ImageUploadedToRegistry, destinationImageReference.RepositoryAndTag, destinationImageReference.Registry.RegistryName); } diff --git a/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs b/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs index 973b2a6c8e53..7c0489780f34 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/ContainerHelpers.cs @@ -17,11 +17,6 @@ public static class ContainerHelpers internal const string HostObjectPass = "SDK_CONTAINER_REGISTRY_PWORD"; - internal const string ForceChunkedUploadEnabled = "SDK_CONTAINER_DEBUG_REGISTRY_FORCE_CHUNKED_UPLOAD"; - internal const string ChunkedUploadSizeBytes = "SDK_CONTAINER_REGISTRY_CHUNKED_UPLOAD_SIZE_BYTES"; - - internal const string ParallelUploadEnabled = "SDK_CONTAINER_REGISTRY_PARALLEL_UPLOAD"; - /// /// Matches an environment variable name - must start with a letter or underscore, and can only contain letters, numbers, and underscores. /// diff --git a/src/Containers/Microsoft.NET.Build.Containers/Globals.cs b/src/Containers/Microsoft.NET.Build.Containers/Globals.cs index a5ce17f312dd..4469e747683a 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Globals.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Globals.cs @@ -8,3 +8,5 @@ [assembly: InternalsVisibleTo("containerize, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] [assembly: InternalsVisibleTo("Microsoft.NET.Build.Containers.UnitTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] [assembly: InternalsVisibleTo("Microsoft.NET.Build.Containers.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] +// moq unit tests +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] diff --git a/src/Containers/Microsoft.NET.Build.Containers/Layer.cs b/src/Containers/Microsoft.NET.Build.Containers/Layer.cs index a63794d699e1..dd29f9b8a97d 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Layer.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Layer.cs @@ -10,7 +10,7 @@ namespace Microsoft.NET.Build.Containers; -internal record struct Layer +internal class Layer { // NOTE: The SID string below was created using the following snippet. As the code is Windows only we keep the constant // private static string CreateUserOwnerAndGroupSID() @@ -30,17 +30,24 @@ internal record struct Layer private const string BuiltinUsersSecurityDescriptor = "AQAAgBQAAAAkAAAAAAAAAAAAAAABAgAAAAAABSAAAAAhAgAAAQIAAAAAAAUgAAAAIQIAAA=="; - public Descriptor Descriptor { get; private set; } + public virtual Descriptor Descriptor { get; } - public string BackingFile { get; private set; } + public string BackingFile { get; } + + internal Layer() + { + Descriptor = new Descriptor(); + BackingFile = ""; + } + internal Layer(string backingFile, Descriptor descriptor) + { + BackingFile = backingFile; + Descriptor = descriptor; + } public static Layer FromDescriptor(Descriptor descriptor) { - return new() - { - BackingFile = ContentStore.PathForDescriptor(descriptor), - Descriptor = descriptor - }; + return new(ContentStore.PathForDescriptor(descriptor), descriptor); } public static Layer FromDirectory(string directory, string containerPath, bool isWindowsLayer) @@ -183,15 +190,11 @@ void EnsureDirectoryEntries(TarWriter tar, File.Move(tempTarballPath, storedContent, overwrite: true); - Layer l = new() - { - Descriptor = descriptor, - BackingFile = storedContent, - }; - - return l; + return new(storedContent, descriptor); } + internal virtual Stream OpenBackingFile() => File.OpenRead(BackingFile); + private readonly static char[] PathSeparators = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }; /// diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultBlobOperations.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultBlobOperations.cs new file mode 100644 index 000000000000..360b160144c8 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultBlobOperations.cs @@ -0,0 +1,62 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System.Diagnostics; +using System.Net; +using System.Text.Json.Nodes; +using Microsoft.Extensions.Logging; + +namespace Microsoft.NET.Build.Containers; + +internal class DefaultBlobOperations : IBlobOperations +{ + private readonly Uri _baseUri; + private readonly HttpClient _client; + private readonly ILogger _logger; + + public DefaultBlobOperations(Uri baseUri, HttpClient client, ILogger logger) + { + _baseUri = baseUri; + _client = client; + _logger = logger; + Upload = new DefaultBlobUploadOperations(_baseUri, _client, _logger); + } + + public IBlobUploadOperations Upload { get; } + + public async Task ExistsAsync(string repositoryName, string digest, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + HttpResponseMessage response = await _client.SendAsync(new HttpRequestMessage(HttpMethod.Head, new Uri(_baseUri, $"/v2/{repositoryName}/blobs/{digest}")), cancellationToken).ConfigureAwait(false); + return response.StatusCode == HttpStatusCode.OK; + } + + public async Task GetJsonAsync(string repositoryName, string digest, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + HttpResponseMessage response = await GetAsync(repositoryName, digest, cancellationToken).ConfigureAwait(false); + + JsonNode? configDoc = JsonNode.Parse(await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)); + Debug.Assert(configDoc is not null); + + return configDoc; + } + + public async Task GetStreamAsync(string repositoryName, string digest, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + HttpResponseMessage response = await GetAsync(repositoryName, digest, cancellationToken).ConfigureAwait(false); + + return await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false); + } + + private async Task GetAsync(string repositoryName, string digest, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri(_baseUri, $"/v2/{repositoryName}/blobs/{digest}")).AcceptManifestFormats(); + HttpResponseMessage response = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + return response; + } +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultBlobUploadOperations.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultBlobUploadOperations.cs new file mode 100644 index 000000000000..cf5b5cd9066e --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultBlobUploadOperations.cs @@ -0,0 +1,124 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System.Net.Http.Headers; +using System.Net; +using Microsoft.NET.Build.Containers.Resources; +using Microsoft.Extensions.Logging; + +namespace Microsoft.NET.Build.Containers; + +internal class DefaultBlobUploadOperations : IBlobUploadOperations +{ + private readonly Uri _baseUri; + private readonly HttpClient _client; + private readonly ILogger _logger; + + internal DefaultBlobUploadOperations(Uri baseUri, HttpClient client, ILogger logger) + { + _baseUri = baseUri; + _client = client; + _logger = logger; + } + + public async Task CompleteAsync(Uri uploadUri, string digest, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + // PUT with digest to finalize + UriBuilder builder = new(uploadUri.IsAbsoluteUri ? uploadUri : new Uri(_baseUri, uploadUri)); + builder.Query += $"&digest={Uri.EscapeDataString(digest)}"; + Uri putUri = builder.Uri; + HttpResponseMessage finalizeResponse = await _client.PutAsync(putUri, null, cancellationToken).ConfigureAwait(false); + + cancellationToken.ThrowIfCancellationRequested(); + + if (finalizeResponse.StatusCode != HttpStatusCode.Created) + { + await finalizeResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); + string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"PUT {putUri}", finalizeResponse.StatusCode); + throw new ApplicationException(errorMessage); + } + } + + public async Task GetStatusAsync(Uri uploadUri, CancellationToken cancellationToken) + { + return await _client.GetAsync(uploadUri.IsAbsoluteUri ? uploadUri : new Uri(_baseUri, uploadUri), cancellationToken).ConfigureAwait(false); + } + + public async Task StartAsync(string repositoryName, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + Uri startUploadUri = new(_baseUri, $"/v2/{repositoryName}/blobs/uploads/"); + + HttpResponseMessage pushResponse = await _client.PostAsync(startUploadUri, content: null, cancellationToken).ConfigureAwait(false); + + if (pushResponse.StatusCode != HttpStatusCode.Accepted) + { + await pushResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); + string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"POST {startUploadUri}", pushResponse.StatusCode); + throw new ApplicationException(errorMessage); + } + cancellationToken.ThrowIfCancellationRequested(); + Uri location = pushResponse.GetNextLocation(); + return new(location); + } + + public async Task TryMountAsync(string destinationRepository, string sourceRepository, string digest, CancellationToken cancellationToken) + { + // Blob wasn't there; can we tell the server to get it from the base image? + HttpResponseMessage pushResponse = await _client.PostAsync(new Uri(_baseUri, $"/v2/{destinationRepository}/blobs/uploads/?mount={digest}&from={sourceRepository}"), content: null, cancellationToken).ConfigureAwait(false); + return pushResponse.StatusCode == HttpStatusCode.Created; + } + + public async Task UploadAtomicallyAsync(Uri uploadUri, Stream content, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + StreamContent httpContent = new(content); + httpContent.Headers.ContentLength = content.Length; + + Uri nextUploadUri = await PatchAsync(uploadUri, httpContent, cancellationToken).ConfigureAwait(false); + + return new(nextUploadUri); + } + + public async Task UploadChunkAsync(Uri uploadUri, HttpContent content, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + Uri nextUploadUri = await PatchAsync(uploadUri, content, cancellationToken).ConfigureAwait(false); + + return new(nextUploadUri); + } + + private HttpRequestMessage GetPatchHttpRequest(Uri uploadUri, HttpContent httpContent) + { + Uri finalUri = uploadUri.IsAbsoluteUri ? uploadUri : new Uri(_baseUri, uploadUri); + HttpRequestMessage patchMessage = new(HttpMethod.Patch, finalUri) + { + Content = httpContent + }; + patchMessage.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); + return patchMessage; + } + + private async Task PatchAsync(Uri uploadUri, HttpContent content, CancellationToken cancellationToken) + { + _logger.LogTrace("Uploading {0} bytes of content at {1}", content.Headers.ContentLength, uploadUri); + + HttpRequestMessage patchMessage = GetPatchHttpRequest(uploadUri, content); + HttpResponseMessage patchResponse = await _client.SendAsync(patchMessage, cancellationToken).ConfigureAwait(false); + + _logger.LogTrace("Received status code '{0}' from upload.", patchResponse.StatusCode); + + // Fail the upload if the response code is not Accepted (202) or if uploading to Amazon ECR which returns back Created (201). + if (!(patchResponse.StatusCode == HttpStatusCode.Accepted || (uploadUri.IsAmazonECRRegistry() && patchResponse.StatusCode == HttpStatusCode.Created))) + { + await patchResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); + string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"PATCH {uploadUri}", patchResponse.StatusCode); + throw new ApplicationException(errorMessage); + } + return patchResponse.GetNextLocation(); + } +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultManifestOperations.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultManifestOperations.cs new file mode 100644 index 000000000000..ce7325ff4dfb --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultManifestOperations.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System.Net.Http.Headers; +using System.Text.Json; +using Microsoft.Extensions.Logging; +using Microsoft.NET.Build.Containers.Resources; + +namespace Microsoft.NET.Build.Containers; + +internal class DefaultManifestOperations : IManifestOperations +{ + private readonly Uri _baseUri; + private readonly HttpClient _client; + private readonly ILogger _logger; + + internal DefaultManifestOperations(Uri baseUri, HttpClient client, ILogger logger) + { + _baseUri = baseUri; + _client = client; + _logger = logger; + } + + public async Task GetAsync(string repositoryName, string reference, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri(_baseUri, $"/v2/{repositoryName}/manifests/{reference}")).AcceptManifestFormats(); + HttpResponseMessage response = await _client.SendAsync(request, cancellationToken).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + return response; + } + + public async Task PutAsync(string repositoryName, string reference, ManifestV2 manifest, CancellationToken cancellationToken) + { + string jsonString = JsonSerializer.SerializeToNode(manifest)?.ToJsonString() ?? ""; + HttpContent manifestUploadContent = new StringContent(jsonString); + manifestUploadContent.Headers.ContentType = new MediaTypeHeaderValue(SchemaTypes.DockerManifestV2); + + HttpResponseMessage putResponse = await _client.PutAsync(new Uri(_baseUri, $"/v2/{repositoryName}/manifests/{reference}"), manifestUploadContent, cancellationToken).ConfigureAwait(false); + + if (!putResponse.IsSuccessStatusCode) + { + throw new ContainerHttpException(Resource.GetString(nameof(Strings.RegistryPushFailed)), putResponse.RequestMessage?.RequestUri?.ToString(), jsonString); + } + } +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultRegistryAPI.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultRegistryAPI.cs new file mode 100644 index 000000000000..b033541e712a --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/DefaultRegistryAPI.cs @@ -0,0 +1,44 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.Extensions.Logging; + +namespace Microsoft.NET.Build.Containers; + +internal class DefaultRegistryAPI : IRegistryAPI +{ + private readonly Uri _baseUri; + private readonly HttpClient _client; + private readonly ILogger _logger; + + internal DefaultRegistryAPI(Uri baseUri, ILogger logger) + { + bool isAmazonECRRegistry = baseUri.IsAmazonECRRegistry(); + _baseUri = baseUri; + _logger = logger; + _client = CreateClient(baseUri, isAmazonECRRegistry); + Manifest = new DefaultManifestOperations(_baseUri, _client, _logger); + Blob = new DefaultBlobOperations(_baseUri, _client, _logger); + } + + public IBlobOperations Blob { get; } + + public IManifestOperations Manifest { get; } + + private static HttpClient CreateClient(Uri baseUri, bool isAmazonECRRegistry = false) + { + HttpMessageHandler clientHandler = new AuthHandshakeMessageHandler(new SocketsHttpHandler() { PooledConnectionLifetime = TimeSpan.FromMilliseconds(10 /* total guess */) }); + + if (isAmazonECRRegistry) + { + clientHandler = new AmazonECRMessageHandler(clientHandler); + } + + HttpClient client = new(clientHandler); + + client.DefaultRequestHeaders.Add("User-Agent", $".NET Container Library v{Constants.Version}"); + + return client; + } +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/FinalizeUploadInformation.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/FinalizeUploadInformation.cs new file mode 100644 index 000000000000..09d1b42eadf5 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/FinalizeUploadInformation.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +/// +/// Captures the data needed to finalize an upload +/// +internal record FinalizeUploadInformation(Uri UploadUri); diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs index 367f559dce03..58934d7f4f18 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/HttpExtensions.cs @@ -9,10 +9,57 @@ namespace Microsoft.NET.Build.Containers; internal static class HttpExtensions { + internal static HttpRequestMessage AcceptManifestFormats(this HttpRequestMessage request) + { + request.Headers.Accept.Clear(); + request.Headers.Accept.Add(new("application/json")); + request.Headers.Accept.Add(new(SchemaTypes.DockerManifestListV2)); + request.Headers.Accept.Add(new(SchemaTypes.DockerManifestV2)); + request.Headers.Accept.Add(new(SchemaTypes.OciManifestV1)); + request.Headers.Accept.Add(new(SchemaTypes.DockerContainerV1)); + return request; + } + + /// + /// Servers send the Location header on each response, which tells us where to send the next chunk. + /// + public static Uri GetNextLocation(this HttpResponseMessage response) + { + if (response.Headers.Location is { IsAbsoluteUri: true }) + { + return response.Headers.Location; + } + else + { + // if we don't trim the BaseUri and relative Uri of slashes, you can get invalid urls. + // Uri constructor does this on our behalf. + return new Uri(response.RequestMessage!.RequestUri!, response.Headers.Location?.OriginalString ?? ""); + } + } + + internal static bool IsAmazonECRRegistry(this Uri uri) + { + // If this the registry is to public ECR the name will contain "public.ecr.aws". + if (uri.Authority.Contains("public.ecr.aws")) + { + return true; + } + + // If the registry is to a private ECR the registry will start with an account id which is a 12 digit number and will container either + // ".ecr." or ".ecr-" if pushed to a FIPS endpoint. + string accountId = uri.Authority.Split('.')[0]; + if ((uri.Authority.Contains(".ecr.") || uri.Authority.Contains(".ecr-")) && accountId.Length == 12 && long.TryParse(accountId, out _)) + { + return true; + } + + return false; + } + /// /// Logs the details of using to trace level. /// - public static async Task LogHttpResponseAsync(this HttpResponseMessage response, ILogger logger, CancellationToken cancellationToken) + internal static async Task LogHttpResponseAsync(this HttpResponseMessage response, ILogger logger, CancellationToken cancellationToken) { StringBuilder s = new(); s.AppendLine($"Last request URI: {response.RequestMessage?.RequestUri?.ToString()}"); diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/IBlobOperations.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/IBlobOperations.cs new file mode 100644 index 000000000000..61a579954259 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/IBlobOperations.cs @@ -0,0 +1,24 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System.Text.Json.Nodes; + +namespace Microsoft.NET.Build.Containers; + +/// +/// Represents registry v2 API, blob operations. +/// +/// +/// https://docs.docker.com/registry/spec/api/#blob +/// +internal interface IBlobOperations +{ + public IBlobUploadOperations Upload { get; } + + public Task ExistsAsync(string repositoryName, string digest, CancellationToken cancellationToken); + + public Task GetJsonAsync(string repositoryName, string digest, CancellationToken cancellationToken); + + public Task GetStreamAsync(string repositoryName, string digest, CancellationToken cancellationToken); +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/IBlobUploadOperations.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/IBlobUploadOperations.cs new file mode 100644 index 000000000000..5d2e2165f1b9 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/IBlobUploadOperations.cs @@ -0,0 +1,45 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +/// +/// Represents registry v2 API, blob upload operations. +/// +/// +/// https://docs.docker.com/registry/spec/api/#blob-upload +/// +internal interface IBlobUploadOperations +{ + public Task CompleteAsync(Uri uploadUri, string digest, CancellationToken cancellationToken); + + /// + /// Check on the status of an upload operation. + /// + /// + /// Note that unlike other operations, this method uses a full URI. This is because we are data-driven entirely by the registry, no path-patterns to follow. + /// + public Task GetStatusAsync(Uri uploadUri, CancellationToken cancellationToken); + + public Task StartAsync(string repositoryName, CancellationToken cancellationToken); + + public Task TryMountAsync(string destinationRepository, string sourceRepository, string digest, CancellationToken cancellationToken); + + /// + /// Uploads a stream of data to the registry atomically. + /// + /// + /// Note that unlike other operations, this method uses a full URI. This is because we are data-driven entirely by the registry, no path-patterns to follow. + /// This method is also implemented the same as UploadChunkAsync, and is here for semantic reasons only. + /// + public Task UploadAtomicallyAsync(Uri uploadUri, Stream content, CancellationToken cancellationToken); + + /// + /// Uploads a chunk of data to the registry. The chunk size is determined by the registry. + /// + /// + /// Note that unlike other operations, this method uses a full URI. This is because we are data-driven entirely by the registry, no path-patterns to follow. + /// + public Task UploadChunkAsync(Uri uploadUri, HttpContent content, CancellationToken cancellationToken); +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/IManifestOperations.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/IManifestOperations.cs new file mode 100644 index 000000000000..cec13dd68b4d --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/IManifestOperations.cs @@ -0,0 +1,18 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +/// +/// Represents registry v2 API, manifest operations. +/// +/// +/// https://docs.docker.com/registry/spec/api/#manifest +/// +internal interface IManifestOperations +{ + public Task GetAsync(string repositoryName, string reference, CancellationToken cancellationToken); + + public Task PutAsync(string repositoryName, string reference, ManifestV2 manifest, CancellationToken cancellationToken); +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/IRegistryAPI.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/IRegistryAPI.cs new file mode 100644 index 000000000000..f6efc479751b --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/IRegistryAPI.cs @@ -0,0 +1,18 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +/// +/// Represents registry v2 API. +/// +/// +/// https://docs.docker.com/registry/spec/api/ +/// +internal interface IRegistryAPI +{ + public IBlobOperations Blob { get; } + + public IManifestOperations Manifest { get; } +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/NextChunkUploadInformation.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/NextChunkUploadInformation.cs new file mode 100644 index 000000000000..3c95f7c57331 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/NextChunkUploadInformation.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +/// +/// Captures the data needed to continue chunked upload +/// +internal record NextChunkUploadInformation(Uri UploadUri); diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs similarity index 50% rename from src/Containers/Microsoft.NET.Build.Containers/Registry.cs rename to src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs index 723c4fb639b7..55ccf64ec3ce 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Registry.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/Registry.cs @@ -6,49 +6,19 @@ using Microsoft.NET.Build.Containers.Resources; using NuGet.RuntimeModel; using System.Diagnostics; -using System.Net; -using System.Net.Http.Headers; using System.Net.Http.Json; using System.Text; -using System.Text.Json; using System.Text.Json.Nodes; namespace Microsoft.NET.Build.Containers; internal sealed class Registry { - private const string DockerManifestV2 = "application/vnd.docker.distribution.manifest.v2+json"; - private const string DockerManifestListV2 = "application/vnd.docker.distribution.manifest.list.v2+json"; - private const string DockerContainerV1 = "application/vnd.docker.container.image.v1+json"; - - /// - /// Whether we should upload blobs via chunked upload (enabled by default, but disabled for certain registries in conjunction with the explicit support check below). - /// - /// - /// Relates to https://github.com/dotnet/sdk-container-builds/pull/383#issuecomment-1466408853 - /// - private static readonly bool s_ForceChunkedUploadEnabled = Env.GetEnvironmentVariableAsBool(ContainerHelpers.ForceChunkedUploadEnabled, defaultValue: false); - - /// - /// When chunking is enabled, allows explicit control over the size of the chunks uploaded - /// - /// - /// Our default of 64KB is very conservative, so raising this to 1MB or more can speed up layer uploads reasonably well. - /// - private static readonly int? s_chunkedUploadSizeBytes = Env.GetEnvironmentVariableAsNullableInt(ContainerHelpers.ChunkedUploadSizeBytes); - - /// - /// Whether we should upload blobs in parallel (enabled by default, but disabled for certain registries in conjunction with the explicit support check below). - /// - /// - /// Enabling this can swamp some registries, so this is an escape hatch. - /// - private static readonly bool s_parallelUploadEnabled = Env.GetEnvironmentVariableAsBool(ContainerHelpers.ParallelUploadEnabled, defaultValue: true); - private static readonly int s_defaultChunkSizeBytes = 1024 * 64; - private readonly HttpClient _client; private readonly ILogger _logger; + private readonly IRegistryAPI _registryAPI; + private readonly RegistrySettings _settings; /// /// The name of the registry, which is the host name, optionally followed by a colon and the port number. @@ -57,12 +27,15 @@ internal sealed class Registry /// public string RegistryName { get; init; } - public Registry(Uri baseUri, ILogger logger) + internal Registry(Uri baseUri, ILogger logger) : this(baseUri, logger, new DefaultRegistryAPI(baseUri, logger), new RegistrySettings()) { } + + internal Registry(Uri baseUri, ILogger logger, IRegistryAPI registryAPI, RegistrySettings settings) { BaseUri = baseUri; _logger = logger; + _registryAPI = registryAPI; + _settings = settings; RegistryName = DeriveRegistryName(baseUri); - _client = CreateClient(); } private static string DeriveRegistryName(Uri baseUri) @@ -88,32 +61,9 @@ private static string DeriveRegistryName(Uri baseUri) /// /// This varies by registry target, for example Amazon Elastic Container Registry requires 5MB chunks for all but the last chunk. /// - public int MaxChunkSizeBytes => s_chunkedUploadSizeBytes.HasValue ? s_chunkedUploadSizeBytes.Value : (IsAmazonECRRegistry ? 5248080 : s_defaultChunkSizeBytes); + public int MaxChunkSizeBytes => _settings.ChunkedUploadSizeBytes.HasValue ? _settings.ChunkedUploadSizeBytes.Value : (IsAmazonECRRegistry ? 5248080 : s_defaultChunkSizeBytes); - /// - /// Check to see if the registry is for Amazon Elastic Container Registry (ECR). - /// - public bool IsAmazonECRRegistry - { - get - { - // If this the registry is to public ECR the name will contain "public.ecr.aws". - if (RegistryName.Contains("public.ecr.aws")) - { - return true; - } - - // If the registry is to a private ECR the registry will start with an account id which is a 12 digit number and will container either - // ".ecr." or ".ecr-" if pushed to a FIPS endpoint. - var accountId = RegistryName.Split('.')[0]; - if ((RegistryName.Contains(".ecr.") || RegistryName.Contains(".ecr-")) && accountId.Length == 12 && long.TryParse(accountId, out _)) - { - return true; - } - - return false; - } - } + public bool IsAmazonECRRegistry => BaseUri.IsAmazonECRRegistry(); /// /// Check to see if the registry is GitHub Packages, which always uses ghcr.io. @@ -139,20 +89,20 @@ public bool IsGoogleArtifactRegistry { /// Pushing to ECR uses a much larger chunk size. To avoid getting too many socket disconnects trying to do too many /// parallel uploads be more conservative and upload one layer at a time. /// - private bool SupportsParallelUploads => !IsAmazonECRRegistry && s_parallelUploadEnabled; + private bool SupportsParallelUploads => !IsAmazonECRRegistry && _settings.ParallelUploadEnabled; public async Task GetImageManifestAsync(string repositoryName, string reference, string runtimeIdentifier, string runtimeIdentifierGraphPath, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - var initialManifestResponse = await GetManifestAsync(repositoryName, reference, cancellationToken).ConfigureAwait(false); + HttpResponseMessage initialManifestResponse = await _registryAPI.Manifest.GetAsync(repositoryName, reference, cancellationToken).ConfigureAwait(false); return initialManifestResponse.Content.Headers.ContentType?.MediaType switch { - DockerManifestV2 => await ReadSingleImageAsync( + SchemaTypes.DockerManifestV2 or SchemaTypes.OciManifestV1 => await ReadSingleImageAsync( repositoryName, await initialManifestResponse.Content.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false), cancellationToken).ConfigureAwait(false), - DockerManifestListV2 => await PickBestImageFromManifestListAsync( + SchemaTypes.DockerManifestListV2 => await PickBestImageFromManifestListAsync( repositoryName, reference, await initialManifestResponse.Content.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false), @@ -171,14 +121,10 @@ await initialManifestResponse.Content.ReadFromJsonAsync(cancella private async Task ReadSingleImageAsync(string repositoryName, ManifestV2 manifest, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - var config = manifest.Config; + ManifestConfig config = manifest.Config; string configSha = config.digest; - var blobResponse = await GetBlobAsync(repositoryName, configSha, cancellationToken).ConfigureAwait(false); - - cancellationToken.ThrowIfCancellationRequested(); - JsonNode? configDoc = JsonNode.Parse(await blobResponse.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)); - Debug.Assert(configDoc is not null); + JsonNode configDoc = await _registryAPI.Blob.GetJsonAsync(repositoryName, configSha, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); return new ImageBuilder(manifest, new ImageConfig(configDoc)); @@ -199,8 +145,8 @@ private async Task PickBestImageFromManifestListAsync( if (bestManifestRid is null) { throw new BaseImageNotFoundException(runtimeIdentifier, repositoryName, reference, graphForManifestList.Runtimes.Keys); } - var matchingManifest = ridDict[bestManifestRid]; - var manifestResponse = await GetManifestAsync(repositoryName, matchingManifest.digest, cancellationToken).ConfigureAwait(false); + PlatformSpecificManifest matchingManifest = ridDict[bestManifestRid]; + HttpResponseMessage manifestResponse = await _registryAPI.Manifest.GetAsync(repositoryName, matchingManifest.digest, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); @@ -210,29 +156,6 @@ await manifestResponse.Content.ReadFromJsonAsync(cancellationToken: cancellationToken).ConfigureAwait(false); } - private async Task GetManifestAsync(string repositoryName, string reference, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - var client = GetClient(); - using var request = new HttpRequestMessage(HttpMethod.Get, new Uri(BaseUri, $"/v2/{repositoryName}/manifests/{reference}")); - AddDockerFormatsAcceptHeader(request); - var response = await client.SendAsync(request, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - return response; - } - - private async Task GetBlobAsync(string repositoryName, string digest, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - var client = GetClient(); - using var request = - new HttpRequestMessage(HttpMethod.Get, new Uri(BaseUri, $"/v2/{repositoryName}/blobs/{digest}")); - AddDockerFormatsAcceptHeader(request); - var response = await client.SendAsync(request, cancellationToken).ConfigureAwait(false); - response.EnsureSuccessStatusCode(); - return response; - } - private static string? CheckIfRidExistsInGraph(RuntimeGraph graphForManifestList, IEnumerable leafRids, string userRid) => leafRids.FirstOrDefault(leaf => graphForManifestList.AreCompatible(leaf, userRid)); private (IReadOnlyDictionary, RuntimeGraph) ConstructRuntimeGraphForManifestList(ManifestListV2 manifestList, RuntimeGraph dotnetRuntimeGraph) @@ -310,25 +233,11 @@ public async Task DownloadBlobAsync(string repository, Descriptor descri } // No local copy, so download one - - HttpClient client = GetClient(); - - using var request = new HttpRequestMessage(HttpMethod.Get, - new Uri(BaseUri, $"/v2/{repository}/blobs/{descriptor.Digest}")); - AddDockerFormatsAcceptHeader(request); - var response = await client.SendAsync( - request, - HttpCompletionOption.ResponseHeadersRead, - cancellationToken).ConfigureAwait(false); - - cancellationToken.ThrowIfCancellationRequested(); - response.EnsureSuccessStatusCode(); + using Stream responseStream = await _registryAPI.Blob.GetStreamAsync(repository, descriptor.Digest, cancellationToken).ConfigureAwait(false); string tempTarballPath = ContentStore.GetTempFile(); using (FileStream fs = File.Create(tempTarballPath)) { - using Stream responseStream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false); - await responseStream.CopyToAsync(fs, cancellationToken).ConfigureAwait(false); } @@ -339,23 +248,21 @@ public async Task DownloadBlobAsync(string repository, Descriptor descri return localPath; } - public async Task PushAsync(Layer layer, string repository, Action logProgressMessage, CancellationToken cancellationToken) + internal async Task PushLayerAsync(Layer layer, string repository, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); string digest = layer.Descriptor.Digest; - using (FileStream contents = File.OpenRead(layer.BackingFile)) + using (Stream contents = layer.OpenBackingFile()) { await UploadBlobAsync(repository, digest, contents, cancellationToken).ConfigureAwait(false); } } - private async Task UploadBlobChunkedAsync(string repository, string digest, Stream contents, HttpClient client, UriBuilder uploadUri, CancellationToken cancellationToken) + internal async Task UploadBlobChunkedAsync(Stream contents, StartUploadInformation startUploadInformation, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - Uri patchUri = uploadUri.Uri; - var localUploadUri = new UriBuilder(uploadUri.Uri); - localUploadUri.Query += $"&digest={Uri.EscapeDataString(digest)}"; + Uri patchUri = startUploadInformation.UploadUri; // TODO: this chunking is super tiny and probably not necessary; what does the docker client do // and can we be smarter? @@ -382,203 +289,69 @@ private async Task UploadBlobChunkedAsync(string repository, string // content.Headers.Add("Content-Range", $"0-{contents.Length - 1}"); Debug.Assert(content.Headers.TryAddWithoutValidation("Content-Range", $"{chunkStart}-{chunkStart + bytesRead - 1}")); - _logger.LogTrace("Uploading {0} bytes of content at {1}", bytesRead, patchUri); - - HttpRequestMessage patchMessage = new(HttpMethod.Patch, patchUri) - { - Content = content - }; - patchMessage.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); - HttpResponseMessage patchResponse = await client.SendAsync(patchMessage, cancellationToken).ConfigureAwait(false); - - _logger.LogTrace("Received status code '{0}' from upload.", patchResponse.StatusCode); - - // Fail the upload if the response code is not Accepted (202) or if uploading to Amazon ECR which returns back Created (201). - if (!(patchResponse.StatusCode == HttpStatusCode.Accepted || (IsAmazonECRRegistry && patchResponse.StatusCode == HttpStatusCode.Created))) - { - await patchResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); - string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"PATCH {patchUri}", patchResponse.StatusCode); - throw new ApplicationException(errorMessage); - } - - localUploadUri = GetNextLocation(patchResponse); - - patchUri = localUploadUri.Uri; + NextChunkUploadInformation nextChunk = await _registryAPI.Blob.Upload.UploadChunkAsync(patchUri, content, cancellationToken).ConfigureAwait(false); + patchUri = nextChunk.UploadUri; chunkCount += 1; chunkStart += bytesRead; } - return new UriBuilder(patchUri); - } - - private UriBuilder GetNextLocation(HttpResponseMessage response) { - if (response.Headers.Location is {IsAbsoluteUri: true }) - { - return new UriBuilder(response.Headers.Location); - } - else - { - // if we don't trim the BaseUri and relative Uri of slashes, you can get invalid urls. - // Uri constructor does this on our behalf. - return new UriBuilder(new Uri(BaseUri, response.Headers.Location?.OriginalString ?? "")); - } - } - - private async Task UploadBlobWholeAsync(string repository, string digest, Stream contents, HttpClient client, UriBuilder uploadUri, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - StreamContent content = new StreamContent(contents); - content.Headers.ContentLength = contents.Length; - HttpRequestMessage patchMessage = new(HttpMethod.Patch, uploadUri.Uri) - { - Content = content - }; - patchMessage.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); - HttpResponseMessage patchResponse = await client.SendAsync(patchMessage, cancellationToken).ConfigureAwait(false); - - cancellationToken.ThrowIfCancellationRequested(); - // Fail the upload if the response code is not Accepted (202) or if uploading to Amazon ECR which returns back Created (201). - if (!(patchResponse.StatusCode == HttpStatusCode.Accepted || (IsAmazonECRRegistry && patchResponse.StatusCode == HttpStatusCode.Created))) - { - await patchResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); - string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"PATCH {uploadUri}", patchResponse.StatusCode); - throw new ApplicationException(errorMessage); - } - return GetNextLocation(patchResponse); + return new(patchUri); } - private async Task StartUploadSessionAsync(string repository, string digest, HttpClient client, CancellationToken cancellationToken) + private Task UploadBlobContentsAsync(Stream contents, StartUploadInformation startUploadInformation, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - Uri startUploadUri = new Uri(BaseUri, $"/v2/{repository}/blobs/uploads/"); - - HttpResponseMessage pushResponse = await client.PostAsync(startUploadUri, content: null, cancellationToken).ConfigureAwait(false); - if (pushResponse.StatusCode != HttpStatusCode.Accepted) - { - await pushResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); - string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"POST {startUploadUri}", pushResponse.StatusCode); - throw new ApplicationException(errorMessage); - } - cancellationToken.ThrowIfCancellationRequested(); - return GetNextLocation(pushResponse); - } - - private Task UploadBlobContentsAsync(string repository, string digest, Stream contents, HttpClient client, UriBuilder uploadUri, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - - if (s_ForceChunkedUploadEnabled) + if (_settings.ForceChunkedUpload) { //the chunked upload was forced in configuration _logger.LogTrace("Chunked upload is forced in configuration, attempting to upload blob in chunks. Content length: {0}.", contents.Length); - return UploadBlobChunkedAsync(repository, digest, contents, client, uploadUri, cancellationToken); + return UploadBlobChunkedAsync(contents, startUploadInformation, cancellationToken); } try { _logger.LogTrace("Attempting to upload whole blob, content length: {0}.", contents.Length); - return UploadBlobWholeAsync(repository, digest, contents, client, uploadUri, cancellationToken); + return _registryAPI.Blob.Upload.UploadAtomicallyAsync(startUploadInformation.UploadUri, contents, cancellationToken); } catch (Exception ex) { _logger.LogTrace("Errored while uploading whole blob: {0}.\nRetrying with chunked upload. Content length: {1}.", ex, contents.Length); contents.Seek(0, SeekOrigin.Begin); - return UploadBlobChunkedAsync(repository, digest, contents, client, uploadUri, cancellationToken); - } - } - - private async Task FinishUploadSessionAsync(string digest, HttpClient client, UriBuilder uploadUri, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - - // PUT with digest to finalize - uploadUri.Query += $"&digest={Uri.EscapeDataString(digest)}"; - - var putUri = uploadUri.Uri; - - HttpResponseMessage finalizeResponse = await client.PutAsync(putUri, content: null, cancellationToken).ConfigureAwait(false); - - cancellationToken.ThrowIfCancellationRequested(); - - if (finalizeResponse.StatusCode != HttpStatusCode.Created) - { - await finalizeResponse.LogHttpResponseAsync(_logger, cancellationToken).ConfigureAwait(false); - string errorMessage = Resource.FormatString(nameof(Strings.BlobUploadFailed), $"PUT {putUri}", finalizeResponse.StatusCode); - throw new ApplicationException(errorMessage); + return UploadBlobChunkedAsync(contents, startUploadInformation, cancellationToken); } } private async Task UploadBlobAsync(string repository, string digest, Stream contents, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - HttpClient client = GetClient(); - if (await BlobAlreadyUploadedAsync(repository, digest, client, cancellationToken).ConfigureAwait(false)) + if (await _registryAPI.Blob.ExistsAsync(repository, digest, cancellationToken).ConfigureAwait(false)) { // Already there! + _logger.LogInformation(Strings.Registry_LayerExists, digest); return; } // Three steps to this process: // * start an upload session - cancellationToken.ThrowIfCancellationRequested(); - var uploadUri = await StartUploadSessionAsync(repository, digest, client, cancellationToken).ConfigureAwait(false); + StartUploadInformation uploadUri = await _registryAPI.Blob.Upload.StartAsync(repository, cancellationToken).ConfigureAwait(false); _logger.LogTrace("Started upload session for {0}", digest); // * upload the blob cancellationToken.ThrowIfCancellationRequested(); - var finalChunkUri = await UploadBlobContentsAsync(repository, digest, contents, client, uploadUri, cancellationToken).ConfigureAwait(false); + FinalizeUploadInformation finalChunkUri = await UploadBlobContentsAsync(contents, uploadUri, cancellationToken).ConfigureAwait(false); _logger.LogTrace("Uploaded content for {0}", digest); // * finish the upload session cancellationToken.ThrowIfCancellationRequested(); - await FinishUploadSessionAsync(digest, client, finalChunkUri, cancellationToken).ConfigureAwait(false); + await _registryAPI.Blob.Upload.CompleteAsync(finalChunkUri.UploadUri, digest, cancellationToken).ConfigureAwait(false); _logger.LogTrace("Finalized upload session for {0}", digest); } - private async Task BlobAlreadyUploadedAsync(string repository, string digest, HttpClient client, CancellationToken cancellationToken) + public async Task PushAsync(BuiltImage builtImage, ImageReference source, ImageReference destination, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - HttpResponseMessage response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, new Uri(BaseUri, $"/v2/{repository}/blobs/{digest}")), cancellationToken).ConfigureAwait(false); - - return response.StatusCode == HttpStatusCode.OK; - } - - private HttpClient GetClient() - { - return _client; - } - - private HttpClient CreateClient() - { - HttpMessageHandler clientHandler = new AuthHandshakeMessageHandler(new SocketsHttpHandler() { PooledConnectionLifetime = TimeSpan.FromMilliseconds(10 /* total guess */) }); - - if(IsAmazonECRRegistry) - { - clientHandler = new AmazonECRMessageHandler(clientHandler); - } - - HttpClient client = new(clientHandler); - - client.DefaultRequestHeaders.Add("User-Agent", $".NET Container Library v{Constants.Version}"); - - return client; - } - - private static void AddDockerFormatsAcceptHeader(HttpRequestMessage request) - { - request.Headers.Accept.Clear(); - request.Headers.Accept.Add(new("application/json")); - request.Headers.Accept.Add(new(DockerManifestListV2)); - request.Headers.Accept.Add(new(DockerManifestV2)); - request.Headers.Accept.Add(new(DockerContainerV1)); - } - - public async Task PushAsync(BuiltImage builtImage, ImageReference source, ImageReference destination, Action logProgressMessage, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - HttpClient client = GetClient(); Registry destinationRegistry = destination.Registry!; Func uploadLayerFunc = async (descriptor) => @@ -587,16 +360,14 @@ public async Task PushAsync(BuiltImage builtImage, ImageReference source, ImageR string digest = descriptor.Digest; _logger.LogInformation(Strings.Registry_LayerUploadStarted, digest, destinationRegistry.RegistryName); - if (await destinationRegistry.BlobAlreadyUploadedAsync(destination.Repository, digest, client, cancellationToken).ConfigureAwait(false)) + if (await _registryAPI.Blob.ExistsAsync(destination.Repository, digest, cancellationToken).ConfigureAwait(false)) { _logger.LogInformation(Strings.Registry_LayerExists, digest); return; } // Blob wasn't there; can we tell the server to get it from the base image? - HttpResponseMessage pushResponse = await client.PostAsync(new Uri(destinationRegistry.BaseUri, $"/v2/{destination.Repository}/blobs/uploads/?mount={digest}&from={source.Repository}"), content: null).ConfigureAwait(false); - - if (pushResponse.StatusCode != HttpStatusCode.Created) + if (! await _registryAPI.Blob.Upload.TryMountAsync(destination.Repository, source.Repository, digest, cancellationToken).ConfigureAwait(false)) { // The blob wasn't already available in another namespace, so fall back to explicitly uploading it @@ -605,7 +376,7 @@ public async Task PushAsync(BuiltImage builtImage, ImageReference source, ImageR // Ensure the blob is available locally await sourceRegistry.DownloadBlobAsync(source.Repository, descriptor, cancellationToken).ConfigureAwait(false); // Then push it to the destination registry - await destinationRegistry.PushAsync(Layer.FromDescriptor(descriptor), destination.Repository, logProgressMessage, cancellationToken).ConfigureAwait(false); + await destinationRegistry.PushLayerAsync(Layer.FromDescriptor(descriptor), destination.Repository, cancellationToken).ConfigureAwait(false); _logger.LogInformation(Strings.Registry_LayerUploaded, digest, destinationRegistry.RegistryName); } else { @@ -635,29 +406,15 @@ public async Task PushAsync(BuiltImage builtImage, ImageReference source, ImageR _logger.LogInformation(Strings.Registry_ConfigUploaded); } - cancellationToken.ThrowIfCancellationRequested(); - var manifestDigest = builtImage.Manifest.GetDigest(); + //manifest upload + string manifestDigest = builtImage.Manifest.GetDigest(); _logger.LogInformation(Strings.Registry_ManifestUploadStarted, RegistryName, manifestDigest); - string jsonString = JsonSerializer.SerializeToNode(builtImage.Manifest)?.ToJsonString() ?? ""; - HttpContent manifestUploadContent = new StringContent(jsonString); - manifestUploadContent.Headers.ContentType = new MediaTypeHeaderValue(DockerManifestV2); - var putResponse = await client.PutAsync(new Uri(BaseUri, $"/v2/{destination.Repository}/manifests/{manifestDigest}"), manifestUploadContent, cancellationToken).ConfigureAwait(false); - - if (!putResponse.IsSuccessStatusCode) - { - throw new ContainerHttpException(Resource.GetString(nameof(Strings.RegistryPushFailed)), putResponse.RequestMessage?.RequestUri?.ToString(), jsonString); - } + await _registryAPI.Manifest.PutAsync(destination.Repository, manifestDigest, builtImage.Manifest, cancellationToken).ConfigureAwait(false); _logger.LogInformation(Strings.Registry_ManifestUploaded, RegistryName); - cancellationToken.ThrowIfCancellationRequested(); + //tag upload _logger.LogInformation(Strings.Registry_TagUploadStarted, destination.Tag, RegistryName); - var putResponse2 = await client.PutAsync(new Uri(BaseUri, $"/v2/{destination.Repository}/manifests/{destination.Tag}"), manifestUploadContent, cancellationToken).ConfigureAwait(false); - - if (!putResponse2.IsSuccessStatusCode) - { - throw new ContainerHttpException(Resource.GetString(nameof(Strings.RegistryPushFailed)), putResponse2.RequestMessage?.RequestUri?.ToString(), jsonString); - } - + await _registryAPI.Manifest.PutAsync(destination.Repository, destination.Tag, builtImage.Manifest, cancellationToken).ConfigureAwait(false); _logger.LogInformation(Strings.Registry_TagUploaded, destination.Tag, RegistryName); } } diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/RegistrySettings.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/RegistrySettings.cs new file mode 100644 index 000000000000..3ac8f41ff254 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/RegistrySettings.cs @@ -0,0 +1,42 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.DotNet.Cli.Utils; + +namespace Microsoft.NET.Build.Containers; + +internal class RegistrySettings +{ + private const int DefaultChunkSizeBytes = 1024 * 64; + private const int FiveMegs = 5_242_880; + + /// + /// When chunking is enabled, allows explicit control over the size of the chunks uploaded + /// + /// + /// Our default of 64KB is very conservative, so raising this to 1MB or more can speed up layer uploads reasonably well. + /// + internal int? ChunkedUploadSizeBytes { get; init; } = Env.GetEnvironmentVariableAsNullableInt(EnvVariables.ChunkedUploadSizeBytes); + + /// + /// Allows to force chunked upload for debugging purposes. + /// + internal bool ForceChunkedUpload { get; init; } = Env.GetEnvironmentVariableAsBool(EnvVariables.ForceChunkedUpload, defaultValue: false); + + /// + /// Whether we should upload blobs in parallel (enabled by default, but disabled for certain registries in conjunction with the explicit support check below). + /// + /// + /// Enabling this can swamp some registries, so this is an escape hatch. + /// + internal bool ParallelUploadEnabled { get; init; } = Env.GetEnvironmentVariableAsBool(EnvVariables.ParallelUploadEnabled, defaultValue: true); + + internal struct EnvVariables + { + internal const string ChunkedUploadSizeBytes = "SDK_CONTAINER_REGISTRY_CHUNKED_UPLOAD_SIZE_BYTES"; + + internal const string ForceChunkedUpload = "SDK_CONTAINER_DEBUG_REGISTRY_FORCE_CHUNKED_UPLOAD"; + internal const string ParallelUploadEnabled = "SDK_CONTAINER_REGISTRY_PARALLEL_UPLOAD"; + } +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs new file mode 100644 index 000000000000..4e001e0aaed7 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/SchemaTypes.cs @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +internal class SchemaTypes +{ + internal const string DockerContainerV1 = "application/vnd.docker.container.image.v1+json"; + internal const string DockerManifestListV2 = "application/vnd.docker.distribution.manifest.list.v2+json"; + internal const string DockerManifestV2 = "application/vnd.docker.distribution.manifest.v2+json"; + internal const string OciManifestV1 = "application/vnd.oci.image.manifest.v1+json"; // https://containers.gitbook.io/build-containers-the-hard-way/#registry-format-oci-image-manifest +} diff --git a/src/Containers/Microsoft.NET.Build.Containers/Registry/StartUploadInformation.cs b/src/Containers/Microsoft.NET.Build.Containers/Registry/StartUploadInformation.cs new file mode 100644 index 000000000000..39dbc41e74a9 --- /dev/null +++ b/src/Containers/Microsoft.NET.Build.Containers/Registry/StartUploadInformation.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.NET.Build.Containers; + +/// +/// Data derived from the 'start upload' call that is used to determine how perform the upload. +/// +internal record StartUploadInformation(Uri UploadUri); diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.cs.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.cs.xlf index 08d74a2a7bf8..e63b750bc6f6 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.cs.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.cs.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: Nepovedlo se nahrát objekt blob pomocí {0}; přijatý stavový kód {1} {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Kontejner {0} se odeslal do démona Dockeru. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Kontejner {0} se odeslal do registru {1}. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Sestavení image {0} se značkami {1} nad základní imagí {2} @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Chyba při čtení konfigurace démona: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Server procesu démon ohlásil chyby: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Konfigurace se nahrává do registru v objektu blob {0}, Uploaded config to registry. - Uploaded config to registry. + Konfigurace se nahrála do registru. Layer '{0}' already exists. - Layer '{0}' already exists. + Vrstva {0} již existuje. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Vrstva {0} se nahrává do {1}. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Nahrávání vrstvy {0} do {1} bylo dokončeno. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Manifest se nahrává do registru {0} jako objekt blob {1}. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Manifest se nahrál do {0}. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Značka {0} se nahrává do {1}. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Značka {0} se nahrála do {1}. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.de.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.de.xlf index bda92f419186..22c1571f3b13 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.de.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.de.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: Fehler beim Hochladen des Blobs mit {0}; der Statuscode „{1}“ wurde empfangen. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Der Container „{0}“ wurde per Push an den Docker-Daemon übertragen. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Der Container „{0}“ wurde in die Registrierung „{1}“ gepusht. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Das Image „{0}“ mit den Tags „{1}“ wird auf dem Basisimage „{2}“ erstellt. @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Fehler beim Lesen der Daemonkonfiguration: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Vom Daemonserver wurden Fehler gemeldet: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Die Konfiguration wird in die Registrierung unter Blob „{0}“ hochgeladen, Uploaded config to registry. - Uploaded config to registry. + Die Konfiguration wurde in die Registrierung hochgeladen. Layer '{0}' already exists. - Layer '{0}' already exists. + Die Ebene „{0}“ ist bereits vorhanden. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Ebene „{0}“ wird in „{1}“ hochgeladen. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Das Hochladen der Ebene „{0}“ nach „{1}“ wurde abgeschlossen. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Das Manifest wird in die Registrierung „{0}“ als Blob „{1}“ hochgeladen. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Manifest in „{0}“ hochgeladen. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Das Tag „{0}“ wird in „{1}“ hochgeladen. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Das Tag „{0}“ wurde in „{1}“ hochgeladen. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.es.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.es.xlf index 41af99bfc228..a62e03b81568 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.es.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.es.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: no se pudo cargar el blob mediante {0}; se ha recibido el código de estado "{1}". {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Se insertó el contenedor "{0}" en el demonio de Docker. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Se insertó el contenedor "{0}" en el registro "{1}". Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Compilando imagen "{0}" con etiquetas "{1}" encima de la imagen base "{2}". @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Error al leer la configuración del demonio: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + El servidor demonio notificó los errores: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Cargando la configuración en el Registro en el blob "{0}", Uploaded config to registry. - Uploaded config to registry. + Se cargó la configuración en el Registro. Layer '{0}' already exists. - Layer '{0}' already exists. + La capa "{0}" ya existe. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Cargando la capa "{0}" en "{1}". {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Finalizó la carga de la capa "{0}" en "{1}". {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Cargando manifiesto en el Registro "{0}" como blob "{1}". {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Se cargó el manifiesto en "{0}". {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Cargando la etiqueta "{0}" en "{1}". {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Etiqueta cargada "{0}" en "{1}". {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.fr.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.fr.xlf index 398d0580314f..0e3f2020c27c 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.fr.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.fr.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: échec du chargement de l’objet blob à l’aide de {0}; le code d’état «{1}» a été reçu. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Le conteneur «{0}» a été envoyé au démon Docker. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Le conteneur «{0}» a été envoyé au registre «{1}». Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Génération de l’image «{0}» avec des balises «{1}» au-dessus de l’image de base «{2}». @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Erreur lors de la lecture de la configuration du démon : {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Le serveur démon a signalé des erreurs : {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Chargement de la configuration dans le Registre sur l’objet blob «{0}», Uploaded config to registry. - Uploaded config to registry. + Configuration chargée dans le Registre. Layer '{0}' already exists. - Layer '{0}' already exists. + La couche '{0}' existe déjà. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Chargement de la couche «{0}» vers «{1}». {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Fin du chargement de la couche «{0}» vers «{1}». {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Chargement du manifeste dans le Registre '{0}' en tant qu’objet blob '{1}'. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Manifeste chargé dans '{0}'. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Chargement de la balise «{0}» vers «{1}». {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Balise «{0}» chargée sur «{1}». {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.it.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.it.xlf index 609940b2eabb..3659d250494e 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.it.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.it.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: non è stato possibile caricare il BLOB usando {0}; codice di stato ricevuto '{1}'. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + È stato eseguito il push del contenitore '{0}' nel daemon Docker. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + È stato eseguito il push del contenitore '{0}' nel registro '{1}'. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Compilazione dell'immagine '{0}' con i tag '{1}' sopra l'immagine di base '{2}'. @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Errore durante la lettura della configurazione del daemon: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Errori segnalati dal server daemon: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Caricamento della configurazione nel Registro di sistema nel BLOB '{0}', Uploaded config to registry. - Uploaded config to registry. + Configurazione caricata nel Registro di sistema. Layer '{0}' already exists. - Layer '{0}' already exists. + Il livello '{0}' esiste già. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Caricamento del livello '{0}' in '{1}'. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Caricamento del livello '{0}' in '{1}' completato. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Caricamento del manifesto nel Registro di sistema '{0}' come BLOB '{1}'. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Manifesto caricato in '{0}'. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Caricamento del tag '{0}' in '{1}'. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Tag caricato '{0}' in '{1}'. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ja.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ja.xlf index 0c9d400e6fff..8db93b84109e 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ja.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ja.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: {0} を使用して BLOB をアップロードできませんでした; 状態コード '{1}' を受信しました。 {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + コンテナー '{0}' を Docker デーモンにプッシュしました。 Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + コンテナー '{0}' をレジストリ '{1}' にプッシュしました。 Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + 基本イメージ '{0}' の上にタグ '{1}' 付きのイメージ '{2}' をビルドしています。 @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + デーモン構成の読み取り中にエラーが発生しました: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + デーモン サーバーからエラーが報告されました: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + BLOB '{0}' のレジストリに構成をアップロードしています、 Uploaded config to registry. - Uploaded config to registry. + 構成をレジストリにアップロードしました。 Layer '{0}' already exists. - Layer '{0}' already exists. + レイヤー '{0}' は既に存在します。 Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + レイヤー '{0}' を '{1}' にアップロードしています。 {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + レイヤー '{0}' の '{1}' へのアップロードが完了しました。 {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + BLOB '{0}' としてレジストリ '{1}' にマニフェストをアップロードしています。 {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + マニフェストを '{0}' にアップロードしました。 {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + タグ '{0}' を '{1}' にアップロードしています。 {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + タグ '{0}' を '{1}' にアップロードしました。 {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ko.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ko.xlf index e6418271d03c..bf59f078585d 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ko.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ko.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: {0}을(를) 사용하여 Blob을 업로드하지 못했습니다. '{1}' 상태 코드를 수신했습니다. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Docker 디먼에 '{0}' 컨테이너를 푸시했습니다. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + '{1}' 레지스트리에 '{0}' 컨테이너를 푸시했습니다. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + 기본 이미지 '{2}' 위에 '{1}' 태그가 있는 '{0}' 이미지를 빌드하는 중입니다. @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + 디먼 구성을 읽는 동안 오류가 발생했습니다. {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + 디먼 서버에서 오류를 보고했습니다. {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Blob '{0}'에서 레지스트리에 구성을 업로드하는 중입니다. Uploaded config to registry. - Uploaded config to registry. + 레지스트리에 구성을 업로드했습니다. Layer '{0}' already exists. - Layer '{0}' already exists. + '{0}' 계층이 이미 있습니다. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + '{1}'에 '{0}' 계층을 업로드하는 중입니다. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + '{1}'에 '{0}' 계층을 업로드했습니다. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + '{0}' 레지스트리에 매니페스트를 '{1}' Blob으로 업로드하는 중입니다. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + '{0}'에 매니페스트를 업로드했습니다. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + '{1}'에 '{0}' 태그를 업로드하는 중입니다. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + '{1}'에 '{0}' 태그를 업로드했습니다. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pl.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pl.xlf index 29f90590e1e9..8e871924412e 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pl.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pl.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: nie można przekazać obiektu blob przy użyciu {0}; odebrano kod stanu „{1}”. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Wypchnięto kontener „{0}” do demona platformy Docker. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Wypchnęliśmy 'kontener „{0}” do rejestru „{1}”. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Tworzenie obrazu „{0}” z tagami „{1}” nad obrazem podstawowym „{2}”. @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Błąd podczas odczytywania konfiguracji demona: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Serwer demona zgłosił błędy: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Przekazywanie konfiguracji do rejestru w obiekcie blob „{0}”, Uploaded config to registry. - Uploaded config to registry. + Przekazano konfigurację do rejestru. Layer '{0}' already exists. - Layer '{0}' already exists. + Warstwa „{0}” już istnieje. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Przekazywanie warstwy „{0}” do rejestru „{1}”. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Zakończono przekazywanie warstwy „{0}” do rejestru „{1}”. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Przekazywanie manifestu do rejestru „{0}” jako obiektu blob „{1}”. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Przekazano manifest do rejestru „{0}”. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Przekazywanie tagu „{0}” do rejestru „{1}”. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Przekazano tag „{0}” do „{1}”. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pt-BR.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pt-BR.xlf index 606d68368c30..febc033849c7 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pt-BR.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.pt-BR.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: Falha ao carregar o blob usando {0}; código de status recebido '{1}'. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Enviou o contêiner '{0}' para o daemon do Docker. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Contêiner empurrado '{0}' para o registro '{1}'. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Construindo imagem '{0}' com tags '{1}' em cima da imagem base '{2}'. @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Erro ao ler a configuração do daemon: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + O servidor daemon relatou erros: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Carregamento da configuração para o registro no blob '{0}', Uploaded config to registry. - Uploaded config to registry. + Configuração carregada no registro. Layer '{0}' already exists. - Layer '{0}' already exists. + A camada '{0}' já existe. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Carregando camada '{0}' para '{1}'. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Camada de carregamento concluída '{0}' para '{1}'. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Carregamento do manifesto para o registro '{0}' como blob '{1}'. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Manifesto enviado para '{0}'. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Carregando marca '{0}' para '{1}'. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Marca carregada '{0}' para '{1}'. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ru.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ru.xlf index fad41e9c2277..bced9af0df95 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ru.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.ru.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: не удалось отправить BLOB-объект с помощью {0}; получен код состояния "{1}". {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + Принудительно отправлен контейнер "{0}" в управляющую программу Docker. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + Принудительно отправлен контейнер "{0}" в реестр "{1}". Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + Выполняется сборка образа "{0}" с тегами "{1}" поверх базового образа "{2}". @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Ошибка при чтении конфигурации управляющей программы: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Сервер управляющей программы сообщил об ошибках: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Отправка конфигурации в реестр в BLOB-объекте "{0}", Uploaded config to registry. - Uploaded config to registry. + Конфигурация отправлена в реестр. Layer '{0}' already exists. - Layer '{0}' already exists. + Слой "{0}" уже существует. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + Отправка слоя "{0}" в "{1}". {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + Завершена отправка слоя "{0}" в "{1}". {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Отправка манифеста в реестр "{0}" как BLOB-объект "{1}". {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Манифест отправлен в "{0}". {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + Отправка тега "{0}" в "{1}". {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + Отправлен тег "{0}" в "{1}". {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.tr.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.tr.xlf index 2fee5be55f38..eab919fc93e2 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.tr.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.tr.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: Blob, {0} kullanarak karşıya yüklenemedi; '{1}' durum kodu alındı. {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + '{0}' kapsayıcısı, Docker daemon'a gönderildi. Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + '{0}' kapsayıcısı, '{1}' kayıt defterine gönderildi. Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + '{1}' etiketli '{0}' resmi, '{2}' temel görüntüsünün üzerinde oluşturuluyor. @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + Daemon yapılandırması okunurken hata oluştu: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + Daemon sunucusu hatalar bildirdi: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + Yapılandırma, blob '{0}' konumundaki kayıt defterine karşıya yükleniyor, Uploaded config to registry. - Uploaded config to registry. + Yapılandırma, kayıt defterine karşıya yüklendi. Layer '{0}' already exists. - Layer '{0}' already exists. + '{0}' katmanı zaten var. Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + '{0}' katmanı, '{1}' kayıt defterine karşıya yükleniyor. {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + '{0}' katmanının, '{1}' kayıt defterine karşıya yüklenmesi tamamlandı. {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + Bildirim, '{0}' kayıt defterine '{1}' blob olarak karşıya yükleniyor. {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + Bildirim, '{0}' kayıt defterine karşıya yüklendi. {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + '{0}' etiketi, '{1}' kayıt defterine karşıya yükleniyor. {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + '{0}' etiketi, '{1}' konumuna karşıya yüklendi. {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hans.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hans.xlf index a5aba991f2fb..017686181dae 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hans.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hans.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: 无法使用 {0} 上传 blob;已收到状态代码“{1}”。 {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + 已将容器“{0}”推送到 Docker 守护程序。 Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + 已将容器“{0}”推送到注册表“{1}”。 Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + 在基本映像“{2}”顶部构建标记为“{1}”的映像“{0}”。 @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + 读取守护程序配置时出错: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + 守护程序服务器报告错误: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + 正在将配置上传到 blob“{0}”处的注册表, Uploaded config to registry. - Uploaded config to registry. + 已将配置上传到注册表。 Layer '{0}' already exists. - Layer '{0}' already exists. + 层“{0}”已存在。 Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + 正在将层“{0}”上传到“{1}”。 {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + 已完成将层“{0}”上传到“{1}”。 {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + 正在将清单作为 blob“{1}”上传到注册表“{0}”。 {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + 已将清单上传到“{0}”。 {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + 正在将标记“{0}”上传到“{1}”。 {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + 已将标记“{0}”上传到“{1}”。 {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hant.xlf b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hant.xlf index 6b0493eaa607..50c03fe43fdf 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hant.xlf +++ b/src/Containers/Microsoft.NET.Build.Containers/Resources/xlf/Strings.zh-Hant.xlf @@ -29,22 +29,22 @@ CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. - CONTAINER1001: Failed to upload blob using {0}; received status code '{1}'. + CONTAINER1001: 無法使用 {0} 上傳 blob; 收到狀態碼 '{1}'。 {StrBegin="CONTAINER1001: "} Pushed container '{0}' to Docker daemon. - Pushed container '{0}' to Docker daemon. + 已推送容器 '{0}' 至 Docker 精靈。 Pushed container '{0}' to registry '{1}'. - Pushed container '{0}' to registry '{1}'. + 已將容器 '{0}' 推送至登錄 '{1}'。 Building image '{0}' with tags '{1}' on top of base image '{2}'. - Building image '{0}' with tags '{1}' on top of base image '{2}'. + 在基礎映像 '{2}' 上建立具有標記 '{1}' 的映像 '{0}'。 @@ -169,12 +169,12 @@ Error while reading daemon config: {0} - Error while reading daemon config: {0} + 讀取精靈設定時發生錯誤: {0} {0} is the exception message that ends with period The daemon server reported errors: {0} - The daemon server reported errors: {0} + 精靈伺服器報告錯誤: {0} {0} are the list of messages, each message starts with new line @@ -214,47 +214,47 @@ Uploading config to registry at blob '{0}', - Uploading config to registry at blob '{0}', + 上傳設定至位於 blob '{0}' 的登錄, Uploaded config to registry. - Uploaded config to registry. + 已上傳設定至登錄。 Layer '{0}' already exists. - Layer '{0}' already exists. + 圖層 '{0}' 已存在。 Uploading layer '{0}' to '{1}'. - Uploading layer '{0}' to '{1}'. + 上傳圖層 '{0}' 至 '{1}'。 {0} is the layer digest, {1} is the registry name Finished uploading layer '{0}' to '{1}'. - Finished uploading layer '{0}' to '{1}'. + 已完成上傳圖層 '{0}' 至 '{1}'。 {0} is the layer digest, {1} is the registry name Uploading manifest to registry '{0}' as blob '{1}'. - Uploading manifest to registry '{0}' as blob '{1}'. + 上傳資訊清單至登錄 '{0}' 做為 blob '{1}'。 {0} is the registry name Uploaded manifest to '{0}'. - Uploaded manifest to '{0}'. + 已上傳資訊清單清單至 '{0}'。 {0} is the registry name Uploading tag '{0}' to '{1}'. - Uploading tag '{0}' to '{1}'. + 上傳標記 '{0}' 至 '{1}'。 {1} is the registry name Uploaded tag '{0}' to '{1}'. - Uploaded tag '{0}' to '{1}'. + 已上傳標記 '{0}' 至 '{1}'。 {1} is the registry name diff --git a/src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.cs b/src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.cs index 20a785f4ebeb..6ee9a25a3cf6 100644 --- a/src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.cs +++ b/src/Containers/Microsoft.NET.Build.Containers/Tasks/CreateNewImage.cs @@ -140,7 +140,6 @@ await destinationImageReference.Registry.PushAsync( builtImage, sourceImageReference, destinationImageReference, - message => SafeLog(message), cancellationToken).ConfigureAwait(false); SafeLog("Pushed container '{0}' to registry '{1}'", destinationImageReference.RepositoryAndTag, OutputRegistry); } diff --git a/src/Containers/docs/ReleaseNotes/v7.0.400.md b/src/Containers/docs/ReleaseNotes/v7.0.400.md new file mode 100644 index 000000000000..94ae3054009b --- /dev/null +++ b/src/Containers/docs/ReleaseNotes/v7.0.400.md @@ -0,0 +1,26 @@ +# Microsoft.NET.Build.Containers 7.0.400 + +This version brings the following new features and enhancements: + +* For WebSdk projects (and any project that includes the `Microsoft.NET.Publish.Sdk` SDK), the container tools are included and available by default! This means that you no longer need to set the `EnableSdkContainerSupport` property in your project files or include the `Microsoft.NET.Build.Containers` package in your projects in order to publish containers. For project types that do not include the Publish SDK (like console or webjob projects), you still must add the `Microsoft.NET.Build.Containers` NuGet package as a PackageReference to your project, and publish using the `/t:PublishContainer` target explicitly. +* When targeting `net8.0` TargetFrameworks during preview release time frames, the inferred preview image will be more correct. Previously it could get out of sync with the actual image tagging scheme used by the dotnet-docker team. +* The layer upload process was massively refactored. This resulted in more performance, more reliability, and better support for more kinds of registries. As part of this, we now try the following upload algorithm for a layer: + * Try to upload the whole layer in one compressed payload + * If that fails, try to upload in chunks + * When uploading chunks, we look for indicators from the registry to choose the chunk size + + In addition, we fixed some protocol bugs that blocked usage with registries like Harbor. +* Several environment variables were added to allow more explicit control over the layer upload process: + * SDK_CONTAINER_REGISTRY_PARALLEL_UPLOAD + * determines if layers of the generated image can be uploaded in parallel or in series. + * defaults to `true` for all registries except AWS ECR + * SDK_CONTAINER_DEBUG_REGISTRY_FORCE_CHUNKED_UPLOAD + * if set to `true`, we will always try to upload layers in chunks instead of all in one upload. + * defaults to `false`. + * SDK_CONTAINER_REGISTRY_CHUNKED_UPLOAD_SIZE_BYTES + * allows for explicit control over the size of the chunks uploaded when using chunked uploads. + * note that by default we prefer atomic uploads, so setting this might not have any impact if your registry supports atomic uploads. + * does not have a default, but the default chunk size is 64Kb. +* Naming is important, so we've renamed the `ContainerImageName` property to `ContainerRepository`. Repository is the name used for the user-facing image (for example `dotnet/runtime`), and it's used this way in most container documentation, so we've adopted that naming to make it easier to keep the terminology aligned. We still handle `ContainerImageName`, but we now will emit a validation warning during the publish if that property is used. +* The default OS for inferred containers is now `linux` instead of `windows`. Windows container usage is much less than Linux container usage, and we should default to the most likely configuration to make the onbaording story for the tooling easier. You can always control this explicitly by publishing for a specific `RuntimeIdentifier` (via the `-r` parameter or the `RuntimeIdentifier` MSBuild property) or setting the `ContainerRuntimeIdentifier` to a valid runtime identifier value. +* We added read support for OCI Container manifests. Practically speaking this means that you can now use base images from registries like Quay.io, Artifactory, and Docker Hub that typically send image manifests in this format instead of the older Docker-based format. diff --git a/src/Containers/packaging/package.csproj b/src/Containers/packaging/package.csproj index a9770b63c0d4..838cc2e617ee 100644 --- a/src/Containers/packaging/package.csproj +++ b/src/Containers/packaging/package.csproj @@ -41,7 +41,7 @@ - ../docs/ReleaseNotes/v7.0.300.md + ../docs/ReleaseNotes/v7.0.400.md $([System.IO.File]::ReadAllText($(PackageReleaseNotesFile))) diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.cs.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.cs.xlf index 87af4878ea91..fbdbac7dd381 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.cs.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.cs.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + Verze {0} úlohy, která byla zadána v {1}, nebyla nalezena. Spuštěním příkazu dotnet workload restore nainstalujte tuto verzi úlohy. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.de.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.de.xlf index 7957ceca43c1..b472465f1cfd 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.de.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.de.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + Die Arbeitsauslastungsversion {0}, die in {1} angegeben wurde, wurde nicht gefunden. Führen Sie „dotnet workload restore“ aus, um diese Workloadversion zu installieren. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.es.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.es.xlf index 6d3b75908044..dc116b19b419 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.es.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.es.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + No se encontró la versión de carga de trabajo {0}, que se especificó en {1}. Ejecuta "restauración de carga de trabajo de dotnet" para instalar esta versión de carga de trabajo. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.fr.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.fr.xlf index 06f9d19d3e5c..ec924b01f619 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.fr.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.fr.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + La version de charge de travail {0}, qui a été spécifiée dans {1}, est introuvable. Exécutez « dotnet workload restore » pour installer cette version de charge de travail. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.it.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.it.xlf index 29b7fc022bc2..061e2b7e592d 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.it.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.it.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + La versione del carico di lavoro {0}, specificata in {1}, non è stata trovata. Eseguire "dotnet workload restore" per installare questa versione del carico di lavoro. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ja.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ja.xlf index e0517c875cf2..d859b43d2503 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ja.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ja.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + {1} で指定されたワークロード バージョン {0} が見つかりませんでした。"dotnet ワークロードの復元" を実行して、このワークロード バージョンをインストールします。 {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ko.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ko.xlf index f312858ba612..435208329d89 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ko.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ko.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + {1}에 지정된 워크로드 버전 {0}을(를) 찾을 수 없습니다. "dotnet 워크로드 복원"을 실행하여 이 워크로드 버전을 설치합니다. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pl.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pl.xlf index df7e22373be6..5b5ef9097d58 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pl.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pl.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + Nie znaleziono wersji obciążenia {0} określonej w kontenerze {1}. Uruchom polecenie „dotnet workload restore”, aby zainstalować tę wersję obciążenia. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pt-BR.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pt-BR.xlf index 2c10ce648957..bb2dba3f69d0 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pt-BR.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.pt-BR.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + A versão da carga de trabalho {0}, especificada em {1}, não foi localizada. Execute "dotnet workload restore" para instalar esta versão da carga de trabalho. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ru.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ru.xlf index 0fd5581ea359..998279f0d092 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ru.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.ru.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + Версия рабочей нагрузки {0}, указанная в {1}, не найдена. Запустите команду "dotnet workload restore", чтобы установить эту версию рабочей нагрузки. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.tr.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.tr.xlf index de15a7251f8b..935936b53fa4 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.tr.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.tr.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + {1} konumunda belirtilen {0} iş yükü sürümü bulunamadı. Bu iş yükü sürümünü yüklemek için "dotnet iş yükü geri yükleme" komutunu çalıştırın. {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hans.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hans.xlf index 892e1227bb45..e40e8a3303c8 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hans.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hans.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + 找不到在 {1} 中指定的工作负载版本 {0}。运行“dotnet 工作负载还原”以安装此工作负载版本。 {Locked="dotnet workload restore"} diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hant.xlf b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hant.xlf index 5cff8edc8f43..d2f89ded34a8 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hant.xlf +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/xlf/Strings.zh-Hant.xlf @@ -139,7 +139,7 @@ Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. - Workload version {0}, which was specified in {1}, was not found. Run "dotnet workload restore" to install this workload version. + 找不到 {1} 中指定的工作負載版本 {0}。執行 "dotnet workload restore" 以安裝此工作負載版本。 {Locked="dotnet workload restore"} diff --git a/src/Tasks/Common/Resources/Strings.resx b/src/Tasks/Common/Resources/Strings.resx index 7136566834bf..cff6a0c48aae 100644 --- a/src/Tasks/Common/Resources/Strings.resx +++ b/src/Tasks/Common/Resources/Strings.resx @@ -327,8 +327,9 @@ NETSDK1056: Project is targeting runtime '{0}' but did not resolve any runtime-specific packages. This runtime may not be supported by the target framework. {StrBegin="NETSDK1056: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy + {StrBegin="NETSDK1057: "} NETSDK1058: Invalid value for ItemSpecToUse parameter: '{0}'. This property must be blank or set to 'Left' or 'Right' @@ -853,11 +854,11 @@ You may need to build the project on another operating system or architecture, o NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1189: Prefer32Bit is not supported and has no effect for netcoreapp target. @@ -903,4 +904,5 @@ You may need to build the project on another operating system or architecture, o NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. {StrBegin="NETSDK1208: "} + diff --git a/src/Tasks/Common/Resources/xlf/Strings.cs.xlf b/src/Tasks/Common/Resources/xlf/Strings.cs.xlf index 2e351d7faaf0..f5952313039c 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.cs.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.cs.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: Balíček {0} {1} má prostředek s národním prostředím {2}. Toto národní prostředí se normalizovalo do standardního formátu {3}, aby se zabránilo problémům s malými a velkými písmeny v sestavení. Zvažte možnost upozornit na tento problém autora balíčku. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: Balíček {0} {1} má prostředek s národním prostředím {2}. Toto národní prostředí není rozpoznáno rozhraním .NET. Doporučujeme upozornit autora balíčku, že se zdá, že používá neplatné národní prostředí. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -932,7 +932,7 @@ The following are names of parameters or literal values and should not be transl NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. - NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. + NETSDK1208: Identifikátor cílové platformy {0} nebyl rozpoznán. Důvodem je, že proměnná prostředí MSBuildEnableWorkloadResolver je nastavena na hodnotu false, což zakáže úlohy .NET SDK, které se pro tento identifikátor vyžadují. Pokud chcete povolit úlohy, zrušte nastavení této proměnné prostředí nebo vlastnosti MSBuild. {StrBegin="NETSDK1208: "} @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: K sestavování desktopových aplikací pro Windows se vyžaduje Microsoft.NET.Sdk.WindowsDesktop. Aktuální verze sady SDK nepodporuje hodnoty UseWpf a UseWindowsForms. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Používáte verzi Preview rozhraní .NET. Viz: https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.de.xlf b/src/Tasks/Common/Resources/xlf/Strings.de.xlf index 0334799e2de0..2a2ec92a099a 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.de.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.de.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: Das Paket {0} {1} verfügt über eine Ressource mit dem gebietsschema-'{2}'. Dieses Gebietsschema wurde auf das Standardformat '{3}' normalisiert, um Groß-/Kleinschreibungsprobleme im Build zu vermeiden. Erwägen Sie, den Paketautor über dieses Groß-/Kleinschreibungsproblem zu benachrichtigen. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: Das Paket {0} {1} verfügt über eine Ressource mit dem gebietsschema-'{2}'. Dieses Gebietsschema wird von .NET nicht erkannt. Erwägen Sie, den Paketautor darüber zu benachrichtigen, dass offenbar ein ungültiges Gebietsschema verwendet wird. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -932,7 +932,7 @@ The following are names of parameters or literal values and should not be transl NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. - NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. + NETSDK1208: Der Zielplattformbezeichner {0} wurde nicht erkannt. Dies liegt daran, dass MSBuildEnableWorkloadResolver auf FALSE festgelegt ist, wodurch .NET SDK-Workloads deaktiviert werden, die für diesen Bezeichner erforderlich sind. Löschen Sie diese Umgebungsvariablen oder die MSBuild-Eigenschaft, um Workloads zu aktivieren. {StrBegin="NETSDK1208: "} @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Für das Erstellen von Windows-Desktopanwendungen ist Microsoft.NET.Sdk.WindowsDesktop erforderlich. "UseWpf" und "UseWindowsForms" werden vom aktuellen SDK nicht unterstützt. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Sie verwenden eine Vorschauversion von .NET. Weitere Informationen: https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.es.xlf b/src/Tasks/Common/Resources/xlf/Strings.es.xlf index 4ae697a4c099..950cff68b92f 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.es.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.es.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: El paquete {0} {1} tiene un recurso con la configuración regional "{2}". Esta configuración regional se ha normalizado al formato estándar "{3}" para evitar problemas de uso de mayúsculas y minúsculas en la compilación. Considere la posibilidad de notificar al autor del paquete sobre este problema de uso de mayúsculas y minúsculas. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: El paquete {0} {1} tiene un recurso con la configuración regional "{2}". .NET no reconoce esta configuración regional. Considere la posibilidad de notificar al autor del paquete que parece estar usando una configuración regional no válida. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -932,7 +932,7 @@ The following are names of parameters or literal values and should not be transl NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. - NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. + NETSDK1208: no se ha reconocido el identificador de la plataforma de destino {0}. Esto se debe a que MSBuildEnableWorkloadResolver está establecido en false, lo que deshabilita las cargas de trabajo del SDK de .NET necesarias para este identificador. Anule esta variable de entorno o propiedad de MSBuild para habilitar las cargas de trabajo. {StrBegin="NETSDK1208: "} @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Se requiere Microsoft.NET.Sdk.WindowsDesktop para compilar las aplicaciones de escritorio de Windows. El SDK actual no admite "UseWpf" ni "UseWindowsForms". {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Está usando una versión preliminar de .NET. Visite: https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.fr.xlf b/src/Tasks/Common/Resources/xlf/Strings.fr.xlf index 0335ace4f7be..833124c0f8df 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.fr.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.fr.xlf @@ -682,13 +682,13 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. - NETSDK1187 : package {0} {1} a une ressource avec les paramètres régionaux '{2}'. Ces paramètres régionaux ont été normalisés au format standard '{3}' pour éviter les problèmes de casse dans la build. Envisagez d’avertir l’auteur du package de ce problème de casse. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + NETSDK1187: package {0} {1} a une ressource avec les paramètres régionaux '{2}'. Ces paramètres régionaux ont été normalisés au format standard '{3}' pour éviter les problèmes de casse dans la build. Envisagez d’avertir l’auteur du package de ce problème de casse. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: Package {0} {1} a une ressource avec les paramètres régionaux '{2}'. Ces paramètres régionaux ne sont pas reconnus par .NET. Envisagez d’avertir l’auteur du package qu’il semble utiliser des paramètres régionaux non valides. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: vous devez disposer de Microsoft.NET.Sdk.WindowsDesktop pour générer des applications de bureau Windows. 'UseWpf' et 'UseWindowsForms' ne sont pas pris en charge par le kit SDK actuel. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy - NETSDK1057 : vous utilisez une version d'aperçu de .NET. Voir : https://aka.ms/dotnet-support-policy - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.it.xlf b/src/Tasks/Common/Resources/xlf/Strings.it.xlf index 82a7e33a4240..acf2ba8bf823 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.it.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.it.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: il pacchetto {0} {1} include una risorsa con le impostazioni locali '{2}'. Queste impostazioni locali sono state normalizzate nel formato standard '{3}' per evitare problemi di maiuscole e minuscole nella compilazione. È consigliabile informare l'autore del pacchetto in merito a questo problema di maiuscole e minuscole. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: il pacchetto {0} {1} include una risorsa con le impostazioni locali '{2}'. Queste impostazioni locali non sono riconosciute da .NET. È consigliabile notificare all'autore del pacchetto che sembra usare impostazioni locali non valide. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: per compilare applicazioni desktop di Windows, è necessario Microsoft.NET.Sdk.WindowsDesktop. 'UseWpf' e 'UseWindowsForms' non sono supportati dall'SDK corrente. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: si sta usando una versione in anteprima di .NET. Vedere https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.it.xlf~RF243dc495.TMP b/src/Tasks/Common/Resources/xlf/Strings.it.xlf~RF243dc495.TMP deleted file mode 100644 index d241e524c7fa..000000000000 --- a/src/Tasks/Common/Resources/xlf/Strings.it.xlf~RF243dc495.TMP +++ /dev/null @@ -1,924 +0,0 @@ - - - - - - NETSDK1076: AddResource can only be used with integer resource types. - NETSDK1076: è possibile usare AddResource solo con tipi di risorsa integer. - {StrBegin="NETSDK1076: "} - - - NETSDK1070: The application configuration file must have root configuration element. - NETSDK1070: il file di configurazione dell'applicazione deve avere un elemento di configurazione radice. - {StrBegin="NETSDK1070: "} - - - NETSDK1113: Failed to create apphost (attempt {0} out of {1}): {2} - NETSDK1113: non è stato possibile creare apphost (tentativo {0} di {1}): {2} - {StrBegin="NETSDK1113: "} - - - NETSDK1074: The application host executable will not be customized because adding resources requires that the build be performed on Windows (excluding Nano Server). - NETSDK1074: l'eseguibile dell'host applicazione non verrà personalizzato perché per aggiungere risorse è necessario eseguire la compilazione in Windows (escluso Nano Server). - {StrBegin="NETSDK1074: "} - - - NETSDK1029: Unable to use '{0}' as application host executable as it does not contain the expected placeholder byte sequence '{1}' that would mark where the application name would be written. - NETSDK1029: non è possibile usare '{0}' come eseguibile host dell'applicazione perché non contiene la sequenza di byte segnaposto prevista '{1}' che indica dove verrà scritto il nome dell'applicazione. - {StrBegin="NETSDK1029: "} - - - NETSDK1078: Unable to use '{0}' as application host executable because it's not a Windows PE file. - NETSDK1078: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un file di Windows PE. - {StrBegin="NETSDK1078: "} - - - NETSDK1072: Unable to use '{0}' as application host executable because it's not a Windows executable for the CUI (Console) subsystem. - NETSDK1072: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un eseguibile Windows per il sottosistema CUI (Console). - {StrBegin="NETSDK1072: "} - - - NETSDK1177: Failed to sign apphost with error code {1}: {0} - NETSDK1177: impossibile firmare apphost con codice di errore {1}: {0} - {StrBegin="NETSDK1177: "} - - - NETSDK1079: The Microsoft.AspNetCore.All package is not supported when targeting .NET Core 3.0 or higher. A FrameworkReference to Microsoft.AspNetCore.App should be used instead, and will be implicitly included by Microsoft.NET.Sdk.Web. - NETSDK1079: il pacchetto Microsoft.AspNetCore.All non è supportato quando la destinazione è .NET Core 3.0 o versione successiva. È necessario un elemento FrameworkReference per Microsoft.AspNetCore.App, che verrà incluso in modo implicito da Microsoft.NET.Sdk.Web. - {StrBegin="NETSDK1079: "} - - - NETSDK1080: A PackageReference to Microsoft.AspNetCore.App is not necessary when targeting .NET Core 3.0 or higher. If Microsoft.NET.Sdk.Web is used, the shared framework will be referenced automatically. Otherwise, the PackageReference should be replaced with a FrameworkReference. - NETSDK1080: non è necessario alcun elemento PackageReference per Microsoft.AspNetCore.App quando la destinazione è .NET Core 3.0 o versione successiva. Se si usa Microsoft.NET.Sdk.Web, il riferimento al framework condiviso verrà inserito automaticamente; in caso contrario, l'elemento PackageReference deve essere sostituito da un elemento FrameworkReference. - {StrBegin="NETSDK1080: "} - - - NETSDK1017: Asset preprocessor must be configured before assets are processed. - NETSDK1017: prima di elaborare le risorse, è necessario configurare il preprocessore di risorse. - {StrBegin="NETSDK1017: "} - - - NETSDK1047: Assets file '{0}' doesn't have a target for '{1}'. Ensure that restore has run and that you have included '{2}' in the TargetFrameworks for your project. You may also need to include '{3}' in your project's RuntimeIdentifiers. - NETSDK1047: il file di risorse '{0}' non contiene una destinazione per '{1}'. Assicurarsi che il ripristino sia stato eseguito e che '{2}' sia stato incluso negli elementi TargetFramework del progetto. Potrebbe anche essere necessario includere '{3}' negli elementi RuntimeIdentifier del progetto. - {StrBegin="NETSDK1047: "} - - - NETSDK1005: Assets file '{0}' doesn't have a target for '{1}'. Ensure that restore has run and that you have included '{2}' in the TargetFrameworks for your project. - NETSDK1005: il file di risorse '{0}' non contiene una destinazione per '{1}'. Assicurarsi che il ripristino sia stato eseguito e che '{2}' sia stato incluso negli elementi TargetFramework del progetto. - {StrBegin="NETSDK1005: "} - - - NETSDK1004: Assets file '{0}' not found. Run a NuGet package restore to generate this file. - NETSDK1004: il file di risorse '{0}' non è stato trovato. Per generare questo file, eseguire un ripristino del pacchetto NuGet. - {StrBegin="NETSDK1004: "} - - - NETSDK1063: The path to the project assets file was not set. Run a NuGet package restore to generate this file. - NETSDK1063: il percorso del file di risorse del progetto non è stato impostato. Per generare questo file, eseguire un ripristino del pacchetto NuGet. - {StrBegin="NETSDK1063: "} - - - NETSDK1006: Assets file path '{0}' is not rooted. Only full paths are supported. - NETSDK1006: il percorso dei file di risorse '{0}' non contiene una radice. Sono supportati solo percorsi completi. - {StrBegin="NETSDK1006: "} - - - NETSDK1001: At least one possible target framework must be specified. - NETSDK1001: è necessario specificare almeno un framework di destinazione possibile. - {StrBegin="NETSDK1001: "} - - - NETSDK1092: The CLSIDMap cannot be embedded on the COM host because adding resources requires that the build be performed on Windows (excluding Nano Server). - NETSDK1092: non è possibile incorporare l'elemento CLSIDMap nell'host COM perché per aggiungere risorse è necessario eseguire la compilazione in Windows (escluso Nano Server). - {StrBegin="NETSDK1092: "} - - - NETSDK1065: Cannot find app host for {0}. {0} could be an invalid runtime identifier (RID). For more information about RID, see https://aka.ms/rid-catalog. - NETSDK1065: non è possibile trovare l'host delle app per {0}. {0} potrebbe essere un identificatore di runtime (RID) non valido. Per altre informazioni sul RID, vedere https://aka.ms/rid-catalog. - {StrBegin="NETSDK1065: "} - - - NETSDK1091: Unable to find a .NET Core COM host. The .NET Core COM host is only available on .NET Core 3.0 or higher when targeting Windows. - NETSDK1091: non è possibile trovare un host COM .NET Core. L'host COM .NET Core è disponibile solo in .NET Core 3.0 o versioni successive quando è destinato a Windows. - {StrBegin="NETSDK1091: "} - - - NETSDK1114: Unable to find a .NET Core IJW host. The .NET Core IJW host is only available on .NET Core 3.1 or higher when targeting Windows. - NETSDK1114: non è possibile trovare un host IJW .NET Core. L'host IJW .NET Core è disponibile solo in .NET Core 3.1 o versioni successive quando la destinazione è Windows. - {StrBegin="NETSDK1114: "} - - - NETSDK1007: Cannot find project info for '{0}'. This can indicate a missing project reference. - NETSDK1007: le informazioni del progetto per '{0}' non sono state trovate. Questo errore può indicare la mancanza di un riferimento al progetto. - {StrBegin="NETSDK1007: "} - - - NETSDK1032: The RuntimeIdentifier platform '{0}' and the PlatformTarget '{1}' must be compatible. - NETSDK1032: la piattaforma '{0}' di RuntimeIdentifier e quella '{1}' di PlatformTarget devono essere compatibili. - {StrBegin="NETSDK1032: "} - - - NETSDK1031: It is not supported to build or publish a self-contained application without specifying a RuntimeIdentifier. You must either specify a RuntimeIdentifier or set SelfContained to false. - NETSDK1031: non è possibile compilare o pubblicare un'applicazione indipendente senza specificare un elemento RuntimeIdentifier. Specificare un elemento RuntimeIdentifier o impostare SelfContained su false. - {StrBegin="NETSDK1031: "} - - - NETSDK1097: It is not supported to publish an application to a single-file without specifying a RuntimeIdentifier. You must either specify a RuntimeIdentifier or set PublishSingleFile to false. - NETSDK1097: non è possibile pubblicare un'applicazione in un singolo file senza specificare un elemento RuntimeIdentifier. Specificare un elemento RuntimeIdentifier o impostare PublishSingleFile su false. - {StrBegin="NETSDK1097: "} - - - NETSDK1098: Applications published to a single-file are required to use the application host. You must either set PublishSingleFile to false or set UseAppHost to true. - NETSDK1098: le applicazioni pubblicate in un singolo file sono necessarie per usare l'host dell'applicazione. Impostare PublishSingleFile su false o UseAppHost su true. - {StrBegin="NETSDK1098: "} - - - NETSDK1099: Publishing to a single-file is only supported for executable applications. - NETSDK1099: la pubblicazione in un singolo file è supportata solo per le applicazioni eseguibili. - {StrBegin="NETSDK1099: "} - - - NETSDK1134: Building a solution with a specific RuntimeIdentifier is not supported. If you would like to publish for a single RID, specifiy the RID at the individual project level instead. - NETSDK1134: non è possibile compilare una soluzione con un parametro RuntimeIdentifier specifico. Per pubblicare per un singolo RID, specificare il RID a livello di singolo progetto. - {StrBegin="NETSDK1134: "} - - - NETSDK1135: SupportedOSPlatformVersion {0} cannot be higher than TargetPlatformVersion {1}. - NETSDK1135: il valore di SupportedOSPlatformVersion {0} non può essere maggiore di quello di TargetPlatformVersion {1}. - {StrBegin="NETSDK1135: "} - - - NETSDK1143: Including all content in a single file bundle also includes native libraries. If IncludeAllContentForSelfExtract is true, IncludeNativeLibrariesForSelfExtract must not be false. - NETSDK1143: se si include tutto il contenuto in un unico bundle di file, verranno incluse anche le librerie native. Se IncludeAllContentForSelfExtract è true, IncludeNativeLibrariesForSelfExtract non deve essere false. - {StrBegin="NETSDK1143: "} - - - NETSDK1142: Including symbols in a single file bundle is not supported when publishing for .NET5 or higher. - NETSDK1142: l'inclusione dei simboli in un unico bundle di file non è supportata quando si esegue la pubblicazione per .NET 5 o versioni successive. - {StrBegin="NETSDK1142: "} - - - NETSDK1013: The TargetFramework value '{0}' was not recognized. It may be misspelled. If not, then the TargetFrameworkIdentifier and/or TargetFrameworkVersion properties must be specified explicitly. - NETSDK1013: il valore {0}' di TargetFramework non è stato riconosciuto. È possibile che sia stato digitato in modo errato. In caso contrario, le proprietà TargetFrameworkIdentifier e/o TargetFrameworkVersion devono essere specificate in modo esplicito. - {StrBegin="NETSDK1013: "} - - - NETSDK1067: Self-contained applications are required to use the application host. Either set SelfContained to false or set UseAppHost to true. - NETSDK1067: con le applicazioni complete è necessario usare l'host applicazione. Impostare SelfContained su false o UseAppHost su true. - {StrBegin="NETSDK1067: "} - - - NETSDK1125: Publishing to a single-file is only supported for netcoreapp target. - NETSDK1125: la pubblicazione in un file singolo è supportata solo per la destinazione netcoreapp. - {StrBegin="NETSDK1125: "} - - - Choosing '{0}' because AssemblyVersion '{1}' is greater than '{2}'. - Verrà scelto '{0}' perché il valore di AssemblyVersion '{1}' è maggiore di '{2}'. - - - - Choosing '{0}' arbitrarily as both items are copy-local and have equal file and assembly versions. - Verrà scelto '{0}' in modo arbitrario perché entrambi gli elementi sono una copia locale e contengono versioni di file e assembly uguali. - - - - Choosing '{0}' because file version '{1}' is greater than '{2}'. - Verrà scelto '{0}' perché la versione del file '{1}' è maggiore di '{2}'. - - - - Choosing '{0}' because it is a platform item. - Verrà scelto '{0}' perché è un elemento della piattaforma. - - - - Choosing '{0}' because it comes from a package that is preferred. - Verrà scelto '{0}' perché proviene da un pacchetto preferito. - - - - NETSDK1089: The '{0}' and '{1}' types have the same CLSID '{2}' set in their GuidAttribute. Each COMVisible class needs to have a distinct guid for their CLSID. - NETSDK1089: per i tipi '{0}' e '{1}' è impostato lo stesso CLSID '{2}' nel relativo elemento GuidAttribute. Ogni classe COMVisible deve includere un GUID distinto per il CLSID. - {StrBegin="NETSDK1089: "} -{0} - The first type with the conflicting guid. -{1} - The second type with the conflicting guid. -{2} - The guid the two types have. - - - NETSDK1088: The COMVisible class '{0}' must have a GuidAttribute with the CLSID of the class to be made visible to COM in .NET Core. - NETSDK1088: la classe COMVisible '{0}' deve includere un elemento GuidAttribute con il CLSID della classe da rendere visibile per COM in .NET Core. - {StrBegin="NETSDK1088: "} -{0} - The ComVisible class that doesn't have a GuidAttribute on it. - - - NETSDK1090: The supplied assembly '{0}' is not valid. Cannot generate a CLSIDMap from it. - NETSDK1090: l'assembly specificato '{0}' non è valido. Non può essere usato per generare un elemento CLSIDMap. - {StrBegin="NETSDK1090: "} -{0} - The path to the invalid assembly. - - - NETSDK1167: Compression in a single file bundle is only supported when publishing for .NET6 or higher. - NETSDK1167: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione per .NET6 o versioni successive. - {StrBegin="NETSDK1167: "} - - - NETSDK1176: Compression in a single file bundle is only supported when publishing a self-contained application. - NETSDK1176: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione di un'applicazione indipendente. - {StrBegin="NETSDK1176: "} - - - NETSDK1133: There was conflicting information about runtime packs available for {0}: -{1} - NETSDK1133: sono presenti informazioni in conflitto sui pacchetti di runtime disponibili per {0}: -{1} - {StrBegin="NETSDK1133: "} - - - NETSDK1014: Content item for '{0}' sets '{1}', but does not provide '{2}' or '{3}'. - NETSDK1014: l'elemento di contenuto per '{0}' imposta '{1}', ma non fornisce '{2}' o '{3}'. - {StrBegin="NETSDK1014: "} - - - NETSDK1010: The '{0}' task must be given a value for parameter '{1}' in order to consume preprocessed content. - NETSDK1010: per poter utilizzare il contenuto pre-elaborato, è necessario assegnare un valore per il parametro '{1}' nell'attività '{0}'. - {StrBegin="NETSDK1010: "} - - - Could not determine winner because '{0}' does not exist. - Non è stato possibile determinare la versione da usare perché '{0}' non esiste. - - - - Could not determine winner due to equal file and assembly versions. - Non è stato possibile determinare la versione da usare perché le versioni dell'assembly e del file sono uguali. - - - - Could not determine a winner because '{0}' has no file version. - Non è stato possibile determinare la versione da usare perché non esiste alcuna versione del file per '{0}'. - - - - Could not determine a winner because '{0}' is not an assembly. - Non è stato possibile determinare la versione da usare perché '{0}' non è un assembly. - - - - NETSDK1181: Error getting pack version: Pack '{0}' was not present in workload manifests. - NETSDK1181: errore durante il recupero della versione del pacchetto: il pacchetto '{0}' non era presente nei manifesti del carico di lavoro. - {StrBegin="NETSDK1181: "} - - - NETSDK1042: Could not load PlatformManifest from '{0}' because it did not exist. - NETSDK1042: non è stato possibile caricare PlatformManifest da '{0}' perché non esiste. - {StrBegin="NETSDK1042: "} - - - NETSDK1120: C++/CLI projects targeting .NET Core require a target framework of at least 'netcoreapp3.1'. - NETSDK1120: con i progetti C++/CLI destinati a .NET Core è il framework di destinazione deve essere impostato almeno su 'netcoreapp3.1'. - {StrBegin="NETSDK1120: "} - - - NETSDK1158: Required '{0}' metadata missing on Crossgen2Tool item. - NETSDK1158: nell'elemento Crossgen2Tool mancano i metadati richiesti di '{0}'. - {StrBegin="NETSDK1158: "} - - - NETSDK1126: Publishing ReadyToRun using Crossgen2 is only supported for self-contained applications. - NETSDK1126: la pubblicazione di ReadyToRun tramite Crossgen2 è supportata solo per le applicazioni autonome. - {StrBegin="NETSDK1126: "} - - - NETSDK1155: Crossgen2Tool executable '{0}' not found. - NETSDK1155: l'eseguibile '{0}' di Crossgen2Tool non è stato trovato. - {StrBegin="NETSDK1155: "} - - - NETSDK1154: Crossgen2Tool must be specified when UseCrossgen2 is set to true. - NETSDK1154: è necessario specificare Crossgen2Tool quando UseCrossgen2 è impostato su true. - {StrBegin="NETSDK1154: "} - - - NETSDK1166: Cannot emit symbols when publishing for .NET 5 with Crossgen2 using composite mode. - NETSDK1166: non è possibile creare simboli durante la pubblicazione per .NET 5 con Crossgen2 usando la modalità composita. - {StrBegin="NETSDK1166: "} - - - NETSDK1160: CrossgenTool executable '{0}' not found. - NETSDK1160: l'eseguibile '{0}' di CrossgenTool non è stato trovato. - {StrBegin="NETSDK1160: "} - - - NETSDK1153: CrossgenTool not specified in PDB compilation mode. - NETSDK1153: CrossgenTool non è stato specificato nella modalità di compilazione PDB. - {StrBegin="NETSDK1153: "} - - - NETSDK1159: CrossgenTool must be specified when UseCrossgen2 is set to false. - NETSDK1159: è necessario specificare CrossgenTool quando UseCrossgen2 è impostato su false. - {StrBegin="NETSDK1159: "} - - - NETSDK1161: DiaSymReader library '{0}' not found. - NETSDK1161: la libreria '{0}' di DiaSymReader non è stata trovata. - {StrBegin="NETSDK1161: "} - - - NETSDK1156: .NET host executable '{0}' not found. - NETSDK1156: l'eseguibile '{0}' dell'host .NET non è stato trovato. - {StrBegin="NETSDK1156: "} - - - NETSDK1055: DotnetTool does not support target framework lower than netcoreapp2.1. - NETSDK1055: DotnetTool non supporta framework di destinazione di versioni precedenti a netcoreapp2.1. - {StrBegin="NETSDK1055: "} - - - NETSDK1054: only supports .NET Core. - NETSDK1054: supporta solo .NET Core. - {StrBegin="NETSDK1054: "} - - - NETSDK1022: Duplicate '{0}' items were included. The .NET SDK includes '{0}' items from your project directory by default. You can either remove these items from your project file, or set the '{1}' property to '{2}' if you want to explicitly include them in your project file. For more information, see {4}. The duplicate items were: {3} - NETSDK1022: sono stati inclusi '{0}' elementi duplicati. Per impostazione predefinita, .NET SDK include '{0}' elementi della directory del progetto. È possibile rimuovere tali elementi dal file di progetto oppure impostare la proprietà '{1}' su '{2}' se si vuole includerli implicitamente nel file di progetto. Per altre informazioni, vedere {4}. Gli elementi duplicati sono: {3} - {StrBegin="NETSDK1022: "} - - - NETSDK1015: The preprocessor token '{0}' has been given more than one value. Choosing '{1}' as the value. - NETSDK1015: al token di preprocessore '{0}' è stato assegnato più di un valore. Come valore verrà scelto '{1}'. - {StrBegin="NETSDK1015: "} - - - NETSDK1152: Found multiple publish output files with the same relative path: {0}. - NETSDK1152: sono stati trovati più file di output di pubblicazione con lo stesso percorso relativo: {0}. - {StrBegin="NETSDK1152: "} - - - NETSDK1110: More than one asset in the runtime pack has the same destination sub-path of '{0}'. Report this error to the .NET team here: https://aka.ms/dotnet-sdk-issue. - NETSDK1110: più di un asset nel pacchetto di runtime ha lo stesso percorso secondario di destinazione di '{0}'. Segnalare questo errore al team di .NET all'indirizzo: https://aka.ms/dotnet-sdk-issue. - {StrBegin="NETSDK1110: "} - - - NETSDK1169: The same resource ID {0} was specified for two type libraries '{1}' and '{2}'. Duplicate type library IDs are not allowed. - NETSDK1169: è stato specificato lo stesso ID di risorsa {0} per due librerie dei tipi '{1}' e '{2}'. Gli ID della libreria dei tipi duplicati non sono consentiti. - {StrBegin="NETSDK1169: "} - - - Encountered conflict between '{0}' and '{1}'. - È stato rilevato un conflitto tra '{0}' e '{1}'. - - - - NETSDK1051: Error parsing FrameworkList from '{0}'. {1} '{2}' was invalid. - NETSDK1051: si è verificato un errore durante l'analisi di FrameworkList da '{0}'. {1} '{2}' non è valido. - {StrBegin="NETSDK1051: "} - - - NETSDK1043: Error parsing PlatformManifest from '{0}' line {1}. Lines must have the format {2}. - NETSDK1043: si è verificato un errore durante l'analisi di PlatformManifest da '{0}' a riga {1}. Il formato delle righe deve essere {2}. - {StrBegin="NETSDK1043: "} - - - NETSDK1044: Error parsing PlatformManifest from '{0}' line {1}. {2} '{3}' was invalid. - NETSDK1044: si è verificato un errore durante l'analisi di PlatformManifest da '{0}' a riga {1}. Il valore {2} '{3}' non è valido. - {StrBegin="NETSDK1044: "} - - - NETSDK1060: Error reading assets file: {0} - NETSDK1060: errore durante la lettura del file di asset: {0} - {StrBegin="NETSDK1060: "} - - - NETSDK1111: Failed to delete output apphost: {0} - NETSDK1111: non è stato possibile eliminare l'apphost di output: {0} - {StrBegin="NETSDK1111: "} - - - NETSDK1077: Failed to lock resource. - NETSDK1077: non è stato possibile bloccare la risorsa. - {StrBegin="NETSDK1077: "} - - - NETSDK1030: Given file name '{0}' is longer than 1024 bytes - NETSDK1030: il nome file specificato '{0}' supera 1024 byte - {StrBegin="NETSDK1030: "} - - - NETSDK1024: Folder '{0}' already exists either delete it or provide a different ComposeWorkingDir - NETSDK1024: la cartella '{0}' esiste già. Eliminarla o specificare un elemento ComposeWorkingDir diverso - {StrBegin="NETSDK1024: "} - - - NETSDK1068: The framework-dependent application host requires a target framework of at least 'netcoreapp2.1'. - NETSDK1068: con l'host applicazione dipendente dal framework il framework di destinazione deve essere impostato almeno su 'netcoreapp2.1'. - {StrBegin="NETSDK1068: "} - - - NETSDK1052: Framework list file path '{0}' is not rooted. Only full paths are supported. - NETSDK1052: il percorso '{0}' del file dell'elenco di framework non contiene una radice. Sono supportati solo percorsi completi. - {StrBegin="NETSDK1052: "} - - - NETSDK1087: Multiple FrameworkReference items for '{0}' were included in the project. - NETSDK1087: nel progetto sono stati inclusi più elementi FrameworkReference per '{0}'. - {StrBegin="NETSDK1087: "} - - - NETSDK1086: A FrameworkReference for '{0}' was included in the project. This is implicitly referenced by the .NET SDK and you do not typically need to reference it from your project. For more information, see {1} - NETSDK1086: nel progetto è stato incluso un elemento FrameworkReference per '{0}'. Questo elemento viene usato come riferimento implicito da .NET SDK e non è in genere necessario farvi riferimento dal progetto. Per altre informazioni, vedere {1} - {StrBegin="NETSDK1086: "} - - - NETSDK1049: Resolved file has a bad image, no metadata, or is otherwise inaccessible. {0} {1} - NETSDK1049: il file risolto ha un'immagine danneggiata, non contiene metadati o è inaccessibile per altri motivi. {0} {1} - {StrBegin="NETSDK1049: "} - - - NETSDK1141: Unable to resolve the .NET SDK version as specified in the global.json located at {0}. - NETSDK1141: non è possibile risolvere la versione di .NET SDK come specificato nel file global.json presente in {0}. - {StrBegin="NETSDK1141: "} - - - NETSDK1144: Optimizing assemblies for size failed. Optimization can be disabled by setting the PublishTrimmed property to false. - NETSDK1144: l'ottimizzazione degli assembly per le dimensioni non è riuscita. È possibile disabilitare l'ottimizzazione impostando la proprietà PublishTrimmed su false. - {StrBegin="NETSDK1144: "} - - - NETSDK1102: Optimizing assemblies for size is not supported for the selected publish configuration. Please ensure that you are publishing a self-contained app. - NETSDK1102: l'ottimizzazione degli assembly per le dimensioni non è supportata per la configurazione di pubblicazione selezionata. Assicurarsi di pubblicare un'app indipendente. - {StrBegin="NETSDK1102: "} - - - Optimizing assemblies for size, which may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink - Verrà eseguita l'ottimizzazione degli assembly per le dimensioni. Questa operazione potrebbe comportare la modifica del comportamento dell'app. Assicurarsi di testarla dopo la pubblicazione. Vedere: https://aka.ms/dotnet-illink - - - - NETSDK1020: Package Root {0} was incorrectly given for Resolved library {1} - NETSDK1020: la radice {0} del pacchetto specificata per la libreria risolta {1} non è corretta - {StrBegin="NETSDK1020: "} - - - NETSDK1025: The target manifest {0} provided is of not the correct format - NETSDK1025: il formato del manifesto di destinazione specificato {0} non è corretto - {StrBegin="NETSDK1025: "} - - - NETSDK1163: Input assembly '{0}' not found. - NETSDK1163: l'assembly di input '{0}' non è stato trovato. - {StrBegin="NETSDK1163: "} - - - NETSDK1003: Invalid framework name: '{0}'. - NETSDK1003: nome di framework non valido: '{0}'. - {StrBegin="NETSDK1003: "} - - - NETSDK1058: Invalid value for ItemSpecToUse parameter: '{0}'. This property must be blank or set to 'Left' or 'Right' - NETSDK1058: valore non valido per il parametro ItemSpecToUse: '{0}'. Questa proprietà deve essere vuota o impostata su 'Left' o 'Right' - {StrBegin="NETSDK1058: "} -The following are names of parameters or literal values and should not be translated: ItemSpecToUse, Left, Right - - - NETSDK1018: Invalid NuGet version string: '{0}'. - NETSDK1018: la stringa di versione '{0}' di NuGet non è valida. - {StrBegin="NETSDK1018: "} - - - NETSDK1075: Update handle is invalid. This instance may not be used for further updates. - NETSDK1075: il punto di controllo dell'aggiornamento non è valido. Non è possibile usare questa istanza per ulteriori aggiornamenti. - {StrBegin="NETSDK1075: "} - - - NETSDK1104: RollForward value '{0}' is invalid. Allowed values are {1}. - NETSDK1104: il valore '{0}' di RollForward non è valido. I valori consentiti sono {1}. - {StrBegin="NETSDK1104: "} - - - NETSDK1140: {0} is not a valid TargetPlatformVersion for {1}. Valid versions include: -{2} - NETSDK1140: {0} non è un valore valido di TargetPlatformVersion per or {1}. Le versioni valide includono: -{2} - {StrBegin="NETSDK1140: "} - - - NETSDK1173: The provided type library '{0}' is in an invalid format. - NETSDK1173: il formato della libreria dei tipi specificata '{0}' non è valido. - {StrBegin="NETSDK1173: "} - - - NETSDK1170: The provided type library ID '{0}' for type library '{1}' is invalid. The ID must be a positive integer less than 65536. - NETSDK1170: l'ID '{0}' per la libreria dei tipi specificato '{1}' non è valido. L'ID deve essere un numero positivo intero inferiore a 65536. - {StrBegin="NETSDK1170: "} - - - NETSDK1157: JIT library '{0}' not found. - NETSDK1157: la libreria '{0}' di JIT non è stata trovata. - {StrBegin="NETSDK1157: "} - - - NETSDK1061: The project was restored using {0} version {1}, but with current settings, version {2} would be used instead. To resolve this issue, make sure the same settings are used for restore and for subsequent operations such as build or publish. Typically this issue can occur if the RuntimeIdentifier property is set during build or publish but not during restore. For more information, see https://aka.ms/dotnet-runtime-patch-selection. - NETSDK1061: per il ripristino del progetto è stato usato {0} versione {1}, ma con le impostazioni correnti viene usata la versione {2}. Per risolvere il problema, assicurarsi di usare le stesse impostazioni per il ripristino e per le operazioni successive, quali compilazione o pubblicazione. In genere questo problema può verificarsi se la proprietà RuntimeIdentifier viene impostata durante la compilazione o la pubblicazione, ma non durante il ripristino. Per altre informazioni, vedere https://aka.ms/dotnet-runtime-patch-selection. - {StrBegin="NETSDK1061: "} -{0} - Package Identifier for platform package -{1} - Restored version of platform package -{2} - Current version of platform package - - - NETSDK1008: Missing '{0}' metadata on '{1}' item '{2}'. - NETSDK1008: mancano i metadati di '{0}' sull'elemento '{2}' di '{1}'. - {StrBegin="NETSDK1008: "} - - - NETSDK1164: Missing output PDB path in PDB generation mode (OutputPDBImage metadata). - NETSDK1164: il percorso PDB di output non è presente nella modalità di generazione PDB (metadati di OutputPDBImage). - {StrBegin="NETSDK1164: "} - - - NETSDK1165: Missing output R2R image path (OutputR2RImage metadata). - NETSDK1165: il percorso dell'immagine R2R di output non è presente (metadati di OutputR2RImage). - {StrBegin="NETSDK1165: "} - - - NETSDK1171: An integer ID less than 65536 must be provided for type library '{0}' because more than one type library is specified. - NETSDK1171: un ID intero inferiore a 65536 deve essere fornito per la libreria dei tipi '{0}' perché è specificata più di una libreria dei tipi. - {StrBegin="NETSDK1171: "} - - - NETSDK1021: More than one file found for {0} - NETSDK1021: è stato trovato più di un file per {0} - {StrBegin="NETSDK1021: "} - - - NETSDK1069: This project uses a library that targets .NET Standard 1.5 or higher, and the project targets a version of .NET Framework that doesn't have built-in support for that version of .NET Standard. Visit https://aka.ms/net-standard-known-issues for a set of known issues. Consider retargeting to .NET Framework 4.7.2. - NETSDK1069: questo progetto usa una libreria destinata a .NET Standard 1.5 o versione successiva ed è destinato a una versione di .NET Framework che non include il supporto predefinito per tale versione di .NET Standard. Per un serie di problemi noti, visitare https://aka.ms/net-standard-known-issues. Provare a impostare come destinazione .NET Framework 4.7.2. - {StrBegin="NETSDK1069: "} - - - NETSDK1115: The current .NET SDK does not support .NET Framework without using .NET SDK Defaults. It is likely due to a mismatch between C++/CLI project CLRSupport property and TargetFramework. - NETSDK1115: l'istanza corrente di .NET SDK non supporta .NET Framework senza usare le impostazioni predefinite di .NET SDK. Il problema dipende probabilmente da una mancata corrispondenza tra la proprietà CLRSupport del progetto C++/CLI e TargetFramework. - {StrBegin="NETSDK1115: "} - - - NETSDK1182: Targeting .NET 6.0 or higher in Visual Studio 2019 is not supported. - NETSDK1182: la destinazione .NET 6.0 o versione successiva in Visual Studio 2019 non è supportata. - {StrBegin="NETSDK1182: "} - - - NETSDK1084: There is no application host available for the specified RuntimeIdentifier '{0}'. - NETSDK1084: non è disponibile alcun host applicazione per l'elemento RuntimeIdentifier specificato '{0}'. - {StrBegin="NETSDK1084: "} - - - NETSDK1085: The 'NoBuild' property was set to true but the 'Build' target was invoked. - NETSDK1085: non è stata impostata alcuna proprietà 'NoBuild' su true, ma è stata chiamata la destinazione 'Build'. - {StrBegin="NETSDK1085: "} - - - NETSDK1002: Project '{0}' targets '{2}'. It cannot be referenced by a project that targets '{1}'. - NETSDK1002: il progetto '{0}' è destinato a '{2}'. Non può essere usato come riferimento in un progetto destinato a '{1}'. - {StrBegin="NETSDK1002: "} - - - NETSDK1082: There was no runtime pack for {0} available for the specified RuntimeIdentifier '{1}'. - NETSDK1082: non è disponibile alcun pacchetto di runtime per {0} per l'elemento RuntimeIdentifier specificato '{1}'. - {StrBegin="NETSDK1082: "} - - - NETSDK1132: No runtime pack information was available for {0}. - NETSDK1132: non sono disponibili informazioni sui pacchetti di runtime per {0}. - {StrBegin="NETSDK1132: "} - - - NETSDK1128: COM hosting does not support self-contained deployments. - NETSDK1128: l'hosting COM non supporta le distribuzioni complete. - {StrBegin="NETSDK1128: "} - - - NETSDK1119: C++/CLI projects targeting .NET Core cannot use EnableComHosting=true. - NETSDK1119: i progetti C++/CLI destinati a .NET Core non possono usare EnableComHosting=true. - {StrBegin="NETSDK1119: "} - - - NETSDK1116: C++/CLI projects targeting .NET Core must be dynamic libraries. - NETSDK1116: i progetti C++/CLI destinati a .NET Core devono essere librerie dinamiche. - {StrBegin="NETSDK1116: "} - - - NETSDK1118: C++/CLI projects targeting .NET Core cannot be packed. - NETSDK1118: i progetti C++/CLI destinati a .NET Core non possono essere compressi. - {StrBegin="NETSDK1118: "} - - - NETSDK1117: Does not support publish of C++/CLI project targeting dotnet core. - NETSDK1117: la pubblicazione di progetti C++/CLI destinati a .NET Core non è supportata. - {StrBegin="NETSDK1117: "} - - - NETSDK1121: C++/CLI projects targeting .NET Core cannot use SelfContained=true. - NETSDK1121: i progetti C++/CLI destinati a .NET Core non possono usare SelfContained=true. - {StrBegin="NETSDK1121: "} - - - NETSDK1151: The referenced project '{0}' is a self-contained executable. A self-contained executable cannot be referenced by a non self-contained executable. For more information, see https://aka.ms/netsdk1151 - NETSDK1151: il progetto '{0}' a cui viene fatto riferimento è un eseguibile autonomo. Non è possibile fare riferimento a un eseguibile autonomo da un eseguibile non autonomo. Per altre informazioni, vedere https://aka.ms/netsdk1151 - {StrBegin="NETSDK1151: "} - - - NETSDK1162: PDB generation: R2R executable '{0}' not found. - NETSDK1162: generazione PDB: l'eseguibile '{0}' di R2R non è stato trovato. - {StrBegin="NETSDK1162: "} - - - NETSDK1053: Pack as tool does not support self contained. - NETSDK1053: la creazione di pacchetti come strumenti non prevede elementi autonomi. - {StrBegin="NETSDK1053: "} - - - NETSDK1146: PackAsTool does not support TargetPlatformIdentifier being set. For example, TargetFramework cannot be net5.0-windows, only net5.0. PackAsTool also does not support UseWPF or UseWindowsForms when targeting .NET 5 and higher. - NETSDK1146: PackAsTool non supporta l'impostazione di TargetPlatformIdentifier. Ad esempio, TargetFramework non può essere essere impostato su net5.0-windows, ma solo su net5.0. PackAsTool non supporta neanche UseWPF o UseWindowsForms quando la destinazione è .NET 5 e versioni successive. - {StrBegin="NETSDK1146: "} - - - NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. - NETSDK1064: il pacchetto {0} versione {1} non è stato trovato. Potrebbe essere stato eliminato dopo il ripristino di NuGet. In caso contrario, il ripristino di NuGet potrebbe essere stato completato solo parzialmente, a causa delle restrizioni relative alla lunghezza massima del percorso. - {StrBegin="NETSDK1064: "} - - - NETSDK1023: A PackageReference for '{0}' was included in your project. This package is implicitly referenced by the .NET SDK and you do not typically need to reference it from your project. For more information, see {1} - NETSDK1023: nel progetto è stato incluso un riferimento al pacchetto per '{0}'. Questo pacchetto viene usato come riferimento implicito da .NET SDK e non è in genere necessario farvi riferimento dal progetto. Per altre informazioni, vedere {1} - {StrBegin="NETSDK1023: "} - - - NETSDK1071: A PackageReference to '{0}' specified a Version of `{1}`. Specifying the version of this package is not recommended. For more information, see https://aka.ms/sdkimplicitrefs - NETSDK1071: in un elemento PackageReference che fa riferimento a '{0}' è specificata la versione di `{1}`. È consigliabile non specificare la versione di questo pacchetto. Per altre informazioni, vedere https://aka.ms/sdkimplicitrefs - {StrBegin="NETSDK1071: "} - - - NETSDK1174: Placeholder - NETSDK1174: Placeholder - {StrBegin="NETSDK1174: "} - This string is not used here, but is a placeholder for the error code, which is used by the "dotnet run" command. - - - NETSDK1011: Assets are consumed from project '{0}', but no corresponding MSBuild project path was found in '{1}'. - NETSDK1011: le risorse vengono utilizzate dal progetto '{0}', ma non è stato trovato alcun percorso di progetto MSBuild corrispondente in '{1}'. - {StrBegin="NETSDK1011: "} - - - NETSDK1059: The tool '{0}' is now included in the .NET SDK. Information on resolving this warning is available at (https://aka.ms/dotnetclitools-in-box). - NETSDK1059: lo strumento '{0}' è ora incluso in .NET SDK. Per informazioni sulla risoluzione di questo avviso, vedere (https://aka.ms/dotnetclitools-in-box). - {StrBegin="NETSDK1059: "} - - - NETSDK1093: Project tools (DotnetCliTool) only support targeting .NET Core 2.2 and lower. - NETSDK1093: gli strumenti del progetto (DotnetCliTool) supportano come destinazione solo .NET Core 2.2 e versioni precedenti. - {StrBegin="NETSDK1093: "} - - - NETSDK1122: ReadyToRun compilation will be skipped because it is only supported for .NET Core 3.0 or higher. - NETSDK1122: la compilazione eseguita con ReadyToRun verrà ignorata perché è supportata solo per .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1122: "} - - - NETSDK1123: Publishing an application to a single-file requires .NET Core 3.0 or higher. - NETSDK1123: per la pubblicazione di un'applicazione in un file singolo è richiesto .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1123: "} - - - NETSDK1124: Trimming assemblies requires .NET Core 3.0 or higher. - NETSDK1124: per il trimming degli assembly è richiesto .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1124: "} - - - NETSDK1129: The 'Publish' target is not supported without specifying a target framework. The current project targets multiple frameworks, you must specify the framework for the published application. - NETSDK1129: la destinazione 'Publish' non è supportata se non viene specificato un framework di destinazione. Il progetto corrente è destinato a più framework, di conseguenza è necessario specificare il framework per l'applicazione pubblicata. - {StrBegin="NETSDK1129: "} - - - NETSDK1096: Optimizing assemblies for performance failed. You can either exclude the failing assemblies from being optimized, or set the PublishReadyToRun property to false. - NETSDK1096: l'ottimizzazione degli assembly per le prestazioni non è riuscita. È possibile escludere gli assembly in errore dall'ottimizzazione oppure impostare la proprietà PublishReadyToRun su false. - {StrBegin="NETSDK1096: "} - - - Some ReadyToRun compilations emitted warnings, indicating potential missing dependencies. Missing dependencies could potentially cause runtime failures. To show the warnings, set the PublishReadyToRunShowWarnings property to true. - Alcune compilazioni eseguite con la proprietà ReadyToRun hanno restituito avvisi per indicare potenziali dipendenze mancanti. Le dipendenze mancanti potrebbero causare errori di runtime. Per visualizzare gli avvisi, impostare la proprietà PublishReadyToRunShowWarnings su true. - - - - NETSDK1094: Unable to optimize assemblies for performance: a valid runtime package was not found. Either set the PublishReadyToRun property to false, or use a supported runtime identifier when publishing. - NETSDK1094: non è possibile ottimizzare gli assembly per le prestazioni perché non è stato trovato alcun pacchetto di runtime valido. Impostare la proprietà PublishReadyToRun su false oppure usare un identificatore di runtime supportato durante la pubblicazione. - {StrBegin="NETSDK1094: "} - - - NETSDK1095: Optimizing assemblies for performance is not supported for the selected target platform or architecture. Please verify you are using a supported runtime identifier, or set the PublishReadyToRun property to false. - NETSDK1095: l'ottimizzazione degli assembly per le prestazioni non è supportata per la piattaforma o l'architettura di destinazione selezionata. Verificare di usare un identificatore di runtime supportato oppure impostare la proprietà PublishReadyToRun su false. - {StrBegin="NETSDK1095: "} - - - NETSDK1103: RollForward setting is only supported on .NET Core 3.0 or higher. - NETSDK1103: l'impostazione RollForward è supportata solo in .NET Core 3.0 o versione successiva. - {StrBegin="NETSDK1103: "} - - - NETSDK1083: The specified RuntimeIdentifier '{0}' is not recognized. - NETSDK1083: l'elemento RuntimeIdentifier '{0}' specificato non è riconosciuto. - {StrBegin="NETSDK1083: "} - - - NETSDK1028: Specify a RuntimeIdentifier - NETSDK1028: specificare un elemento RuntimeIdentifier - {StrBegin="NETSDK1028: "} - - - NETSDK1109: Runtime list file '{0}' was not found. Report this error to the .NET team here: https://aka.ms/dotnet-sdk-issue. - NETSDK1109: il file di elenco di runtime '{0}' non è stato trovato. Segnalare questo errore al team di .NET all'indirizzo: https://aka.ms/dotnet-sdk-issue. - {StrBegin="NETSDK1109: "} - - - NETSDK1112: The runtime pack for {0} was not downloaded. Try running a NuGet restore with the RuntimeIdentifier '{1}'. - NETSDK1112: il pacchetto di runtime per {0} non è stato scaricato. Provare a eseguire un ripristino NuGet con RuntimeIdentifier '{1}'. - {StrBegin="NETSDK1112: "} - - - NETSDK1150: The referenced project '{0}' is a non self-contained executable. A non self-contained executable cannot be referenced by a self-contained executable. For more information, see https://aka.ms/netsdk1150 - NETSDK1150: il progetto '{0}' a cui viene fatto riferimento è un eseguibile non autonomo. Non è possibile fare riferimento a un eseguibile non autonomo da un eseguibile autonomo. Per altre informazioni, vedere https://aka.ms/netsdk1150 - {StrBegin="NETSDK1150: "} - - - NETSDK1179: One of '--self-contained' or '--no-self-contained' options are required when '--runtime' is used. - NETSDK1179: quando si usa '--runtime' è necessaria una delle opzioni '--self-contained' o '--no-self-contained'. - {StrBegin="NETSDK1179: "} - - - NETSDK1048: 'AdditionalProbingPaths' were specified for GenerateRuntimeConfigurationFiles, but are being skipped because 'RuntimeConfigDevPath' is empty. - NETSDK1048: per GenerateRuntimeConfigurationFiles è stato specificato 'AdditionalProbingPaths', ma questo valore verrà ignorato perché 'RuntimeConfigDevPath' è vuoto. - {StrBegin="NETSDK1048: "} - - - NETSDK1138: The target framework '{0}' is out of support and will not receive security updates in the future. Please refer to {1} for more information about the support policy. - NETSDK1138: il framework di destinazione '{0}' non è più supportato e non riceverà aggiornamenti della sicurezza in futuro. Per altre informazioni sui criteri di supporto, vedere {1}. - {StrBegin="NETSDK1138: "} - - - NETSDK1046: The TargetFramework value '{0}' is not valid. To multi-target, use the 'TargetFrameworks' property instead. - NETSDK1046: il valore '{0}' di TargetFramework non è valido. Per impostare più destinazioni, usare la proprietà 'TargetFrameworks'. - {StrBegin="NETSDK1046: "} - - - NETSDK1145: The {0} pack is not installed and NuGet package restore is not supported. Upgrade Visual Studio, remove global.json if it specifies a certain SDK version, and uninstall the newer SDK. For more options visit https://aka.ms/targeting-apphost-pack-missing Pack Type:{0}, Pack directory: {1}, targetframework: {2}, Pack PackageId: {3}, Pack Package Version: {4} - NETSDK1145: il pacchetto {0} non è installato e il ripristino del pacchetto NuGet non è supportato. Aggiornare Visual Studio, rimuovere global.json se specifica una determinata versione dell'SDK e disinstallare l'SDK più recente. Per altre opzioni, vedere https://aka.ms/targeting-apphost-pack-missing. Tipo del pacchetto: {0}. Directory del pacchetto: {1}. Framework di destinazione: {2}. ID pacchetto: {3}. Versione del pacchetto: {4} - {StrBegin="NETSDK1145: "} - - - NETSDK1127: The targeting pack {0} is not installed. Please restore and try again. - NETSDK1127: il Targeting Pack {0} non è installato. Ripristinare e riprovare. - {StrBegin="NETSDK1127: "} - - - NETSDK1175: Windows Forms is not supported or recommended with trimming enabled. Please go to https://aka.ms/dotnet-illink/windows-forms for more details. - NETSDK1175: quando il trimming è abilitato, Windows Form non è supportato o consigliato. Per altre informazioni, vedere https://aka.ms/dotnet-illink/windows-forms. - {StrBegin="NETSDK1175: "} - - - NETSDK1168: WPF is not supported or recommended with trimming enabled. Please go to https://aka.ms/dotnet-illink/wpf for more details. - NETSDK1168: quando il trimming è abilitato, il WPF non è supportato o consigliato. Per altre informazioni, visitare https://aka.ms/dotnet-illink/wpf. - {StrBegin="NETSDK1168: "} - - - NETSDK1172: The provided type library '{0}' does not exist. - NETSDK1172: la libreria dei tipi specificata '{0}' non esiste. - {StrBegin="NETSDK1172: "} - - - NETSDK1016: Unable to find resolved path for '{0}'. - NETSDK1016: il percorso risolto per '{0}' non è stato trovato. - {StrBegin="NETSDK1016: "} - - - Unable to use package assets cache due to I/O error. This can occur when the same project is built more than once in parallel. Performance may be degraded, but the build result will not be impacted. - Non è possibile usare la cache delle risorse del pacchetto a causa dell'errore di I/O. Questo problema può verificarsi quando lo stesso progetto viene compilato più volte in parallelo. Può influire sulle prestazioni, ma non sul risultato della compilazione. - - - - NETSDK1012: Unexpected file type for '{0}'. Type is both '{1}' and '{2}'. - NETSDK1012: tipo di file imprevisto per '{0}'. Il tipo è sia '{1}' che '{2}'. - {StrBegin="NETSDK1012: "} - - - NETSDK1073: The FrameworkReference '{0}' was not recognized - NETSDK1073: l'elemento FrameworkReference '{0}' non è stato riconosciuto - {StrBegin="NETSDK1073: "} - - - NETSDK1182: The FrameworkReference '{0}' was not recognized. This may be because DOTNETSDK_DisableTransitiveFrameworkReferences was set to true. - NETSDK1182: The FrameworkReference '{0}' was not recognized. This may be because DOTNETSDK_DisableTransitiveFrameworkReferences was set to true. - {StrBegin="NETSDK1182: "} - - - NETSDK1137: It is no longer necessary to use the Microsoft.NET.Sdk.WindowsDesktop SDK. Consider changing the Sdk attribute of the root Project element to 'Microsoft.NET.Sdk'. - NETSDK1137: non è più necessario usare Microsoft.NET.Sdk.WindowsDesktop SDK. Provare a modificare l'attributo Sdk dell'elemento Project radice in 'Microsoft.NET.Sdk'. - {StrBegin="NETSDK1137: "} - - - NETSDK1009: Unrecognized preprocessor token '{0}' in '{1}'. - NETSDK1009: token di preprocessore '{0}' non riconosciuto in '{1}'. - {StrBegin="NETSDK1009: "} - - - NETSDK1081: The targeting pack for {0} was not found. You may be able to resolve this by running a NuGet restore on the project. - NETSDK1081: il pacchetto di destinazione per {0} non è stato trovato. Per risolvere il problema, eseguire un ripristino NuGet sul progetto. - {StrBegin="NETSDK1081: "} - - - NETSDK1019: {0} is an unsupported framework. - NETSDK1019: {0} è un framework non supportato. - {StrBegin="NETSDK1019: "} - - - NETSDK1056: Project is targeting runtime '{0}' but did not resolve any runtime-specific packages. This runtime may not be supported by the target framework. - NETSDK1056: il progetto è destinato al runtime '{0}' ma non ha risolto pacchetti specifici del runtime. È possibile che questo runtime non sia supportato dal framework di destinazione. - {StrBegin="NETSDK1056: "} - - - NETSDK1050: The version of Microsoft.NET.Sdk used by this project is insufficient to support references to libraries targeting .NET Standard 1.5 or higher. Please install version 2.0 or higher of the .NET Core SDK. - NETSDK1050: la versione di Microsoft.NET.Sdk usata da questo progetto non è sufficiente per supportare i riferimenti alle librerie destinate a .NET Standard 1.5 o versione successiva. Installare la versione 2.0 o successiva di .NET Core SDK. - {StrBegin="NETSDK1050: "} - - - NETSDK1045: The current .NET SDK does not support targeting {0} {1}. Either target {0} {2} or lower, or use a version of the .NET SDK that supports {0} {1}. - NETSDK1045: la versione corrente di .NET SDK non supporta {0} {1} come destinazione. Impostare come destinazione {0} {2} o una versione precedente oppure usare una versione di .NET SDK che supporta {0} {1}. - {StrBegin="NETSDK1045: "} - - - NETSDK1139: The target platform identifier {0} was not recognized. - NETSDK1139: l'identificatore di piattaforma di destinazione {0} non è stato riconosciuto. - {StrBegin="NETSDK1139: "} - - - NETSDK1107: Microsoft.NET.Sdk.WindowsDesktop is required to build Windows desktop applications. 'UseWpf' and 'UseWindowsForms' are not supported by the current SDK. - NETSDK1107: per compilare applicazioni desktop di Windows, è necessario Microsoft.NET.Sdk.WindowsDesktop. 'UseWpf' e 'UseWindowsForms' non sono supportati dall'SDK corrente. - {StrBegin="NETSDK1107: "} - - - You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview - Si sta usando una versione in anteprima di .NET. Vedere https://aka.ms/dotnet-core-preview - - - - NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. - NETSDK1131: la produzione di un componente Metadati Windows gestito con WinMDExp non è supportata quando la destinazione è {0}. - {StrBegin="NETSDK1131: "} - - - NETSDK1130: {1} cannot be referenced. Referencing a Windows Metadata component directly when targeting .NET 5 or higher is not supported. For more information, see https://aka.ms/netsdk1130 - NETSDK1130: non è possibile fare riferimento a {1}. Il riferimento diretto a un componente di Metadati Windows quando la destinazione è .NET 5 o versione successiva non è supportato. Per altre informazioni, vedere https://aka.ms/netsdk1130 - {StrBegin="NETSDK1130: "} - - - NETSDK1149: {0} cannot be referenced because it uses built-in support for WinRT, which is no longer supported in .NET 5 and higher. An updated version of the component supporting .NET 5 is needed. For more information, see https://aka.ms/netsdk1149 - NETSDK1149: non è possibile fare riferimento a {0} perché usa il supporto incorporato per WinRT, che non è più supportato in .NET 5 e versioni successive. È necessaria una versione aggiornata del componente che supporta .NET 5. Per altre informazioni, vedere https://aka.ms/netsdk1149 - {StrBegin="NETSDK1149: "} - - - NETSDK1106: Microsoft.NET.Sdk.WindowsDesktop requires 'UseWpf' or 'UseWindowsForms' to be set to 'true' - NETSDK1106: con Microsoft.NET.Sdk.WindowsDesktop 'UseWpf' o 'UseWindowsForms' deve essere impostato su 'true' - {StrBegin="NETSDK1106: "} - - - NETSDK1105: Windows desktop applications are only supported on .NET Core 3.0 or higher. - NETSDK1105: le applicazioni desktop di Windows sono supportate solo in .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1105: "} - - - NETSDK1100: Windows is required to build Windows desktop applications. - NETSDK1100: per compilare applicazioni desktop di Windows è richiesto Windows. - {StrBegin="NETSDK1100: "} - - - NETSDK1136: The target platform must be set to Windows (usually by including '-windows' in the TargetFramework property) when using Windows Forms or WPF, or referencing projects or packages that do so. - NETSDK1136: la piattaforma di destinazione deve essere impostata su Windows, in genere includendo '-windows ' nella proprietà TargetFramework, quando si usa Windows Forms o WPF oppure si fa riferimento a progetti o pacchetti che lo usano. - {StrBegin="NETSDK1136: "} - - - NETSDK1148: A referenced assembly was compiled using a newer version of Microsoft.Windows.SDK.NET.dll. Please update to a newer .NET SDK in order to reference this assembly. - NETSDK1148: un assembly di riferimento è stato compilato con una versione più recente di Microsoft.Windows.SDK.NET.dll. Eseguire l'aggiornamento a un SDK .NET più recente per fare riferimento a questo assembly. - {StrBegin="NETSDK1148: "} - - - NETSDK1178: The project depends on the following workload packs that do not exist in any of the workloads available in this installation: {0} -You may need to build the project on another operating system or architecture, or update the .NET SDK. - NETSDK1178: il progetto dipende dai pacchetti di carico di lavoro seguenti che non esistono in nessuno dei carichi di lavoro disponibili in questa installazione: {0} -Potrebbe essere necessario compilare il progetto in un altro sistema operativo o architettura oppure aggiornare .NET SDK. - {StrBegin="NETSDK1178: "} - - - NETSDK1147: To build this project, the following workloads must be installed: {0} -To install these workloads, run the following command: dotnet workload restore - NETSDK1147: per compilare questo progetto devono essere installati i seguenti carichi di lavoro: {0} -Per installare questi carichi di lavoro, eseguire il seguente comando: dotnet workload restore - {StrBegin="NETSDK1147: "} LOCALIZATION: Do not localize "dotnet workload restore" - - - - \ No newline at end of file diff --git a/src/Tasks/Common/Resources/xlf/Strings.it.xlf~RF30a3de88.TMP b/src/Tasks/Common/Resources/xlf/Strings.it.xlf~RF30a3de88.TMP deleted file mode 100644 index 3402c4a90125..000000000000 --- a/src/Tasks/Common/Resources/xlf/Strings.it.xlf~RF30a3de88.TMP +++ /dev/null @@ -1,979 +0,0 @@ - - - - - - NETSDK1076: AddResource can only be used with integer resource types. - NETSDK1076: è possibile usare AddResource solo con tipi di risorsa integer. - {StrBegin="NETSDK1076: "} - - - NETSDK1183: Unable to optimize assemblies for Ahead of time compilation: a valid runtime package was not found. Either set the PublishAot property to false, or use a supported runtime identifier when publishing. When targeting .NET 7 or higher, make sure to restore packages with the PublishAot property set to true. - NETSDK1183: non è possibile ottimizzare gli assembly per la compilazione Ahead Of Time perché non è stato trovato alcun pacchetto di runtime valido. Impostare la proprietà PublishAot su false oppure usare un identificatore di runtime supportato durante la pubblicazione. Quando si usa .NET 7 o versioni successive, assicurarsi di ripristinare i pacchetti con la proprietà PublishAot impostata su true. - {StrBegin="NETSDK1183: "} - - - NETSDK1070: The application configuration file must have root configuration element. - NETSDK1070: il file di configurazione dell'applicazione deve avere un elemento di configurazione radice. - {StrBegin="NETSDK1070: "} - - - NETSDK1113: Failed to create apphost (attempt {0} out of {1}): {2} - NETSDK1113: non è stato possibile creare apphost (tentativo {0} di {1}): {2} - {StrBegin="NETSDK1113: "} - - - NETSDK1074: The application host executable will not be customized because adding resources requires that the build be performed on Windows (excluding Nano Server). - NETSDK1074: l'eseguibile dell'host applicazione non verrà personalizzato perché per aggiungere risorse è necessario eseguire la compilazione in Windows (escluso Nano Server). - {StrBegin="NETSDK1074: "} - - - NETSDK1029: Unable to use '{0}' as application host executable as it does not contain the expected placeholder byte sequence '{1}' that would mark where the application name would be written. - NETSDK1029: non è possibile usare '{0}' come eseguibile host dell'applicazione perché non contiene la sequenza di byte segnaposto prevista '{1}' che indica dove verrà scritto il nome dell'applicazione. - {StrBegin="NETSDK1029: "} - - - NETSDK1078: Unable to use '{0}' as application host executable because it's not a Windows PE file. - NETSDK1078: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un file di Windows PE. - {StrBegin="NETSDK1078: "} - - - NETSDK1072: Unable to use '{0}' as application host executable because it's not a Windows executable for the CUI (Console) subsystem. - NETSDK1072: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un eseguibile Windows per il sottosistema CUI (Console). - {StrBegin="NETSDK1072: "} - - - NETSDK1177: Failed to sign apphost with error code {1}: {0} - NETSDK1177: impossibile firmare apphost con codice di errore {1}: {0} - {StrBegin="NETSDK1177: "} - - - NETSDK1079: The Microsoft.AspNetCore.All package is not supported when targeting .NET Core 3.0 or higher. A FrameworkReference to Microsoft.AspNetCore.App should be used instead, and will be implicitly included by Microsoft.NET.Sdk.Web. - NETSDK1079: il pacchetto Microsoft.AspNetCore.All non è supportato quando la destinazione è .NET Core 3.0 o versione successiva. È necessario un elemento FrameworkReference per Microsoft.AspNetCore.App, che verrà incluso in modo implicito da Microsoft.NET.Sdk.Web. - {StrBegin="NETSDK1079: "} - - - NETSDK1080: A PackageReference to Microsoft.AspNetCore.App is not necessary when targeting .NET Core 3.0 or higher. If Microsoft.NET.Sdk.Web is used, the shared framework will be referenced automatically. Otherwise, the PackageReference should be replaced with a FrameworkReference. - NETSDK1080: non è necessario alcun elemento PackageReference per Microsoft.AspNetCore.App quando la destinazione è .NET Core 3.0 o versione successiva. Se si usa Microsoft.NET.Sdk.Web, il riferimento al framework condiviso verrà inserito automaticamente; in caso contrario, l'elemento PackageReference deve essere sostituito da un elemento FrameworkReference. - {StrBegin="NETSDK1080: "} - - - NETSDK1017: Asset preprocessor must be configured before assets are processed. - NETSDK1017: prima di elaborare le risorse, è necessario configurare il preprocessore di risorse. - {StrBegin="NETSDK1017: "} - - - NETSDK1047: Assets file '{0}' doesn't have a target for '{1}'. Ensure that restore has run and that you have included '{2}' in the TargetFrameworks for your project. You may also need to include '{3}' in your project's RuntimeIdentifiers. - NETSDK1047: il file di risorse '{0}' non contiene una destinazione per '{1}'. Assicurarsi che il ripristino sia stato eseguito e che '{2}' sia stato incluso negli elementi TargetFramework del progetto. Potrebbe anche essere necessario includere '{3}' negli elementi RuntimeIdentifier del progetto. - {StrBegin="NETSDK1047: "} - - - NETSDK1005: Assets file '{0}' doesn't have a target for '{1}'. Ensure that restore has run and that you have included '{2}' in the TargetFrameworks for your project. - NETSDK1005: il file di risorse '{0}' non contiene una destinazione per '{1}'. Assicurarsi che il ripristino sia stato eseguito e che '{2}' sia stato incluso negli elementi TargetFramework del progetto. - {StrBegin="NETSDK1005: "} - - - NETSDK1004: Assets file '{0}' not found. Run a NuGet package restore to generate this file. - NETSDK1004: il file di risorse '{0}' non è stato trovato. Per generare questo file, eseguire un ripristino del pacchetto NuGet. - {StrBegin="NETSDK1004: "} - - - NETSDK1063: The path to the project assets file was not set. Run a NuGet package restore to generate this file. - NETSDK1063: il percorso del file di risorse del progetto non è stato impostato. Per generare questo file, eseguire un ripristino del pacchetto NuGet. - {StrBegin="NETSDK1063: "} - - - NETSDK1006: Assets file path '{0}' is not rooted. Only full paths are supported. - NETSDK1006: il percorso dei file di risorse '{0}' non contiene una radice. Sono supportati solo percorsi completi. - {StrBegin="NETSDK1006: "} - - - NETSDK1001: At least one possible target framework must be specified. - NETSDK1001: è necessario specificare almeno un framework di destinazione possibile. - {StrBegin="NETSDK1001: "} - - - NETSDK1092: The CLSIDMap cannot be embedded on the COM host because adding resources requires that the build be performed on Windows (excluding Nano Server). - NETSDK1092: non è possibile incorporare l'elemento CLSIDMap nell'host COM perché per aggiungere risorse è necessario eseguire la compilazione in Windows (escluso Nano Server). - {StrBegin="NETSDK1092: "} - - - NETSDK1065: Cannot find app host for {0}. {0} could be an invalid runtime identifier (RID). For more information about RID, see https://aka.ms/rid-catalog. - NETSDK1065: non è possibile trovare l'host delle app per {0}. {0} potrebbe essere un identificatore di runtime (RID) non valido. Per altre informazioni sul RID, vedere https://aka.ms/rid-catalog. - {StrBegin="NETSDK1065: "} - - - NETSDK1091: Unable to find a .NET Core COM host. The .NET Core COM host is only available on .NET Core 3.0 or higher when targeting Windows. - NETSDK1091: non è possibile trovare un host COM .NET Core. L'host COM .NET Core è disponibile solo in .NET Core 3.0 o versioni successive quando è destinato a Windows. - {StrBegin="NETSDK1091: "} - - - NETSDK1114: Unable to find a .NET Core IJW host. The .NET Core IJW host is only available on .NET Core 3.1 or higher when targeting Windows. - NETSDK1114: non è possibile trovare un host IJW .NET Core. L'host IJW .NET Core è disponibile solo in .NET Core 3.1 o versioni successive quando la destinazione è Windows. - {StrBegin="NETSDK1114: "} - - - NETSDK1007: Cannot find project info for '{0}'. This can indicate a missing project reference. - NETSDK1007: le informazioni del progetto per '{0}' non sono state trovate. Questo errore può indicare la mancanza di un riferimento al progetto. - {StrBegin="NETSDK1007: "} - - - NETSDK1032: The RuntimeIdentifier platform '{0}' and the PlatformTarget '{1}' must be compatible. - NETSDK1032: la piattaforma '{0}' di RuntimeIdentifier e quella '{1}' di PlatformTarget devono essere compatibili. - {StrBegin="NETSDK1032: "} - - - NETSDK1031: It is not supported to build or publish a self-contained application without specifying a RuntimeIdentifier. You must either specify a RuntimeIdentifier or set SelfContained to false. - NETSDK1031: non è possibile compilare o pubblicare un'applicazione indipendente senza specificare un elemento RuntimeIdentifier. Specificare un elemento RuntimeIdentifier o impostare SelfContained su false. - {StrBegin="NETSDK1031: "} - - - NETSDK1097: It is not supported to publish an application to a single-file without specifying a RuntimeIdentifier. You must either specify a RuntimeIdentifier or set PublishSingleFile to false. - NETSDK1097: non è possibile pubblicare un'applicazione in un singolo file senza specificare un elemento RuntimeIdentifier. Specificare un elemento RuntimeIdentifier o impostare PublishSingleFile su false. - {StrBegin="NETSDK1097: "} - - - NETSDK1098: Applications published to a single-file are required to use the application host. You must either set PublishSingleFile to false or set UseAppHost to true. - NETSDK1098: le applicazioni pubblicate in un singolo file sono necessarie per usare l'host dell'applicazione. Impostare PublishSingleFile su false o UseAppHost su true. - {StrBegin="NETSDK1098: "} - - - NETSDK1099: Publishing to a single-file is only supported for executable applications. - NETSDK1099: la pubblicazione in un singolo file è supportata solo per le applicazioni eseguibili. - {StrBegin="NETSDK1099: "} - - - NETSDK1134: Building a solution with a specific RuntimeIdentifier is not supported. If you would like to publish for a single RID, specifiy the RID at the individual project level instead. - NETSDK1134: non è possibile compilare una soluzione con un parametro RuntimeIdentifier specifico. Per pubblicare per un singolo RID, specificare il RID a livello di singolo progetto. - {StrBegin="NETSDK1134: "} - - - NETSDK1135: SupportedOSPlatformVersion {0} cannot be higher than TargetPlatformVersion {1}. - NETSDK1135: il valore di SupportedOSPlatformVersion {0} non può essere maggiore di quello di TargetPlatformVersion {1}. - {StrBegin="NETSDK1135: "} - - - NETSDK1143: Including all content in a single file bundle also includes native libraries. If IncludeAllContentForSelfExtract is true, IncludeNativeLibrariesForSelfExtract must not be false. - NETSDK1143: se si include tutto il contenuto in un unico bundle di file, verranno incluse anche le librerie native. Se IncludeAllContentForSelfExtract è true, IncludeNativeLibrariesForSelfExtract non deve essere false. - {StrBegin="NETSDK1143: "} - - - NETSDK1142: Including symbols in a single file bundle is not supported when publishing for .NET5 or higher. - NETSDK1142: l'inclusione dei simboli in un unico bundle di file non è supportata quando si esegue la pubblicazione per .NET 5 o versioni successive. - {StrBegin="NETSDK1142: "} - - - NETSDK1013: The TargetFramework value '{0}' was not recognized. It may be misspelled. If not, then the TargetFrameworkIdentifier and/or TargetFrameworkVersion properties must be specified explicitly. - NETSDK1013: il valore {0}' di TargetFramework non è stato riconosciuto. È possibile che sia stato digitato in modo errato. In caso contrario, le proprietà TargetFrameworkIdentifier e/o TargetFrameworkVersion devono essere specificate in modo esplicito. - {StrBegin="NETSDK1013: "} - - - NETSDK1067: Self-contained applications are required to use the application host. Either set SelfContained to false or set UseAppHost to true. - NETSDK1067: con le applicazioni complete è necessario usare l'host applicazione. Impostare SelfContained su false o UseAppHost su true. - {StrBegin="NETSDK1067: "} - - - NETSDK1125: Publishing to a single-file is only supported for netcoreapp target. - NETSDK1125: la pubblicazione in un file singolo è supportata solo per la destinazione netcoreapp. - {StrBegin="NETSDK1125: "} - - - Choosing '{0}' because AssemblyVersion '{1}' is greater than '{2}'. - Verrà scelto '{0}' perché il valore di AssemblyVersion '{1}' è maggiore di '{2}'. - - - - Choosing '{0}' arbitrarily as both items are copy-local and have equal file and assembly versions. - Verrà scelto '{0}' in modo arbitrario perché entrambi gli elementi sono una copia locale e contengono versioni di file e assembly uguali. - - - - Choosing '{0}' because file version '{1}' is greater than '{2}'. - Verrà scelto '{0}' perché la versione del file '{1}' è maggiore di '{2}'. - - - - Choosing '{0}' because it is a platform item. - Verrà scelto '{0}' perché è un elemento della piattaforma. - - - - Choosing '{0}' because it comes from a package that is preferred. - Verrà scelto '{0}' perché proviene da un pacchetto preferito. - - - - NETSDK1089: The '{0}' and '{1}' types have the same CLSID '{2}' set in their GuidAttribute. Each COMVisible class needs to have a distinct guid for their CLSID. - NETSDK1089: per i tipi '{0}' e '{1}' è impostato lo stesso CLSID '{2}' nel relativo elemento GuidAttribute. Ogni classe COMVisible deve includere un GUID distinto per il CLSID. - {StrBegin="NETSDK1089: "} -{0} - The first type with the conflicting guid. -{1} - The second type with the conflicting guid. -{2} - The guid the two types have. - - - NETSDK1088: The COMVisible class '{0}' must have a GuidAttribute with the CLSID of the class to be made visible to COM in .NET Core. - NETSDK1088: la classe COMVisible '{0}' deve includere un elemento GuidAttribute con il CLSID della classe da rendere visibile per COM in .NET Core. - {StrBegin="NETSDK1088: "} -{0} - The ComVisible class that doesn't have a GuidAttribute on it. - - - NETSDK1090: The supplied assembly '{0}' is not valid. Cannot generate a CLSIDMap from it. - NETSDK1090: l'assembly specificato '{0}' non è valido. Non può essere usato per generare un elemento CLSIDMap. - {StrBegin="NETSDK1090: "} -{0} - The path to the invalid assembly. - - - NETSDK1167: Compression in a single file bundle is only supported when publishing for .NET6 or higher. - NETSDK1167: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione per .NET6 o versioni successive. - {StrBegin="NETSDK1167: "} - - - NETSDK1176: Compression in a single file bundle is only supported when publishing a self-contained application. - NETSDK1176: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione di un'applicazione indipendente. - {StrBegin="NETSDK1176: "} - - - NETSDK1133: There was conflicting information about runtime packs available for {0}: -{1} - NETSDK1133: sono presenti informazioni in conflitto sui pacchetti di runtime disponibili per {0}: -{1} - {StrBegin="NETSDK1133: "} - - - NETSDK1014: Content item for '{0}' sets '{1}', but does not provide '{2}' or '{3}'. - NETSDK1014: l'elemento di contenuto per '{0}' imposta '{1}', ma non fornisce '{2}' o '{3}'. - {StrBegin="NETSDK1014: "} - - - NETSDK1010: The '{0}' task must be given a value for parameter '{1}' in order to consume preprocessed content. - NETSDK1010: per poter utilizzare il contenuto pre-elaborato, è necessario assegnare un valore per il parametro '{1}' nell'attività '{0}'. - {StrBegin="NETSDK1010: "} - - - Could not determine winner because '{0}' does not exist. - Non è stato possibile determinare la versione da usare perché '{0}' non esiste. - - - - Could not determine winner due to equal file and assembly versions. - Non è stato possibile determinare la versione da usare perché le versioni dell'assembly e del file sono uguali. - - - - Could not determine a winner because '{0}' has no file version. - Non è stato possibile determinare la versione da usare perché non esiste alcuna versione del file per '{0}'. - - - - Could not determine a winner because '{0}' is not an assembly. - Non è stato possibile determinare la versione da usare perché '{0}' non è un assembly. - - - - NETSDK1181: Error getting pack version: Pack '{0}' was not present in workload manifests. - NETSDK1181: errore durante il recupero della versione del pacchetto: il pacchetto '{0}' non era presente nei manifesti del carico di lavoro. - {StrBegin="NETSDK1181: "} - - - NETSDK1042: Could not load PlatformManifest from '{0}' because it did not exist. - NETSDK1042: non è stato possibile caricare PlatformManifest da '{0}' perché non esiste. - {StrBegin="NETSDK1042: "} - - - NETSDK1120: C++/CLI projects targeting .NET Core require a target framework of at least 'netcoreapp3.1'. - NETSDK1120: con i progetti C++/CLI destinati a .NET Core è il framework di destinazione deve essere impostato almeno su 'netcoreapp3.1'. - {StrBegin="NETSDK1120: "} - - - NETSDK1158: Required '{0}' metadata missing on Crossgen2Tool item. - NETSDK1158: nell'elemento Crossgen2Tool mancano i metadati richiesti di '{0}'. - {StrBegin="NETSDK1158: "} - - - NETSDK1126: Publishing ReadyToRun using Crossgen2 is only supported for self-contained applications. - NETSDK1126: la pubblicazione di ReadyToRun tramite Crossgen2 è supportata solo per le applicazioni autonome. - {StrBegin="NETSDK1126: "} - - - NETSDK1155: Crossgen2Tool executable '{0}' not found. - NETSDK1155: l'eseguibile '{0}' di Crossgen2Tool non è stato trovato. - {StrBegin="NETSDK1155: "} - - - NETSDK1154: Crossgen2Tool must be specified when UseCrossgen2 is set to true. - NETSDK1154: è necessario specificare Crossgen2Tool quando UseCrossgen2 è impostato su true. - {StrBegin="NETSDK1154: "} - - - NETSDK1166: Cannot emit symbols when publishing for .NET 5 with Crossgen2 using composite mode. - NETSDK1166: non è possibile creare simboli durante la pubblicazione per .NET 5 con Crossgen2 usando la modalità composita. - {StrBegin="NETSDK1166: "} - - - NETSDK1160: CrossgenTool executable '{0}' not found. - NETSDK1160: l'eseguibile '{0}' di CrossgenTool non è stato trovato. - {StrBegin="NETSDK1160: "} - - - NETSDK1153: CrossgenTool not specified in PDB compilation mode. - NETSDK1153: CrossgenTool non è stato specificato nella modalità di compilazione PDB. - {StrBegin="NETSDK1153: "} - - - NETSDK1159: CrossgenTool must be specified when UseCrossgen2 is set to false. - NETSDK1159: è necessario specificare CrossgenTool quando UseCrossgen2 è impostato su false. - {StrBegin="NETSDK1159: "} - - - NETSDK1161: DiaSymReader library '{0}' not found. - NETSDK1161: la libreria '{0}' di DiaSymReader non è stata trovata. - {StrBegin="NETSDK1161: "} - - - NETSDK1156: .NET host executable '{0}' not found. - NETSDK1156: l'eseguibile '{0}' dell'host .NET non è stato trovato. - {StrBegin="NETSDK1156: "} - - - NETSDK1055: DotnetTool does not support target framework lower than netcoreapp2.1. - NETSDK1055: DotnetTool non supporta framework di destinazione di versioni precedenti a netcoreapp2.1. - {StrBegin="NETSDK1055: "} - - - NETSDK1054: only supports .NET Core. - NETSDK1054: supporta solo .NET Core. - {StrBegin="NETSDK1054: "} - - - NETSDK1022: Duplicate '{0}' items were included. The .NET SDK includes '{0}' items from your project directory by default. You can either remove these items from your project file, or set the '{1}' property to '{2}' if you want to explicitly include them in your project file. For more information, see {4}. The duplicate items were: {3} - NETSDK1022: sono stati inclusi '{0}' elementi duplicati. Per impostazione predefinita, .NET SDK include '{0}' elementi della directory del progetto. È possibile rimuovere tali elementi dal file di progetto oppure impostare la proprietà '{1}' su '{2}' se si vuole includerli implicitamente nel file di progetto. Per altre informazioni, vedere {4}. Gli elementi duplicati sono: {3} - {StrBegin="NETSDK1022: "} - - - NETSDK1015: The preprocessor token '{0}' has been given more than one value. Choosing '{1}' as the value. - NETSDK1015: al token di preprocessore '{0}' è stato assegnato più di un valore. Come valore verrà scelto '{1}'. - {StrBegin="NETSDK1015: "} - - - NETSDK1152: Found multiple publish output files with the same relative path: {0}. - NETSDK1152: sono stati trovati più file di output di pubblicazione con lo stesso percorso relativo: {0}. - {StrBegin="NETSDK1152: "} - - - NETSDK1110: More than one asset in the runtime pack has the same destination sub-path of '{0}'. Report this error to the .NET team here: https://aka.ms/dotnet-sdk-issue. - NETSDK1110: più di un asset nel pacchetto di runtime ha lo stesso percorso secondario di destinazione di '{0}'. Segnalare questo errore al team di .NET all'indirizzo: https://aka.ms/dotnet-sdk-issue. - {StrBegin="NETSDK1110: "} - - - NETSDK1169: The same resource ID {0} was specified for two type libraries '{1}' and '{2}'. Duplicate type library IDs are not allowed. - NETSDK1169: è stato specificato lo stesso ID di risorsa {0} per due librerie dei tipi '{1}' e '{2}'. Gli ID della libreria dei tipi duplicati non sono consentiti. - {StrBegin="NETSDK1169: "} - - - Encountered conflict between '{0}' and '{1}'. - È stato rilevato un conflitto tra '{0}' e '{1}'. - - - - NETSDK1051: Error parsing FrameworkList from '{0}'. {1} '{2}' was invalid. - NETSDK1051: si è verificato un errore durante l'analisi di FrameworkList da '{0}'. {1} '{2}' non è valido. - {StrBegin="NETSDK1051: "} - - - NETSDK1043: Error parsing PlatformManifest from '{0}' line {1}. Lines must have the format {2}. - NETSDK1043: si è verificato un errore durante l'analisi di PlatformManifest da '{0}' a riga {1}. Il formato delle righe deve essere {2}. - {StrBegin="NETSDK1043: "} - - - NETSDK1044: Error parsing PlatformManifest from '{0}' line {1}. {2} '{3}' was invalid. - NETSDK1044: si è verificato un errore durante l'analisi di PlatformManifest da '{0}' a riga {1}. Il valore {2} '{3}' non è valido. - {StrBegin="NETSDK1044: "} - - - NETSDK1060: Error reading assets file: {0} - NETSDK1060: errore durante la lettura del file di asset: {0} - {StrBegin="NETSDK1060: "} - - - NETSDK1111: Failed to delete output apphost: {0} - NETSDK1111: non è stato possibile eliminare l'apphost di output: {0} - {StrBegin="NETSDK1111: "} - - - NETSDK1077: Failed to lock resource. - NETSDK1077: non è stato possibile bloccare la risorsa. - {StrBegin="NETSDK1077: "} - - - NETSDK1030: Given file name '{0}' is longer than 1024 bytes - NETSDK1030: il nome file specificato '{0}' supera 1024 byte - {StrBegin="NETSDK1030: "} - - - NETSDK1024: Folder '{0}' already exists either delete it or provide a different ComposeWorkingDir - NETSDK1024: la cartella '{0}' esiste già. Eliminarla o specificare un elemento ComposeWorkingDir diverso - {StrBegin="NETSDK1024: "} - - - NETSDK1068: The framework-dependent application host requires a target framework of at least 'netcoreapp2.1'. - NETSDK1068: con l'host applicazione dipendente dal framework il framework di destinazione deve essere impostato almeno su 'netcoreapp2.1'. - {StrBegin="NETSDK1068: "} - - - NETSDK1052: Framework list file path '{0}' is not rooted. Only full paths are supported. - NETSDK1052: il percorso '{0}' del file dell'elenco di framework non contiene una radice. Sono supportati solo percorsi completi. - {StrBegin="NETSDK1052: "} - - - NETSDK1087: Multiple FrameworkReference items for '{0}' were included in the project. - NETSDK1087: nel progetto sono stati inclusi più elementi FrameworkReference per '{0}'. - {StrBegin="NETSDK1087: "} - - - NETSDK1086: A FrameworkReference for '{0}' was included in the project. This is implicitly referenced by the .NET SDK and you do not typically need to reference it from your project. For more information, see {1} - NETSDK1086: nel progetto è stato incluso un elemento FrameworkReference per '{0}'. Questo elemento viene usato come riferimento implicito da .NET SDK e non è in genere necessario farvi riferimento dal progetto. Per altre informazioni, vedere {1} - {StrBegin="NETSDK1086: "} - - - NETSDK1049: Resolved file has a bad image, no metadata, or is otherwise inaccessible. {0} {1} - NETSDK1049: il file risolto ha un'immagine danneggiata, non contiene metadati o è inaccessibile per altri motivi. {0} {1} - {StrBegin="NETSDK1049: "} - - - NETSDK1141: Unable to resolve the .NET SDK version as specified in the global.json located at {0}. - NETSDK1141: non è possibile risolvere la versione di .NET SDK come specificato nel file global.json presente in {0}. - {StrBegin="NETSDK1141: "} - - - NETSDK1144: Optimizing assemblies for size failed. Optimization can be disabled by setting the PublishTrimmed property to false. - NETSDK1144: l'ottimizzazione degli assembly per le dimensioni non è riuscita. È possibile disabilitare l'ottimizzazione impostando la proprietà PublishTrimmed su false. - {StrBegin="NETSDK1144: "} - - - NETSDK1102: Optimizing assemblies for size is not supported for the selected publish configuration. Please ensure that you are publishing a self-contained app. - NETSDK1102: l'ottimizzazione degli assembly per le dimensioni non è supportata per la configurazione di pubblicazione selezionata. Assicurarsi di pubblicare un'app indipendente. - {StrBegin="NETSDK1102: "} - - - Optimizing assemblies for size may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/dotnet-illink - L'ottimizzazione degli assembly per le dimensioni potrebbe comportare la modifica del comportamento dell'app. Assicurarsi di testarla dopo la pubblicazione. Vedere: https://aka.ms/dotnet-illink - - - - Optimizing assemblies for size. This process might take a while. - Ottimizzazione degli assembly per le dimensioni. Questo processo potrebbe richiedere del tempo. - - - - NETSDK1191: A runtime identifier for the property '{0}' couldn't be inferred. Specify a rid explicitly. - NETSDK1191: non è stato possibile dedurre un identificatore di runtime per la proprietà '{0}'. Specificare un RID in modo esplicito. - {StrBegin="NETSDK1191: "} - - - NETSDK1020: Package Root {0} was incorrectly given for Resolved library {1} - NETSDK1020: la radice {0} del pacchetto specificata per la libreria risolta {1} non è corretta - {StrBegin="NETSDK1020: "} - - - NETSDK1025: The target manifest {0} provided is of not the correct format - NETSDK1025: il formato del manifesto di destinazione specificato {0} non è corretto - {StrBegin="NETSDK1025: "} - - - NETSDK1163: Input assembly '{0}' not found. - NETSDK1163: l'assembly di input '{0}' non è stato trovato. - {StrBegin="NETSDK1163: "} - - - NETSDK1003: Invalid framework name: '{0}'. - NETSDK1003: nome di framework non valido: '{0}'. - {StrBegin="NETSDK1003: "} - - - NETSDK1058: Invalid value for ItemSpecToUse parameter: '{0}'. This property must be blank or set to 'Left' or 'Right' - NETSDK1058: valore non valido per il parametro ItemSpecToUse: '{0}'. Questa proprietà deve essere vuota o impostata su 'Left' o 'Right' - {StrBegin="NETSDK1058: "} -The following are names of parameters or literal values and should not be translated: ItemSpecToUse, Left, Right - - - NETSDK1018: Invalid NuGet version string: '{0}'. - NETSDK1018: la stringa di versione '{0}' di NuGet non è valida. - {StrBegin="NETSDK1018: "} - - - NETSDK1075: Update handle is invalid. This instance may not be used for further updates. - NETSDK1075: il punto di controllo dell'aggiornamento non è valido. Non è possibile usare questa istanza per ulteriori aggiornamenti. - {StrBegin="NETSDK1075: "} - - - NETSDK1104: RollForward value '{0}' is invalid. Allowed values are {1}. - NETSDK1104: il valore '{0}' di RollForward non è valido. I valori consentiti sono {1}. - {StrBegin="NETSDK1104: "} - - - NETSDK1140: {0} is not a valid TargetPlatformVersion for {1}. Valid versions include: -{2} - NETSDK1140: {0} non è un valore valido di TargetPlatformVersion per or {1}. Le versioni valide includono: -{2} - {StrBegin="NETSDK1140: "} - - - NETSDK1173: The provided type library '{0}' is in an invalid format. - NETSDK1173: il formato della libreria dei tipi specificata '{0}' non è valido. - {StrBegin="NETSDK1173: "} - - - NETSDK1170: The provided type library ID '{0}' for type library '{1}' is invalid. The ID must be a positive integer less than 65536. - NETSDK1170: l'ID '{0}' per la libreria dei tipi specificato '{1}' non è valido. L'ID deve essere un numero positivo intero inferiore a 65536. - {StrBegin="NETSDK1170: "} - - - NETSDK1157: JIT library '{0}' not found. - NETSDK1157: la libreria '{0}' di JIT non è stata trovata. - {StrBegin="NETSDK1157: "} - - - NETSDK1061: The project was restored using {0} version {1}, but with current settings, version {2} would be used instead. To resolve this issue, make sure the same settings are used for restore and for subsequent operations such as build or publish. Typically this issue can occur if the RuntimeIdentifier property is set during build or publish but not during restore. For more information, see https://aka.ms/dotnet-runtime-patch-selection. - NETSDK1061: per il ripristino del progetto è stato usato {0} versione {1}, ma con le impostazioni correnti viene usata la versione {2}. Per risolvere il problema, assicurarsi di usare le stesse impostazioni per il ripristino e per le operazioni successive, quali compilazione o pubblicazione. In genere questo problema può verificarsi se la proprietà RuntimeIdentifier viene impostata durante la compilazione o la pubblicazione, ma non durante il ripristino. Per altre informazioni, vedere https://aka.ms/dotnet-runtime-patch-selection. - {StrBegin="NETSDK1061: "} -{0} - Package Identifier for platform package -{1} - Restored version of platform package -{2} - Current version of platform package - - - NETSDK1008: Missing '{0}' metadata on '{1}' item '{2}'. - NETSDK1008: mancano i metadati di '{0}' sull'elemento '{2}' di '{1}'. - {StrBegin="NETSDK1008: "} - - - NETSDK1164: Missing output PDB path in PDB generation mode (OutputPDBImage metadata). - NETSDK1164: il percorso PDB di output non è presente nella modalità di generazione PDB (metadati di OutputPDBImage). - {StrBegin="NETSDK1164: "} - - - NETSDK1165: Missing output R2R image path (OutputR2RImage metadata). - NETSDK1165: il percorso dell'immagine R2R di output non è presente (metadati di OutputR2RImage). - {StrBegin="NETSDK1165: "} - - - NETSDK1171: An integer ID less than 65536 must be provided for type library '{0}' because more than one type library is specified. - NETSDK1171: un ID intero inferiore a 65536 deve essere fornito per la libreria dei tipi '{0}' perché è specificata più di una libreria dei tipi. - {StrBegin="NETSDK1171: "} - - - NETSDK1021: More than one file found for {0} - NETSDK1021: è stato trovato più di un file per {0} - {StrBegin="NETSDK1021: "} - - - NETSDK1069: This project uses a library that targets .NET Standard 1.5 or higher, and the project targets a version of .NET Framework that doesn't have built-in support for that version of .NET Standard. Visit https://aka.ms/net-standard-known-issues for a set of known issues. Consider retargeting to .NET Framework 4.7.2. - NETSDK1069: questo progetto usa una libreria destinata a .NET Standard 1.5 o versione successiva ed è destinato a una versione di .NET Framework che non include il supporto predefinito per tale versione di .NET Standard. Per un serie di problemi noti, visitare https://aka.ms/net-standard-known-issues. Provare a impostare come destinazione .NET Framework 4.7.2. - {StrBegin="NETSDK1069: "} - - - NETSDK1115: The current .NET SDK does not support .NET Framework without using .NET SDK Defaults. It is likely due to a mismatch between C++/CLI project CLRSupport property and TargetFramework. - NETSDK1115: l'istanza corrente di .NET SDK non supporta .NET Framework senza usare le impostazioni predefinite di .NET SDK. Il problema dipende probabilmente da una mancata corrispondenza tra la proprietà CLRSupport del progetto C++/CLI e TargetFramework. - {StrBegin="NETSDK1115: "} - - - NETSDK1182: Targeting .NET 6.0 or higher in Visual Studio 2019 is not supported. - NETSDK1182: la destinazione .NET 6.0 o versione successiva in Visual Studio 2019 non è supportata. - {StrBegin="NETSDK1182: "} - - - NETSDK1192: Targeting .NET 7.0 or higher in Visual Studio 2022 17.3 is not supported. - NETSDK1192: Targeting .NET 7.0 or higher in Visual Studio 2022 17.3 is not supported. - {StrBegin="NETSDK1192: "} - - - NETSDK1084: There is no application host available for the specified RuntimeIdentifier '{0}'. - NETSDK1084: non è disponibile alcun host applicazione per l'elemento RuntimeIdentifier specificato '{0}'. - {StrBegin="NETSDK1084: "} - - - NETSDK1085: The 'NoBuild' property was set to true but the 'Build' target was invoked. - NETSDK1085: non è stata impostata alcuna proprietà 'NoBuild' su true, ma è stata chiamata la destinazione 'Build'. - {StrBegin="NETSDK1085: "} - - - NETSDK1002: Project '{0}' targets '{2}'. It cannot be referenced by a project that targets '{1}'. - NETSDK1002: il progetto '{0}' è destinato a '{2}'. Non può essere usato come riferimento in un progetto destinato a '{1}'. - {StrBegin="NETSDK1002: "} - - - NETSDK1082: There was no runtime pack for {0} available for the specified RuntimeIdentifier '{1}'. - NETSDK1082: non è disponibile alcun pacchetto di runtime per {0} per l'elemento RuntimeIdentifier specificato '{1}'. - {StrBegin="NETSDK1082: "} - - - NETSDK1132: No runtime pack information was available for {0}. - NETSDK1132: non sono disponibili informazioni sui pacchetti di runtime per {0}. - {StrBegin="NETSDK1132: "} - - - NETSDK1128: COM hosting does not support self-contained deployments. - NETSDK1128: l'hosting COM non supporta le distribuzioni complete. - {StrBegin="NETSDK1128: "} - - - NETSDK1119: C++/CLI projects targeting .NET Core cannot use EnableComHosting=true. - NETSDK1119: i progetti C++/CLI destinati a .NET Core non possono usare EnableComHosting=true. - {StrBegin="NETSDK1119: "} - - - NETSDK1116: C++/CLI projects targeting .NET Core must be dynamic libraries. - NETSDK1116: i progetti C++/CLI destinati a .NET Core devono essere librerie dinamiche. - {StrBegin="NETSDK1116: "} - - - NETSDK1118: C++/CLI projects targeting .NET Core cannot be packed. - NETSDK1118: i progetti C++/CLI destinati a .NET Core non possono essere compressi. - {StrBegin="NETSDK1118: "} - - - NETSDK1117: Does not support publish of C++/CLI project targeting dotnet core. - NETSDK1117: la pubblicazione di progetti C++/CLI destinati a .NET Core non è supportata. - {StrBegin="NETSDK1117: "} - - - NETSDK1121: C++/CLI projects targeting .NET Core cannot use SelfContained=true. - NETSDK1121: i progetti C++/CLI destinati a .NET Core non possono usare SelfContained=true. - {StrBegin="NETSDK1121: "} - - - NETSDK1151: The referenced project '{0}' is a self-contained executable. A self-contained executable cannot be referenced by a non self-contained executable. For more information, see https://aka.ms/netsdk1151 - NETSDK1151: il progetto '{0}' a cui viene fatto riferimento è un eseguibile autonomo. Non è possibile fare riferimento a un eseguibile autonomo da un eseguibile non autonomo. Per altre informazioni, vedere https://aka.ms/netsdk1151 - {StrBegin="NETSDK1151: "} - - - NETSDK1162: PDB generation: R2R executable '{0}' not found. - NETSDK1162: generazione PDB: l'eseguibile '{0}' di R2R non è stato trovato. - {StrBegin="NETSDK1162: "} - - - NETSDK1190: To use '{0}' in solution projects, you must set the environment variable '{1}' (to true). This will increase the time to complete the operation. - NETSDK1190: per usare '{0}' nei progetti di soluzione, è necessario impostare la variabile di ambiente '{1}' (su true). Ciò aumenterà il tempo necessario per completare l'operazione. - {StrBegin="NETSDK1190: "} - - - NETSDK1053: Pack as tool does not support self contained. - NETSDK1053: la creazione di pacchetti come strumenti non prevede elementi autonomi. - {StrBegin="NETSDK1053: "} - - - NETSDK1146: PackAsTool does not support TargetPlatformIdentifier being set. For example, TargetFramework cannot be net5.0-windows, only net5.0. PackAsTool also does not support UseWPF or UseWindowsForms when targeting .NET 5 and higher. - NETSDK1146: PackAsTool non supporta l'impostazione di TargetPlatformIdentifier. Ad esempio, TargetFramework non può essere essere impostato su net5.0-windows, ma solo su net5.0. PackAsTool non supporta neanche UseWPF o UseWindowsForms quando la destinazione è .NET 5 e versioni successive. - {StrBegin="NETSDK1146: "} - - - NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. - NETSDK1187: il pacchetto {0} {1} include una risorsa con le impostazioni locali '{2}'. Queste impostazioni locali sono state normalizzate nel formato standard '{3}' per evitare problemi di maiuscole e minuscole nella compilazione. È consigliabile informare l'autore del pacchetto in merito a questo problema di maiuscole e minuscole. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. - - - NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. - NETSDK1188: il pacchetto {0} {1} include una risorsa con le impostazioni locali '{2}'. Queste impostazioni locali non sono riconosciute da .NET. È consigliabile notificare all'autore del pacchetto che sembra usare impostazioni locali non valide. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string - - - NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. - NETSDK1064: il pacchetto {0} versione {1} non è stato trovato. Potrebbe essere stato eliminato dopo il ripristino di NuGet. In caso contrario, il ripristino di NuGet potrebbe essere stato completato solo parzialmente, a causa delle restrizioni relative alla lunghezza massima del percorso. - {StrBegin="NETSDK1064: "} - - - NETSDK1023: A PackageReference for '{0}' was included in your project. This package is implicitly referenced by the .NET SDK and you do not typically need to reference it from your project. For more information, see {1} - NETSDK1023: nel progetto è stato incluso un riferimento al pacchetto per '{0}'. Questo pacchetto viene usato come riferimento implicito da .NET SDK e non è in genere necessario farvi riferimento dal progetto. Per altre informazioni, vedere {1} - {StrBegin="NETSDK1023: "} - - - NETSDK1071: A PackageReference to '{0}' specified a Version of `{1}`. Specifying the version of this package is not recommended. For more information, see https://aka.ms/sdkimplicitrefs - NETSDK1071: in un elemento PackageReference che fa riferimento a '{0}' è specificata la versione di `{1}`. È consigliabile non specificare la versione di questo pacchetto. Per altre informazioni, vedere https://aka.ms/sdkimplicitrefs - {StrBegin="NETSDK1071: "} - - - NETSDK1174: Placeholder - NETSDK1174: Placeholder - {StrBegin="NETSDK1174: "} - This string is not used here, but is a placeholder for the error code, which is used by the "dotnet run" command. - - - NETSDK1189: Prefer32Bit is not supported and has no effect for netcoreapp target. - NETSDK1189: Prefer32Bit non è supportato e non ha alcun effetto per la destinazione netcoreapp. - {StrBegin="NETSDK1189: "} - - - NETSDK1011: Assets are consumed from project '{0}', but no corresponding MSBuild project path was found in '{1}'. - NETSDK1011: le risorse vengono utilizzate dal progetto '{0}', ma non è stato trovato alcun percorso di progetto MSBuild corrispondente in '{1}'. - {StrBegin="NETSDK1011: "} - - - NETSDK1059: The tool '{0}' is now included in the .NET SDK. Information on resolving this warning is available at (https://aka.ms/dotnetclitools-in-box). - NETSDK1059: lo strumento '{0}' è ora incluso in .NET SDK. Per informazioni sulla risoluzione di questo avviso, vedere (https://aka.ms/dotnetclitools-in-box). - {StrBegin="NETSDK1059: "} - - - NETSDK1093: Project tools (DotnetCliTool) only support targeting .NET Core 2.2 and lower. - NETSDK1093: gli strumenti del progetto (DotnetCliTool) supportano come destinazione solo .NET Core 2.2 e versioni precedenti. - {StrBegin="NETSDK1093: "} - - - NETSDK1122: ReadyToRun compilation will be skipped because it is only supported for .NET Core 3.0 or higher. - NETSDK1122: la compilazione eseguita con ReadyToRun verrà ignorata perché è supportata solo per .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1122: "} - - - NETSDK1193: PublishSelfContained must be either true or false. The value given was '{0}'. - NETSDK1193: PublishSelfContained must be either true or false. The value given was '{0}'. - {StrBegin="NETSDK1193: "} - - - NETSDK1123: Publishing an application to a single-file requires .NET Core 3.0 or higher. - NETSDK1123: per la pubblicazione di un'applicazione in un file singolo è richiesto .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1123: "} - - - NETSDK1124: Trimming assemblies requires .NET Core 3.0 or higher. - NETSDK1124: per il trimming degli assembly è richiesto .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1124: "} - - - NETSDK1129: The 'Publish' target is not supported without specifying a target framework. The current project targets multiple frameworks, you must specify the framework for the published application. - NETSDK1129: la destinazione 'Publish' non è supportata se non viene specificato un framework di destinazione. Il progetto corrente è destinato a più framework, di conseguenza è necessario specificare il framework per l'applicazione pubblicata. - {StrBegin="NETSDK1129: "} - - - NETSDK1096: Optimizing assemblies for performance failed. You can either exclude the failing assemblies from being optimized, or set the PublishReadyToRun property to false. - NETSDK1096: l'ottimizzazione degli assembly per le prestazioni non è riuscita. È possibile escludere gli assembly in errore dall'ottimizzazione oppure impostare la proprietà PublishReadyToRun su false. - {StrBegin="NETSDK1096: "} - - - Some ReadyToRun compilations emitted warnings, indicating potential missing dependencies. Missing dependencies could potentially cause runtime failures. To show the warnings, set the PublishReadyToRunShowWarnings property to true. - Alcune compilazioni eseguite con la proprietà ReadyToRun hanno restituito avvisi per indicare potenziali dipendenze mancanti. Le dipendenze mancanti potrebbero causare errori di runtime. Per visualizzare gli avvisi, impostare la proprietà PublishReadyToRunShowWarnings su true. - - - - NETSDK1094: Unable to optimize assemblies for performance: a valid runtime package was not found. Either set the PublishReadyToRun property to false, or use a supported runtime identifier when publishing. When targeting .NET 6 or higher, make sure to restore packages with the PublishReadyToRun property set to true. - NETSDK1094: non è possibile ottimizzare gli assembly per le prestazioni perché non è stato trovato alcun pacchetto di runtime valido. Impostare la proprietà PublishReadyToRun su false oppure usare un identificatore di runtime supportato durante la pubblicazione. Quando si usa .NET 6 o versioni successive, assicurarsi di ripristinare i pacchetti con la proprietà PublishReadyToRun impostata su true. - {StrBegin="NETSDK1094: "} - - - NETSDK1095: Optimizing assemblies for performance is not supported for the selected target platform or architecture. Please verify you are using a supported runtime identifier, or set the PublishReadyToRun property to false. - NETSDK1095: l'ottimizzazione degli assembly per le prestazioni non è supportata per la piattaforma o l'architettura di destinazione selezionata. Verificare di usare un identificatore di runtime supportato oppure impostare la proprietà PublishReadyToRun su false. - {StrBegin="NETSDK1095: "} - - - NETSDK1103: RollForward setting is only supported on .NET Core 3.0 or higher. - NETSDK1103: l'impostazione RollForward è supportata solo in .NET Core 3.0 o versione successiva. - {StrBegin="NETSDK1103: "} - - - NETSDK1083: The specified RuntimeIdentifier '{0}' is not recognized. - NETSDK1083: l'elemento RuntimeIdentifier '{0}' specificato non è riconosciuto. - {StrBegin="NETSDK1083: "} - - - NETSDK1028: Specify a RuntimeIdentifier - NETSDK1028: specificare un elemento RuntimeIdentifier - {StrBegin="NETSDK1028: "} - - - NETSDK1109: Runtime list file '{0}' was not found. Report this error to the .NET team here: https://aka.ms/dotnet-sdk-issue. - NETSDK1109: il file di elenco di runtime '{0}' non è stato trovato. Segnalare questo errore al team di .NET all'indirizzo: https://aka.ms/dotnet-sdk-issue. - {StrBegin="NETSDK1109: "} - - - NETSDK1112: The runtime pack for {0} was not downloaded. Try running a NuGet restore with the RuntimeIdentifier '{1}'. - NETSDK1112: il pacchetto di runtime per {0} non è stato scaricato. Provare a eseguire un ripristino NuGet con RuntimeIdentifier '{1}'. - {StrBegin="NETSDK1112: "} - - - NETSDK1185: The Runtime Pack for FrameworkReference '{0}' was not available. This may be because DisableTransitiveFrameworkReferenceDownloads was set to true. - NETSDK1185: il Runtime Pack per FrameworkReference '{0}' non è disponibile. È possibile che DisableTransitiveFrameworkReferenceDownloads sia stato impostato su true. - {StrBegin="NETSDK1185: "} - - - NETSDK1150: The referenced project '{0}' is a non self-contained executable. A non self-contained executable cannot be referenced by a self-contained executable. For more information, see https://aka.ms/netsdk1150 - NETSDK1150: il progetto '{0}' a cui viene fatto riferimento è un eseguibile non autonomo. Non è possibile fare riferimento a un eseguibile non autonomo da un eseguibile autonomo. Per altre informazioni, vedere https://aka.ms/netsdk1150 - {StrBegin="NETSDK1150: "} - - - NETSDK1179: One of '--self-contained' or '--no-self-contained' options are required when '--runtime' is used. - NETSDK1179: quando si usa '--runtime' è necessaria una delle opzioni '--self-contained' o '--no-self-contained'. - {StrBegin="NETSDK1179: "} - - - NETSDK1048: 'AdditionalProbingPaths' were specified for GenerateRuntimeConfigurationFiles, but are being skipped because 'RuntimeConfigDevPath' is empty. - NETSDK1048: per GenerateRuntimeConfigurationFiles è stato specificato 'AdditionalProbingPaths', ma questo valore verrà ignorato perché 'RuntimeConfigDevPath' è vuoto. - {StrBegin="NETSDK1048: "} - - - NETSDK1138: The target framework '{0}' is out of support and will not receive security updates in the future. Please refer to {1} for more information about the support policy. - NETSDK1138: il framework di destinazione '{0}' non è più supportato e non riceverà aggiornamenti della sicurezza in futuro. Per altre informazioni sui criteri di supporto, vedere {1}. - {StrBegin="NETSDK1138: "} - - - NETSDK1046: The TargetFramework value '{0}' is not valid. To multi-target, use the 'TargetFrameworks' property instead. - NETSDK1046: il valore '{0}' di TargetFramework non è valido. Per impostare più destinazioni, usare la proprietà 'TargetFrameworks'. - {StrBegin="NETSDK1046: "} - - - NETSDK1145: The {0} pack is not installed and NuGet package restore is not supported. Upgrade Visual Studio, remove global.json if it specifies a certain SDK version, and uninstall the newer SDK. For more options visit https://aka.ms/targeting-apphost-pack-missing Pack Type:{0}, Pack directory: {1}, targetframework: {2}, Pack PackageId: {3}, Pack Package Version: {4} - NETSDK1145: il pacchetto {0} non è installato e il ripristino del pacchetto NuGet non è supportato. Aggiornare Visual Studio, rimuovere global.json se specifica una determinata versione dell'SDK e disinstallare l'SDK più recente. Per altre opzioni, vedere https://aka.ms/targeting-apphost-pack-missing. Tipo del pacchetto: {0}. Directory del pacchetto: {1}. Framework di destinazione: {2}. ID pacchetto: {3}. Versione del pacchetto: {4} - {StrBegin="NETSDK1145: "} - - - NETSDK1127: The targeting pack {0} is not installed. Please restore and try again. - NETSDK1127: il Targeting Pack {0} non è installato. Ripristinare e riprovare. - {StrBegin="NETSDK1127: "} - - - NETSDK1184: The Targeting Pack for FrameworkReference '{0}' was not available. This may be because DisableTransitiveFrameworkReferenceDownloads was set to true. - NETSDK1184: il Targeting Pack per FrameworkReference '{0}' non è disponibile. È possibile che DisableTransitiveFrameworkReferenceDownloads sia stato impostato su true. - {StrBegin="NETSDK1184: "} - - - NETSDK1175: Windows Forms is not supported or recommended with trimming enabled. Please go to https://aka.ms/dotnet-illink/windows-forms for more details. - NETSDK1175: quando il trimming è abilitato, Windows Form non è supportato o consigliato. Per altre informazioni, vedere https://aka.ms/dotnet-illink/windows-forms. - {StrBegin="NETSDK1175: "} - - - NETSDK1168: WPF is not supported or recommended with trimming enabled. Please go to https://aka.ms/dotnet-illink/wpf for more details. - NETSDK1168: quando il trimming è abilitato, il WPF non è supportato o consigliato. Per altre informazioni, visitare https://aka.ms/dotnet-illink/wpf. - {StrBegin="NETSDK1168: "} - - - NETSDK1172: The provided type library '{0}' does not exist. - NETSDK1172: la libreria dei tipi specificata '{0}' non esiste. - {StrBegin="NETSDK1172: "} - - - NETSDK1016: Unable to find resolved path for '{0}'. - NETSDK1016: il percorso risolto per '{0}' non è stato trovato. - {StrBegin="NETSDK1016: "} - - - Unable to use package assets cache due to I/O error. This can occur when the same project is built more than once in parallel. Performance may be degraded, but the build result will not be impacted. - Non è possibile usare la cache delle risorse del pacchetto a causa dell'errore di I/O. Questo problema può verificarsi quando lo stesso progetto viene compilato più volte in parallelo. Può influire sulle prestazioni, ma non sul risultato della compilazione. - - - - NETSDK1012: Unexpected file type for '{0}'. Type is both '{1}' and '{2}'. - NETSDK1012: tipo di file imprevisto per '{0}'. Il tipo è sia '{1}' che '{2}'. - {StrBegin="NETSDK1012: "} - - - NETSDK1073: The FrameworkReference '{0}' was not recognized - NETSDK1073: l'elemento FrameworkReference '{0}' non è stato riconosciuto - {StrBegin="NETSDK1073: "} - - - NETSDK1186: This project depends on Maui Essentials through a project or NuGet package reference, but doesn't declare that dependency explicitly. To build this project, you must set the UseMauiEssentials property to true (and install the Maui workload if necessary). - NETSDK1186: questo progetto dipende da Maui Essentials tramite un riferimento al progetto o al pacchetto NuGet, ma non dichiara questa dipendenza in modo esplicito. Per compilare questo progetto, è necessario impostare la proprietà UseMauiEssentials su true e, se necessario, installare il carico di lavoro Maui. - {StrBegin="NETSDK1186: "} - - - NETSDK1137: It is no longer necessary to use the Microsoft.NET.Sdk.WindowsDesktop SDK. Consider changing the Sdk attribute of the root Project element to 'Microsoft.NET.Sdk'. - NETSDK1137: non è più necessario usare Microsoft.NET.Sdk.WindowsDesktop SDK. Provare a modificare l'attributo Sdk dell'elemento Project radice in 'Microsoft.NET.Sdk'. - {StrBegin="NETSDK1137: "} - - - NETSDK1009: Unrecognized preprocessor token '{0}' in '{1}'. - NETSDK1009: token di preprocessore '{0}' non riconosciuto in '{1}'. - {StrBegin="NETSDK1009: "} - - - NETSDK1081: The targeting pack for {0} was not found. You may be able to resolve this by running a NuGet restore on the project. - NETSDK1081: il pacchetto di destinazione per {0} non è stato trovato. Per risolvere il problema, eseguire un ripristino NuGet sul progetto. - {StrBegin="NETSDK1081: "} - - - NETSDK1019: {0} is an unsupported framework. - NETSDK1019: {0} è un framework non supportato. - {StrBegin="NETSDK1019: "} - - - NETSDK1056: Project is targeting runtime '{0}' but did not resolve any runtime-specific packages. This runtime may not be supported by the target framework. - NETSDK1056: il progetto è destinato al runtime '{0}' ma non ha risolto pacchetti specifici del runtime. È possibile che questo runtime non sia supportato dal framework di destinazione. - {StrBegin="NETSDK1056: "} - - - NETSDK1050: The version of Microsoft.NET.Sdk used by this project is insufficient to support references to libraries targeting .NET Standard 1.5 or higher. Please install version 2.0 or higher of the .NET Core SDK. - NETSDK1050: la versione di Microsoft.NET.Sdk usata da questo progetto non è sufficiente per supportare i riferimenti alle librerie destinate a .NET Standard 1.5 o versione successiva. Installare la versione 2.0 o successiva di .NET Core SDK. - {StrBegin="NETSDK1050: "} - - - NETSDK1045: The current .NET SDK does not support targeting {0} {1}. Either target {0} {2} or lower, or use a version of the .NET SDK that supports {0} {1}. - NETSDK1045: la versione corrente di .NET SDK non supporta {0} {1} come destinazione. Impostare come destinazione {0} {2} o una versione precedente oppure usare una versione di .NET SDK che supporta {0} {1}. - {StrBegin="NETSDK1045: "} - - - NETSDK1139: The target platform identifier {0} was not recognized. - NETSDK1139: l'identificatore di piattaforma di destinazione {0} non è stato riconosciuto. - {StrBegin="NETSDK1139: "} - - - NETSDK1107: Microsoft.NET.Sdk.WindowsDesktop is required to build Windows desktop applications. 'UseWpf' and 'UseWindowsForms' are not supported by the current SDK. - NETSDK1107: per compilare applicazioni desktop di Windows, è necessario Microsoft.NET.Sdk.WindowsDesktop. 'UseWpf' e 'UseWindowsForms' non sono supportati dall'SDK corrente. - {StrBegin="NETSDK1107: "} - - - NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy - NETSDK1057: si sta usando una versione in anteprima di .NET. Vedere https://aka.ms/dotnet-support-policy - - - - NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. - NETSDK1131: la produzione di un componente Metadati Windows gestito con WinMDExp non è supportata quando la destinazione è {0}. - {StrBegin="NETSDK1131: "} - - - NETSDK1130: {1} cannot be referenced. Referencing a Windows Metadata component directly when targeting .NET 5 or higher is not supported. For more information, see https://aka.ms/netsdk1130 - NETSDK1130: non è possibile fare riferimento a {1}. Il riferimento diretto a un componente di Metadati Windows quando la destinazione è .NET 5 o versione successiva non è supportato. Per altre informazioni, vedere https://aka.ms/netsdk1130 - {StrBegin="NETSDK1130: "} - - - NETSDK1149: {0} cannot be referenced because it uses built-in support for WinRT, which is no longer supported in .NET 5 and higher. An updated version of the component supporting .NET 5 is needed. For more information, see https://aka.ms/netsdk1149 - NETSDK1149: non è possibile fare riferimento a {0} perché usa il supporto incorporato per WinRT, che non è più supportato in .NET 5 e versioni successive. È necessaria una versione aggiornata del componente che supporta .NET 5. Per altre informazioni, vedere https://aka.ms/netsdk1149 - {StrBegin="NETSDK1149: "} - - - NETSDK1106: Microsoft.NET.Sdk.WindowsDesktop requires 'UseWpf' or 'UseWindowsForms' to be set to 'true' - NETSDK1106: con Microsoft.NET.Sdk.WindowsDesktop 'UseWpf' o 'UseWindowsForms' deve essere impostato su 'true' - {StrBegin="NETSDK1106: "} - - - NETSDK1105: Windows desktop applications are only supported on .NET Core 3.0 or higher. - NETSDK1105: le applicazioni desktop di Windows sono supportate solo in .NET Core 3.0 o versioni successive. - {StrBegin="NETSDK1105: "} - - - NETSDK1100: To build a project targeting Windows on this operating system, set the EnableWindowsTargeting property to true. - NETSDK1100: per compilare un progetto destinato a Windows in questo sistema operativo, impostare la proprietà EnableWindowsTargeting su true. - {StrBegin="NETSDK1100: "} - - - NETSDK1136: The target platform must be set to Windows (usually by including '-windows' in the TargetFramework property) when using Windows Forms or WPF, or referencing projects or packages that do so. - NETSDK1136: la piattaforma di destinazione deve essere impostata su Windows, in genere includendo '-windows ' nella proprietà TargetFramework, quando si usa Windows Forms o WPF oppure si fa riferimento a progetti o pacchetti che lo usano. - {StrBegin="NETSDK1136: "} - - - NETSDK1148: A referenced assembly was compiled using a newer version of Microsoft.Windows.SDK.NET.dll. Please update to a newer .NET SDK in order to reference this assembly. - NETSDK1148: un assembly di riferimento è stato compilato con una versione più recente di Microsoft.Windows.SDK.NET.dll. Eseguire l'aggiornamento a un SDK .NET più recente per fare riferimento a questo assembly. - {StrBegin="NETSDK1148: "} - - - NETSDK1178: The project depends on the following workload packs that do not exist in any of the workloads available in this installation: {0} -You may need to build the project on another operating system or architecture, or update the .NET SDK. - NETSDK1178: il progetto dipende dai pacchetti di carico di lavoro seguenti che non esistono in nessuno dei carichi di lavoro disponibili in questa installazione: {0} -Potrebbe essere necessario compilare il progetto in un altro sistema operativo o architettura oppure aggiornare .NET SDK. - {StrBegin="NETSDK1178: "} - - - NETSDK1147: To build this project, the following workloads must be installed: {0} -To install these workloads, run the following command: dotnet workload restore - NETSDK1147: per compilare questo progetto devono essere installati i seguenti carichi di lavoro: {0} -Per installare questi carichi di lavoro, eseguire il seguente comando: dotnet workload restore - {StrBegin="NETSDK1147: "} LOCALIZATION: Do not localize "dotnet workload restore" - - - - \ No newline at end of file diff --git a/src/Tasks/Common/Resources/xlf/Strings.ja.xlf b/src/Tasks/Common/Resources/xlf/Strings.ja.xlf index b0deef2ce8b9..7c59264e1439 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.ja.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.ja.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: パッケージ {0} {1} にロケール '{2}' のリソースがあります。大文字と小文字の区別に関する問題を防ぐために、このロケールはビルド内では標準形式 '{3}' に正規化されています。大文字と小文字の区別に関する問題があることをパッケージの作成者に通知するようお勧めします。 - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: パッケージ {0} {1} にロケール '{2}' のリソースがあります。このロケールは .NET では認識されません。無効なロケールを使用していると思われることをパッケージ作成者に通知するようお勧めします。 - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -932,7 +932,7 @@ The following are names of parameters or literal values and should not be transl NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. - NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. + NETSDK1208: ターゲット プラットフォーム識別子 {0} が認識されませんでした。これは、MSBuildEnableWorkloadResolver が false に設定されており、この識別子に必要な .NET SDK ワークロードが無効なためです。ワークロードを有効にするには、この環境変数または MSBuild プロパティを設定解除します。 {StrBegin="NETSDK1208: "} @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Windows デスクトップ アプリケーションを作成するには、Microsoft.NET.Sdk.WindowsDesktop が必要です。現在の SDK では、'UseWpf' と 'UseWindowsForms' はサポートされていません。 {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: プレビュー版の .NET を使用しています。https://aka.ms/dotnet-support-policy をご覧ください - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.ko.xlf b/src/Tasks/Common/Resources/xlf/Strings.ko.xlf index d6e3c5e213ff..006243f3d17b 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.ko.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.ko.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: 패키지 {0} {1}에 로캘이 '{2}'인 리소스가 있습니다. 이 로캘은 빌드에서 대/소문자 문제를 방지하기 위해 표준 형식 '{3}'(으)로 정규화되었습니다. 패키지 작성자에게 이 대/소문자 문제에 대해 알리는 것이 좋습니다. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: 패키지 {0} {1}에는 로캘이 '{2}'인 리소스가 있습니다. 이 로캘은 .NET에서 인식할 수 없습니다. 패키지 작성자에게 잘못된 로캘을 사용하는 것 같다고 알리는 것이 좋습니다. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -932,7 +932,7 @@ The following are names of parameters or literal values and should not be transl NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. - NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. + NETSDK1208: 대상 플랫폼 식별자 {0}을(를) 인식할 수 없습니다. 이 식별자에 필요한 .NET SDK 워크로드를 사용하지 않도록 설정하는 MSBuildEnableWorkloadResolver가 false로 설정되어 있기 때문입니다. 워크로드를 활성화하려면 이 환경 변수 또는 MSBuild 속성을 설정 해제하세요. {StrBegin="NETSDK1208: "} @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Microsoft.NET.Sdk.WindowsDesktop을 사용하려면 Windows 데스크톱 애플리케이션을 빌드해야 합니다. 'UseWpf' 및 'UseWindowsForms'는 현재 SDK에서 지원하지 않습니다. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: .NET의 미리 보기 버전을 사용하고 있습니다. 참조: https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.pl.xlf b/src/Tasks/Common/Resources/xlf/Strings.pl.xlf index a4ec56fa42ab..9379e3dae8cb 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.pl.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.pl.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: Pakiet {0} {1} ma zasób z ustawieniami regionalnymi „{2}”. Te ustawienia regionalne zostały znormalizowane do standardowego formatu „{3}”, aby zapobiec problemom z wielkością liter w kompilacji. Rozważ powiadomienie autora pakietu o tym problemie z wielkością liter. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: Pakiet {0} {1} ma zasób z ustawieniami regionalnymi „{2}”. To ustawienie regionalne nie jest rozpoznawane przez platformę .NET. Rozważ powiadomienie autora pakietu, że prawdopodobnie używa on nieprawidłowych ustawień regionalnych. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -932,7 +932,7 @@ The following are names of parameters or literal values and should not be transl NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. - NETSDK1208: The target platform identifier {0} was not recognized. This is because MSBuildEnableWorkloadResolver is set to false which disables .NET SDK Workloads which is required for this identifer. Unset this environment variable or MSBuild property to enable workloads. + NETSDK1208: Identyfikator {0} platformy docelowej nie został rozpoznany. Jest to spowodowane tym, że parametr MSBuildEnableWorkloadResolver ma wartość false, co powoduje wyłączenie obciążeń zestawu .NET SDK wymaganych dla tego identyfikatora. Cofnij ustawienie tej zmiennej środowiskowej lub właściwości MSBuild, aby włączyć obciążenia. {StrBegin="NETSDK1208: "} @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Do kompilowania aplikacji klasycznych systemu Windows konieczny jest zestaw Microsoft.NET.Sdk.WindowsDesktop. Właściwości „UseWpf” i „UseWindowsForms” nie są obsługiwane przez bieżący zestaw SDK. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Korzystasz z wersji zapoznawczej platformy .NET. Zobacz: ttps://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.pt-BR.xlf b/src/Tasks/Common/Resources/xlf/Strings.pt-BR.xlf index 2542ed88445d..6fcb8513caa6 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.pt-BR.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.pt-BR.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: o pacote {0} {1} tem um recurso com a localidade '{2}'. Essa localidade foi normalizada para o formato padrão '{3}' para evitar problemas de maiúsculas e minúsculas na compilação. Considere notificar o autor do pacote sobre esse problema de caixa. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: o pacote {0} {1} tem um recurso com a localidade '{2}'. Esta localidade não é reconhecida pelo .NET. Considere notificar o autor do pacote de que parece estar usando uma localidade inválida. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Microsoft.NET.Sdk.WindowsDesktop é necessário para compilar aplicativos da área de trabalho do Windows. Não há suporte para 'UseWpf' e 'UseWindowsForms' no SDK atual. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Você está usando uma versão de visualização do .NET. Veja: https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.ru.xlf b/src/Tasks/Common/Resources/xlf/Strings.ru.xlf index dd6e534756bc..846c224e968f 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.ru.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.ru.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: в пакете {0} {1} есть ресурс с языковым стандартом "{2}". Эта локаль была нормализована до стандартного формата "{3}", чтобы предотвратить проблемы с регистром в сборке. Попробуйте уведомить автора пакета об этой проблеме с корпусом. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: в пакете {0} {1} есть ресурс с языковым стандартом "{2}". Эта локаль не распознается .NET. Попробуйте уведомить автора пакета о том, что он использует недопустимую локаль. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: для сборки классических приложений для Windows требуется Microsoft.NET.Sdk.WindowsDesktop. "UseWpf" и "UseWindowsForms" не поддерживаются текущим пакетом SDK. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Вы используете предварительную версию .NET. Дополнительные сведения см. на странице https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.tr.xlf b/src/Tasks/Common/Resources/xlf/Strings.tr.xlf index fcde37180549..7d8df9e436b5 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.tr.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.tr.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: {0} {1} paketi, '{2}' yerel ayarına sahip bir kaynağa sahip. Bu yerel ayar, yapıdaki büyük/küçük harf sorunlarını önlemek için standart '{3}' biçimine normalleştirildi. Bu büyük/küçük harf sorunu hakkında paket yazarını bilgilendirmeyi düşünün. - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: {0} {1} paketi, '{2}' yerel ayarına sahip bir kaynağa sahip. Bu yerel ayar .NET tarafından tanınmıyor. Paket yazarına geçersiz bir yerel ayar kullanıyor gibi göründüğünü bildirmeyi düşünün. - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: Windows Masaüstü uygulamalarını derlemek için Microsoft.NET.Sdk.WindowsDesktop gereklidir. 'UseWpf' ve 'UseWindowsForms' geçerli SDK tarafından desteklenmiyor. {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: Bir .NET önizleme sürümü kullanıyorsunuz. Bkz. https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.zh-Hans.xlf b/src/Tasks/Common/Resources/xlf/Strings.zh-Hans.xlf index 09a7194b85c6..343497b426fa 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.zh-Hans.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.zh-Hans.xlf @@ -682,13 +682,13 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. - NETSDK1187:包 {0} {1} 具有具有区域设置'{2}'的资源。此区域设置已规范化为标准格式'{3}'以防止生成中出现大小写问题。请考虑就此大小写问题通知包作者。 - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. - NETSDK1188:包 {0} {1} 具有具有区域设置'{2}'的资源。.NET 无法识别此区域设置。请考虑通知包作者它似乎正在使用无效的区域设置。 - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: 要构建 Windows 桌面应用程序,需使用 Microsoft.NET.Sdk.WindowsDesktop。当前 SDK 不支持 "UseWpf" 和 "UseWindowsForms"。 {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: 你正在使用 .NET 的预览版。请参阅 https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Common/Resources/xlf/Strings.zh-Hant.xlf b/src/Tasks/Common/Resources/xlf/Strings.zh-Hant.xlf index 14c75dd8cd73..692c077781df 100644 --- a/src/Tasks/Common/Resources/xlf/Strings.zh-Hant.xlf +++ b/src/Tasks/Common/Resources/xlf/Strings.zh-Hant.xlf @@ -683,12 +683,12 @@ The following are names of parameters or literal values and should not be transl NETSDK1187: Package {0} {1} has a resource with the locale '{2}'. This locale has been normalized to the standard format '{3}' to prevent casing issues in the build. Consider notifying the package author about this casing issue. NETSDK1187: 封裝 {0} {1} 具有地區設定 '{2}' 的資源。此地區設定已標準化為標準格式 '{3}' 以避免組建中發生大小寫問題。請考慮通知封裝作者這個大小寫問題。 - Error code is NETSDK1187. 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. + {StrBegin="NETSDK1187: "} 0 is a package name, 1 is a package version, 2 is the incorrect locale string, and 3 is the correct locale string. NETSDK1188: Package {0} {1} has a resource with the locale '{2}'. This locale is not recognized by .NET. Consider notifying the package author that it appears to be using an invalid locale. NETSDK1188: 封裝 {0} {1} 具有地區設定為 '{2}' 的資源。.NET 無法辨識此地區設定。請考慮通知封裝作者,其似乎使用不正確的地區設定。 - Error code is NETSDK1188. 0 is a package name, 1 is a package version, and 2 is the incorrect locale string + {StrBegin="NETSDK1188: "} 0 is a package name, 1 is a package version, and 2 is the incorrect locale string NETSDK1064: Package {0}, version {1} was not found. It might have been deleted since NuGet restore. Otherwise, NuGet restore might have only partially completed, which might have been due to maximum path length restrictions. @@ -940,10 +940,10 @@ The following are names of parameters or literal values and should not be transl NETSDK1107: 需有 Microsoft.NET.Sdk.WindowsDesktop 才能建置 Windows 傳統型應用程式。目前的 SDK 不支援 'UseWpf' 和 'UseWindowsForms'。 {StrBegin="NETSDK1107: "} - + NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy NETSDK1057: 您目前使用的是 .NET 預覽版。請參閱: https://aka.ms/dotnet-support-policy - + {StrBegin="NETSDK1057: "} NETSDK1131: Producing a managed Windows Metadata component with WinMDExp is not supported when targeting {0}. diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAGenerateRuntimeConfigurationFiles.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAGenerateRuntimeConfigurationFiles.cs index eec62f908a63..00eed848363e 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAGenerateRuntimeConfigurationFiles.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAGenerateRuntimeConfigurationFiles.cs @@ -40,7 +40,7 @@ public void ItCanGenerateWithoutAssetFile() var task = new TestableGenerateRuntimeConfigurationFiles { BuildEngine = new MockNeverCacheBuildEngine4(), - TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0", + TargetFrameworkMoniker = $".NETCoreApp,Version=v{ToolsetInfo.CurrentTargetFrameworkVersion}", RuntimeConfigPath = _runtimeConfigPath, RuntimeConfigDevPath = _runtimeConfigDevPath, RuntimeFrameworks = new[] @@ -49,7 +49,7 @@ public void ItCanGenerateWithoutAssetFile() "Microsoft.NETCore.App", new Dictionary { - {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ) }, @@ -67,7 +67,7 @@ public void ItCanGenerateWithoutAssetFile() ""rollForward"": ""LatestMinor"", ""framework"": {{ ""name"": ""Microsoft.NETCore.App"", - ""version"": ""6.0.0"" + ""version"": ""{ToolsetInfo.CurrentTargetFrameworkVersion}.0"" }} }} }}"); @@ -81,7 +81,7 @@ public void Given3RuntimeFrameworksItCanGenerateWithoutAssetFile() var task = new TestableGenerateRuntimeConfigurationFiles { BuildEngine = new MockNeverCacheBuildEngine4(), - TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0", + TargetFrameworkMoniker = $".NETCoreApp,Version=v{ToolsetInfo.CurrentTargetFrameworkVersion}", RuntimeConfigPath = _runtimeConfigPath, RuntimeConfigDevPath = _runtimeConfigDevPath, RuntimeFrameworks = new[] @@ -90,21 +90,21 @@ public void Given3RuntimeFrameworksItCanGenerateWithoutAssetFile() "Microsoft.NETCore.App", new Dictionary { - {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ), new MockTaskItem( "Microsoft.WindowsDesktop.App", new Dictionary { - {"FrameworkName", "Microsoft.WindowsDesktop.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.WindowsDesktop.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ), new MockTaskItem( "Microsoft.AspNetCore.App", new Dictionary { - {"FrameworkName", "Microsoft.AspNetCore.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.AspNetCore.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ) }, @@ -123,11 +123,11 @@ public void Given3RuntimeFrameworksItCanGenerateWithoutAssetFile() ""frameworks"": [ {{ ""name"": ""Microsoft.WindowsDesktop.App"", - ""version"": ""6.0.0"" + ""version"": ""{ToolsetInfo.CurrentTargetFrameworkVersion}.0"" }}, {{ ""name"": ""Microsoft.AspNetCore.App"", - ""version"": ""6.0.0"" + ""version"": ""{ToolsetInfo.CurrentTargetFrameworkVersion}.0"" }} ] }} @@ -141,7 +141,7 @@ public void Given2RuntimeFrameworksItCanGenerateWithoutAssetFile() var task = new TestableGenerateRuntimeConfigurationFiles { BuildEngine = new MockNeverCacheBuildEngine4(), - TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0", + TargetFrameworkMoniker = $".NETCoreApp,Version=v{ToolsetInfo.CurrentTargetFrameworkVersion}", RuntimeConfigPath = _runtimeConfigPath, RuntimeConfigDevPath = _runtimeConfigDevPath, RuntimeFrameworks = new[] @@ -150,14 +150,14 @@ public void Given2RuntimeFrameworksItCanGenerateWithoutAssetFile() "Microsoft.NETCore.App", new Dictionary { - {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ), new MockTaskItem( "Microsoft.WindowsDesktop.App", new Dictionary { - {"FrameworkName", "Microsoft.WindowsDesktop.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.WindowsDesktop.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ) }, @@ -175,7 +175,7 @@ public void Given2RuntimeFrameworksItCanGenerateWithoutAssetFile() ""rollForward"": ""LatestMinor"", ""framework"": {{ ""name"": ""Microsoft.WindowsDesktop.App"", - ""version"": ""6.0.0"" + ""version"": ""{ToolsetInfo.CurrentTargetFrameworkVersion}.0"" }} }} }}", @@ -188,7 +188,7 @@ public void GivenTargetMonikerItGeneratesShortName() var task = new TestableGenerateRuntimeConfigurationFiles { BuildEngine = new MockNeverCacheBuildEngine4(), - TargetFrameworkMoniker = ".NETCoreApp,Version=v6.0", + TargetFrameworkMoniker = $".NETCoreApp,Version=v{ToolsetInfo.CurrentTargetFrameworkVersion}", RuntimeConfigPath = _runtimeConfigPath, RuntimeConfigDevPath = _runtimeConfigDevPath, RuntimeFrameworks = new[] @@ -197,7 +197,7 @@ public void GivenTargetMonikerItGeneratesShortName() "Microsoft.NETCore.App", new Dictionary { - {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", "6.0.0"} + {"FrameworkName", "Microsoft.NETCore.App"}, {"Version", $"{ToolsetInfo.CurrentTargetFrameworkVersion}.0"} } ) }, @@ -215,7 +215,7 @@ public void GivenTargetMonikerItGeneratesShortName() ""rollForward"": ""LatestMinor"", ""framework"": {{ ""name"": ""Microsoft.NETCore.App"", - ""version"": ""6.0.0"" + ""version"": ""{ToolsetInfo.CurrentTargetFrameworkVersion}.0"" }} }} }}"); diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs index bbacf673e4d8..c2c5512f8bc1 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs @@ -40,11 +40,11 @@ public static IEnumerable ItemCounts { new object[] { "dotnet.new", - new int[] { 110, 2536, 1, 845, 75 }, + new int[] { 110, 2536, 1, 846, 73 }, }, new object[] { "simple.dependencies", - new int[] { 113, 2613, 1, 877, 96 }, + new int[] { 113, 2613, 1, 878, 94 }, }, }; } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolveRuntimePackAssetsTask.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolveRuntimePackAssetsTask.cs index a06879356c38..f9db307de958 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolveRuntimePackAssetsTask.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolveRuntimePackAssetsTask.cs @@ -52,7 +52,8 @@ public void ItFiltersSatelliteResources() task.Execute(); task.RuntimePackAssets.Should().HaveCount(1); - task.RuntimePackAssets.FirstOrDefault().ItemSpec.Should().Contain(@"runtimes\de\a.resources.dll"); + string expectedResource = Path.Combine("runtimes","de","a.resources.dll"); + task.RuntimePackAssets.FirstOrDefault().ItemSpec.Should().Contain(expectedResource); } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeHaveErrorCodes.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeHaveErrorCodes.cs index 33c30713282f..9ef89f25cdd9 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeHaveErrorCodes.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeHaveErrorCodes.cs @@ -32,12 +32,28 @@ public class GivenThatWeHaveErrorCodes 1039, 1040, 1041, - 1057, 1062, 1066, 1101, 1108, 1180, + 1195, + 1197, + 1199, + 1200, + 1201, + 1203, + 1204, + 1206, + 1207 + }; + + //ILLink lives in other repos and violated the _info requirement for no error code + //Adding them to an exclusion list as it's difficult and not worth it to unwind + private static readonly IReadOnlyList _infoExceptions = new string[] + { + "ILLinkRunning", + "ILLinkOptimizedAssemblies" }; [Fact] @@ -57,14 +73,17 @@ public void ThereAreNoGapsDuplicatesOrIncorrectlyFormattedCodes() } else { - match.Success - .Should() - .BeTrue(because: $"all non-informational should have correctly formatted error codes ({key} does not)."); + if (!_infoExceptions.Contains(key)) + { + match.Success + .Should() + .BeTrue(because: $"all non-informational should have correctly formatted error codes ({key} does not)."); - int code = int.Parse(match.Groups[1].Value); - codes.Add(code) - .Should() - .BeTrue(because: $"error codes should not be duplicated (NETSDK{code} is used more than once)"); + int code = int.Parse(match.Groups[1].Value); + codes.Add(code) + .Should() + .BeTrue(because: $"error codes should not be duplicated (NETSDK{code} is used more than once)"); + } } } @@ -95,10 +114,11 @@ public void ResxIsCommentedWithCorrectStrBegin() comment.Should().NotContain("StrBegin", because: "informational messages should not have error codes."); } - else + else if (!_infoExceptions.Contains(name)) { + comment.Should().StartWith($@"{{StrBegin=""{prefix} ""}}", - because: "localization instructions should indicate invariant error code as preceding translatable message."); + because: $"localization instructions should indicate invariant error code as preceding translatable message."); } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs index d708ee4b05cc..f6f4913dc2a1 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs @@ -21,7 +21,7 @@ public GivenThatWeWantToGetDependenciesViaDesignTimeBuild(ITestOutputHelper log) { } - [Fact] + [WindowsOnlyFact] public void ItShouldIgnoreAllDependenciesWithTypeNotEqualToPackageOrUnresolved() { var testRoot = _testAssetsManager.CreateTestDirectory().Path; @@ -54,7 +54,7 @@ public void ItShouldIgnoreAllDependenciesWithTypeNotEqualToPackageOrUnresolved() Assert.Equal("top.package2/1.0.0", item2.ItemSpec); } - [Fact] + [WindowsOnlyFact] public void ItShouldIdentifyDefaultImplicitPackages() { var testRoot = _testAssetsManager.CreateTestDirectory().Path; @@ -89,7 +89,7 @@ public void ItShouldIdentifyDefaultImplicitPackages() Assert.Equal("True", item3.GetMetadata(MetadataKeys.IsImplicitlyDefined)); } - [Fact] + [WindowsOnlyFact] public void ItShouldOnlyReturnPackagesInTheSpecifiedTarget() { var testRoot = _testAssetsManager.CreateTestDirectory().Path; @@ -356,7 +356,7 @@ public void ItShouldOnlyReturnPackagesInTheSpecifiedTarget() Assert.Equal("top.package1/1.0.0", item1.ItemSpec); } - [Fact] + [WindowsOnlyFact] public void ItShouldOnlyReturnTopLevelPackages() { var testRoot = _testAssetsManager.CreateTestDirectory().Path; diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/all.asset.types.project.lock.json b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/all.asset.types.project.lock.json index 46a99924f612..ec8afb6769d6 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/all.asset.types.project.lock.json +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/all.asset.types.project.lock.json @@ -258,4 +258,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dependencies.withgraphs.project.lock.json b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dependencies.withgraphs.project.lock.json index db171875261e..d5f10b8dd36d 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dependencies.withgraphs.project.lock.json +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dependencies.withgraphs.project.lock.json @@ -2872,4 +2872,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dotnet.new.project.lock.json b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dotnet.new.project.lock.json index 772f1e12eced..9c1b429f6323 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dotnet.new.project.lock.json +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/dotnet.new.project.lock.json @@ -1603,44 +1603,40 @@ "lib/netstandard1.3/_._": {} } }, - "System.Security.Cryptography.X509Certificates/4.3.2": { + "System.Security.Cryptography.X509Certificates/4.1.0": { "type": "package", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Globalization.Calendars": "4.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Cng": "4.2.0", + "System.Security.Cryptography.Csp": "4.0.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Http": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll": {} }, "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { + "runtimes/win/lib/netstandard1.6/_._": { "assetType": "runtime", "rid": "win" } @@ -2707,7 +2703,7 @@ "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", - "lib/net462/System.ComponentModel.Annotations.dll", + "lib/net461/System.ComponentModel.Annotations.dll", "lib/netcore50/System.ComponentModel.Annotations.dll", "lib/netstandard1.4/System.ComponentModel.Annotations.dll", "lib/portable-net45+win8/_._", @@ -2719,7 +2715,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", - "ref/net462/System.ComponentModel.Annotations.dll", + "ref/net461/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.xml", "ref/netcore50/de/System.ComponentModel.Annotations.xml", @@ -2945,7 +2941,7 @@ "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Diagnostics.Process.dll", - "lib/net462/System.Diagnostics.Process.dll", + "lib/net461/System.Diagnostics.Process.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", @@ -2953,7 +2949,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Diagnostics.Process.dll", - "ref/net462/System.Diagnostics.Process.dll", + "ref/net461/System.Diagnostics.Process.dll", "ref/netstandard1.3/System.Diagnostics.Process.dll", "ref/netstandard1.3/System.Diagnostics.Process.xml", "ref/netstandard1.3/de/System.Diagnostics.Process.xml", @@ -2983,7 +2979,7 @@ "runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll", "runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll", "runtimes/win/lib/net46/System.Diagnostics.Process.dll", - "runtimes/win/lib/net462/System.Diagnostics.Process.dll", + "runtimes/win/lib/net461/System.Diagnostics.Process.dll", "runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll", "runtimes/win7/lib/netcore50/_._" ] @@ -5415,7 +5411,7 @@ "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Algorithms.dll", - "lib/net462/System.Security.Cryptography.Algorithms.dll", + "lib/net461/System.Security.Cryptography.Algorithms.dll", "lib/net463/System.Security.Cryptography.Algorithms.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", @@ -5424,7 +5420,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Algorithms.dll", - "ref/net462/System.Security.Cryptography.Algorithms.dll", + "ref/net461/System.Security.Cryptography.Algorithms.dll", "ref/net463/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll", @@ -5435,7 +5431,7 @@ "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net462/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll" @@ -5451,17 +5447,17 @@ "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Cryptography.Cng.dll", - "lib/net462/System.Security.Cryptography.Cng.dll", + "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net463/System.Security.Cryptography.Cng.dll", "ref/net46/System.Security.Cryptography.Cng.dll", - "ref/net462/System.Security.Cryptography.Cng.dll", + "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net463/System.Security.Cryptography.Cng.dll", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net463/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll" @@ -5577,19 +5573,19 @@ "ref/xamarinwatchos10/_._" ] }, - "System.Security.Cryptography.X509Certificates/4.3.2": { + "System.Security.Cryptography.X509Certificates/4.1.0": { "sha512": "9ojGSlgAEjxYBxsz7lk8FTmDanXhSehK4sWuyniVN9LhQ023MMolziNLLHQ/ONT7QTdQ0B2gypE1/9hxHTrMwg==", "type": "package", - "path": "system.security.cryptography.x509certificates/4.3.2", + "path": "system.security.cryptography.x509certificates/4.1.0", "files": [ - "System.Security.Cryptography.X509Certificates.4.3.2.nupkg.sha512", + "System.Security.Cryptography.X509Certificates.4.1.0.nupkg.sha512", "System.Security.Cryptography.X509Certificates.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.X509Certificates.dll", - "lib/net462/System.Security.Cryptography.X509Certificates.dll", + "lib/net461/System.Security.Cryptography.X509Certificates.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", @@ -5597,7 +5593,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.X509Certificates.dll", - "ref/net462/System.Security.Cryptography.X509Certificates.dll", + "ref/net461/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml", @@ -5626,7 +5622,7 @@ "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/net462/System.Security.Cryptography.X509Certificates.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll" ] diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/simple.dependencies.project.lock.json b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/simple.dependencies.project.lock.json index 218f196d3aac..1209d9b9be9b 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/simple.dependencies.project.lock.json +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/LockFiles/simple.dependencies.project.lock.json @@ -1667,44 +1667,40 @@ "lib/netstandard1.3/_._": {} } }, - "System.Security.Cryptography.X509Certificates/4.3.2": { + "System.Security.Cryptography.X509Certificates/4.1.0": { "type": "package", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Globalization.Calendars": "4.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Cng": "4.2.0", + "System.Security.Cryptography.Csp": "4.0.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Http": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" }, "compile": { "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll": {} }, "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { + "runtimes/win/lib/netstandard1.6/_._": { "assetType": "runtime", "rid": "win" } @@ -2832,7 +2828,7 @@ "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net45/_._", - "lib/net462/System.ComponentModel.Annotations.dll", + "lib/net461/System.ComponentModel.Annotations.dll", "lib/netcore50/System.ComponentModel.Annotations.dll", "lib/netstandard1.4/System.ComponentModel.Annotations.dll", "lib/portable-net45+win8/_._", @@ -2844,7 +2840,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net45/_._", - "ref/net462/System.ComponentModel.Annotations.dll", + "ref/net461/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.dll", "ref/netcore50/System.ComponentModel.Annotations.xml", "ref/netcore50/de/System.ComponentModel.Annotations.xml", @@ -3070,7 +3066,7 @@ "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Diagnostics.Process.dll", - "lib/net462/System.Diagnostics.Process.dll", + "lib/net461/System.Diagnostics.Process.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", @@ -3078,7 +3074,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Diagnostics.Process.dll", - "ref/net462/System.Diagnostics.Process.dll", + "ref/net461/System.Diagnostics.Process.dll", "ref/netstandard1.3/System.Diagnostics.Process.dll", "ref/netstandard1.3/System.Diagnostics.Process.xml", "ref/netstandard1.3/de/System.Diagnostics.Process.xml", @@ -3108,7 +3104,7 @@ "runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll", "runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll", "runtimes/win/lib/net46/System.Diagnostics.Process.dll", - "runtimes/win/lib/net462/System.Diagnostics.Process.dll", + "runtimes/win/lib/net461/System.Diagnostics.Process.dll", "runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll", "runtimes/win7/lib/netcore50/_._" ] @@ -5611,7 +5607,7 @@ "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.Algorithms.dll", - "lib/net462/System.Security.Cryptography.Algorithms.dll", + "lib/net461/System.Security.Cryptography.Algorithms.dll", "lib/net463/System.Security.Cryptography.Algorithms.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", @@ -5620,7 +5616,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.Algorithms.dll", - "ref/net462/System.Security.Cryptography.Algorithms.dll", + "ref/net461/System.Security.Cryptography.Algorithms.dll", "ref/net463/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll", "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll", @@ -5631,7 +5627,7 @@ "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net462/System.Security.Cryptography.Algorithms.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll" @@ -5647,17 +5643,17 @@ "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/net46/System.Security.Cryptography.Cng.dll", - "lib/net462/System.Security.Cryptography.Cng.dll", + "lib/net461/System.Security.Cryptography.Cng.dll", "lib/net463/System.Security.Cryptography.Cng.dll", "ref/net46/System.Security.Cryptography.Cng.dll", - "ref/net462/System.Security.Cryptography.Cng.dll", + "ref/net461/System.Security.Cryptography.Cng.dll", "ref/net463/System.Security.Cryptography.Cng.dll", "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/net462/System.Security.Cryptography.Cng.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/net463/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll" @@ -5773,19 +5769,19 @@ "ref/xamarinwatchos10/_._" ] }, - "System.Security.Cryptography.X509Certificates/4.3.2": { + "System.Security.Cryptography.X509Certificates/4.1.0": { "sha512": "3e5jXb54vQuItYXB/KBMsqUw645c/JQjz1MoJ5uaco3mu+fLpscUeR0rQwcctjVAIMDEF6pGEa8falmDvyCIPg==", "type": "package", - "path": "System.Security.Cryptography.X509Certificates/4.3.2", + "path": "System.Security.Cryptography.X509Certificates/4.1.0", "files": [ - "System.Security.Cryptography.X509Certificates.4.3.2.nupkg.sha512", + "System.Security.Cryptography.X509Certificates.4.1.0.nupkg.sha512", "System.Security.Cryptography.X509Certificates.nuspec", "ThirdPartyNotices.txt", "dotnet_library_license.txt", "lib/MonoAndroid10/_._", "lib/MonoTouch10/_._", "lib/net46/System.Security.Cryptography.X509Certificates.dll", - "lib/net462/System.Security.Cryptography.X509Certificates.dll", + "lib/net461/System.Security.Cryptography.X509Certificates.dll", "lib/xamarinios10/_._", "lib/xamarinmac20/_._", "lib/xamarintvos10/_._", @@ -5793,7 +5789,7 @@ "ref/MonoAndroid10/_._", "ref/MonoTouch10/_._", "ref/net46/System.Security.Cryptography.X509Certificates.dll", - "ref/net462/System.Security.Cryptography.X509Certificates.dll", + "ref/net461/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll", "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml", "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml", @@ -5822,7 +5818,7 @@ "ref/xamarinwatchos10/_._", "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/net462/System.Security.Cryptography.X509Certificates.dll", + "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll", "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll" ] diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/MockNeverCacheBuildEngine4.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/MockNeverCacheBuildEngine4.cs index 10f91a163051..778f6d812357 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/MockNeverCacheBuildEngine4.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/MockNeverCacheBuildEngine4.cs @@ -12,7 +12,8 @@ internal class MockNeverCacheBuildEngine4 : MockBuildEngine { public override object GetRegisteredTaskObject(object key, RegisteredTaskObjectLifetime lifetime) { - return null; + RegisteredTaskObjects.TryGetValue(key, out object obj); + return obj; } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/ProcessFrameworkReferencesTests.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/ProcessFrameworkReferencesTests.cs index bfaeb1f95911..41d260af8056 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/ProcessFrameworkReferencesTests.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/ProcessFrameworkReferencesTests.cs @@ -163,6 +163,7 @@ public void Given_KnownFrameworkReferences_with_RuntimePackAlwaysCopyLocal_It_re TargetFrameworkVersion = "5.0", TargetPlatformIdentifier = "Windows", TargetPlatformVersion = "10.0.18362", + EnableRuntimePackDownload = true, RuntimeGraphPath = runtimeGraphPathPath, FrameworkReferences = @@ -172,7 +173,7 @@ public void Given_KnownFrameworkReferences_with_RuntimePackAlwaysCopyLocal_It_re new MockTaskItem("Microsoft.Windows.SDK.NET.Ref", new Dictionary { - {"TargetFramework", "net5.0-windows10.0.17760"}, + {"TargetFramework", $"net5.0-windows10.0.17760"}, {"RuntimeFrameworkName", "Microsoft.Windows.SDK.NET.Ref"}, {"DefaultRuntimeFrameworkVersion", "10.0.17760.1-preview"}, {"LatestRuntimeFrameworkVersion", "10.0.17760.1-preview"}, @@ -241,6 +242,7 @@ public void It_resolves_self_contained_FrameworkReferences_to_download() SelfContained = true, TargetLatestRuntimePatch = true, TargetLatestRuntimePatchIsDefault = true, + EnableRuntimePackDownload = true, FrameworkReferences = new[] { @@ -288,6 +290,7 @@ public void Given_reference_to_NETCoreApp_It_should_not_resolve_runtime_pack() runtimeGraphPathPath, TargetLatestRuntimePatch = true, TargetLatestRuntimePatchIsDefault = true, + EnableRuntimePackDownload = true, FrameworkReferences = new[] { diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs index 74e1e19b2415..2bb72453c728 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs @@ -492,6 +492,7 @@ internal byte[] HashSettings() } writer.Write(TargetFramework); writer.Write(VerifyMatchingImplicitPackageVersion); + writer.Write(DefaultImplicitPackages ?? ""); } stream.Position = 0; diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ShowPreviewMessage.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ShowPreviewMessage.cs index ee13a8458694..4b7738c6ebd4 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ShowPreviewMessage.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ShowPreviewMessage.cs @@ -19,7 +19,7 @@ protected override void ExecuteCore() BuildEngine4.GetRegisteredTaskObject(previewMessageKey, RegisteredTaskObjectLifetime.Build); if (messageDisplayed == null) { - Log.LogMessage(MessageImportance.High, Strings.UsingPreviewSdk_Info); + Log.LogMessage(MessageImportance.High, Strings.UsingPreviewSdk); BuildEngine4.RegisterTaskObject( previewMessageKey, diff --git a/src/Tests/HelixTasks/SDKCustomCreateXUnitWorkItemsWithTestExclusion.cs b/src/Tests/HelixTasks/SDKCustomCreateXUnitWorkItemsWithTestExclusion.cs index d3549632b141..1b9702a0f11a 100644 --- a/src/Tests/HelixTasks/SDKCustomCreateXUnitWorkItemsWithTestExclusion.cs +++ b/src/Tests/HelixTasks/SDKCustomCreateXUnitWorkItemsWithTestExclusion.cs @@ -103,6 +103,8 @@ private async Task> PrepareWorkItem(ITaskItem xunitProject) return null; } + xunitProject.TryGetMetadata("ExcludeAdditionalParameters", out string ExcludeAdditionalParameters); + xunitProject.TryGetMetadata("Arguments", out string arguments); string assemblyName = Path.GetFileName(targetPath); @@ -130,6 +132,12 @@ private async Task> PrepareWorkItem(ITaskItem xunitProject) string msbuildAdditionalSdkResolverFolder = netFramework ? "-e DOTNET_SDK_TEST_MSBUILDSDKRESOLVER_FOLDER=%HELIX_CORRELATION_PAYLOAD%\\r" : IsPosixShell ? "" : "-msbuildAdditionalSdkResolverFolder %HELIX_CORRELATION_PAYLOAD%\\r"; + if (ExcludeAdditionalParameters.Equals("true")) + { + testExecutionDirectory = ""; + msbuildAdditionalSdkResolverFolder = ""; + } + var scheduler = new AssemblyScheduler(methodLimit: !String.IsNullOrEmpty(Environment.GetEnvironmentVariable("TestFullMSBuild")) ? 32 : 16); var assemblyPartitionInfos = scheduler.Schedule(targetPath, netFramework: netFramework); diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs index a0983f5adac5..2f0a0f2add1b 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/EndToEndTests.cs @@ -73,7 +73,7 @@ public async Task ApiEndToEndWithRegistryPushAndPull() var sourceReference = new ImageReference(registry, DockerRegistryManager.BaseImage, DockerRegistryManager.Net6ImageTag); var destinationReference = new ImageReference(registry, NewImageName(), "latest"); - await registry.PushAsync(builtImage, sourceReference, destinationReference, Console.WriteLine, cancellationToken: default).ConfigureAwait(false); + await registry.PushAsync(builtImage, sourceReference, destinationReference, cancellationToken: default).ConfigureAwait(false); // pull it back locally new RunExeCommand(_testOutput, "docker", "pull", $"{DockerRegistryManager.LocalRegistry}/{NewImageName()}:latest") diff --git a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/RegistryTests.cs b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/RegistryTests.cs index 7bcdc7aeb031..95a317c4a68f 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/RegistryTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.IntegrationTests/RegistryTests.cs @@ -44,4 +44,33 @@ public async Task GetFromRegistry() Assert.NotNull(downloadedImage); } + + [InlineData("quay.io/centos/centos")] + [InlineData("registry.access.redhat.com/ubi8/dotnet-70")] + [DockerDaemonAvailableTheory] + public async Task CanReadManifestFromRegistry(string fullyQualifiedContainerName) + { + bool parsed = ContainerHelpers.TryParseFullyQualifiedContainerName(fullyQualifiedContainerName, + out string? containerRegistry, + out string? containerName, + out string? containerTag, + out string? containerDigest); + Assert.True(parsed); + Assert.NotNull(containerRegistry); + Assert.NotNull(containerName); + containerTag ??= "latest"; + + ILogger logger = _loggerFactory.CreateLogger(nameof(CanReadManifestFromRegistry)); + Registry registry = new Registry(ContainerHelpers.TryExpandRegistryToUri(containerRegistry), logger); + + var ridgraphfile = ToolsetUtils.GetRuntimeGraphFilePath(); + + ImageBuilder? downloadedImage = await registry.GetImageManifestAsync( + containerName, + containerTag, + "linux-x64", + ridgraphfile, + cancellationToken: default).ConfigureAwait(false); + Assert.NotNull(downloadedImage); + } } diff --git a/src/Tests/Microsoft.NET.Build.Containers.UnitTests/Microsoft.NET.Build.Containers.UnitTests.csproj b/src/Tests/Microsoft.NET.Build.Containers.UnitTests/Microsoft.NET.Build.Containers.UnitTests.csproj index ce73cd2545f1..09d401602488 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.UnitTests/Microsoft.NET.Build.Containers.UnitTests.csproj +++ b/src/Tests/Microsoft.NET.Build.Containers.UnitTests/Microsoft.NET.Build.Containers.UnitTests.csproj @@ -13,6 +13,7 @@ + diff --git a/src/Tests/Microsoft.NET.Build.Containers.UnitTests/RegistryTests.cs b/src/Tests/Microsoft.NET.Build.Containers.UnitTests/RegistryTests.cs index 2869377c6e0e..0e155d7d9425 100644 --- a/src/Tests/Microsoft.NET.Build.Containers.UnitTests/RegistryTests.cs +++ b/src/Tests/Microsoft.NET.Build.Containers.UnitTests/RegistryTests.cs @@ -1,8 +1,11 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Net; using Microsoft.Extensions.Logging; +using Microsoft.NET.Build.Containers.Resources; using Microsoft.NET.TestFramework; +using Moq; using Xunit; using Xunit.Abstractions; @@ -49,4 +52,352 @@ public void CheckIfGoogleArtifactRegistry(string registryName, bool isECR) Registry registry = new Registry(ContainerHelpers.TryExpandRegistryToUri(registryName), logger); Assert.Equal(isECR, registry.IsGoogleArtifactRegistry); } + + [Fact] + public async Task RegistriesThatProvideNoUploadSizeAttemptFullUpload() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(RegistriesThatProvideNoUploadSizeAttemptFullUpload)); + var repoName = "testRepo"; + var layerDigest = "sha256:fafafafafafafafafafafafafafafafa"; + var mockLayer = new Mock(MockBehavior.Strict); + mockLayer + .Setup(l => l.OpenBackingFile()).Returns(new MemoryStream(new byte[1000])); + mockLayer + .Setup(l => l.Descriptor).Returns(new Descriptor("blah", layerDigest, 1234)); + + var uploadPath = new Uri("/uploads/foo/12345", UriKind.Relative); + var api = new Mock(MockBehavior.Loose); + api.Setup(api => api.Blob.ExistsAsync(repoName, layerDigest, It.IsAny())).Returns(Task.FromResult(false)); + api.Setup(api => api.Blob.Upload.StartAsync(repoName, It.IsAny())).Returns(Task.FromResult(new StartUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadAtomicallyAsync(uploadPath, It.IsAny(), It.IsAny())).Returns(Task.FromResult(new FinalizeUploadInformation(uploadPath))); + + Registry registry = new(ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"), logger, api.Object, new RegistrySettings()); + await registry.PushLayerAsync(mockLayer.Object, repoName, CancellationToken.None); + + api.Verify(api => api.Blob.Upload.UploadChunkAsync(uploadPath, It.IsAny(), It.IsAny()), Times.Never()); + api.Verify(api => api.Blob.Upload.UploadAtomicallyAsync(uploadPath, It.IsAny(), It.IsAny()), Times.Once()); + } + + [Fact] + public async Task RegistriesThatProvideUploadSizePrefersFullUploadWhenChunkSizeIsLowerThanContentLength() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(RegistriesThatProvideUploadSizePrefersFullUploadWhenChunkSizeIsLowerThanContentLength)); + var repoName = "testRepo"; + var layerDigest = "sha256:fafafafafafafafafafafafafafafafa"; + var mockLayer = new Mock(MockBehavior.Strict); + var chunkSizeLessThanContentLength = 10000; + var registryUri = ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"); + mockLayer + .Setup(l => l.OpenBackingFile()).Returns(new MemoryStream(new byte[100000])); + mockLayer + .Setup(l => l.Descriptor).Returns(new Descriptor("blah", layerDigest, 1234)); + + var uploadPath = new Uri("/uploads/foo/12345", UriKind.Relative); + var absoluteUploadUri = new Uri(registryUri, uploadPath); + var api = new Mock(MockBehavior.Loose); + var uploadedCount = 0; + api.Setup(api => api.Blob.ExistsAsync(repoName, layerDigest, It.IsAny())).Returns(Task.FromResult(false)); + api.Setup(api => api.Blob.Upload.StartAsync(repoName, It.IsAny())).Returns(Task.FromResult(new StartUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadAtomicallyAsync(uploadPath, It.IsAny(), It.IsAny())).Returns(Task.FromResult(new FinalizeUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Returns(() => { + uploadedCount += chunkSizeLessThanContentLength; + return Task.FromResult(ChunkUploadSuccessful(absoluteUploadUri, uploadPath, uploadedCount)); + }); + + Registry registry = new(registryUri, logger, api.Object, new RegistrySettings()); + await registry.PushLayerAsync(mockLayer.Object, repoName, CancellationToken.None); + + api.Verify(api => api.Blob.Upload.UploadAtomicallyAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Exactly(1)); + api.Verify(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public async Task RegistriesThatFailAtomicUploadFallbackToChunked() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(RegistriesThatFailAtomicUploadFallbackToChunked)); + var repoName = "testRepo"; + var layerDigest = "sha256:fafafafafafafafafafafafafafafafa"; + var mockLayer = new Mock(MockBehavior.Strict); + var contentLength = 100000; + var chunkSizeLessThanContentLength = 100000; + var registryUri = ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"); + mockLayer + .Setup(l => l.OpenBackingFile()).Returns(new MemoryStream(new byte[contentLength])); + mockLayer + .Setup(l => l.Descriptor).Returns(new Descriptor("blah", layerDigest, 1234)); + + var uploadPath = new Uri("/uploads/foo/12345", UriKind.Relative); + var absoluteUploadUri = new Uri(registryUri, uploadPath); + var api = new Mock(MockBehavior.Loose); + var uploadedCount = 0; + api.Setup(api => api.Blob.ExistsAsync(repoName, layerDigest, It.IsAny())).Returns(Task.FromResult(false)); + api.Setup(api => api.Blob.Upload.StartAsync(repoName, It.IsAny())).Returns(Task.FromResult(new StartUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadAtomicallyAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Throws(new Exception("Server-side shutdown the thing")); + api.Setup(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Returns(() => { + uploadedCount += chunkSizeLessThanContentLength; + return Task.FromResult(ChunkUploadSuccessful(absoluteUploadUri, uploadPath, uploadedCount)); + }); + + Registry registry = new(registryUri, logger, api.Object, new RegistrySettings()); + await registry.PushLayerAsync(mockLayer.Object, repoName, CancellationToken.None); + + api.Verify(api => api.Blob.Upload.UploadAtomicallyAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Once()); + api.Verify(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Exactly(contentLength / chunkSizeLessThanContentLength)); + } + + [Fact] + public async Task ChunkedUploadCalculatesChunksCorrectly() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(RegistriesThatFailAtomicUploadFallbackToChunked)); + var repoName = "testRepo"; + var layerDigest = "sha256:fafafafafafafafafafafafafafafafa"; + var mockLayer = new Mock(MockBehavior.Strict); + var contentLength = 1000000; + var chunkSize = 100000; + var registryUri = ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"); + mockLayer + .Setup(l => l.OpenBackingFile()).Returns(new MemoryStream(new byte[contentLength])); + mockLayer + .Setup(l => l.Descriptor).Returns(new Descriptor("blah", layerDigest, 1234)); + + var uploadPath = new Uri("/uploads/foo/12345", UriKind.Relative); + var absoluteUploadUri = new Uri(registryUri, uploadPath); + var api = new Mock(MockBehavior.Loose); + var uploadedCount = 0; + api.Setup(api => api.Blob.ExistsAsync(repoName, layerDigest, It.IsAny())).Returns(Task.FromResult(false)); + api.Setup(api => api.Blob.Upload.StartAsync(repoName, It.IsAny())).Returns(Task.FromResult(new StartUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadAtomicallyAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Throws(new Exception("Server-side shutdown the thing")); + api.Setup(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Returns(() => { + uploadedCount += chunkSize; + return Task.FromResult(ChunkUploadSuccessful(absoluteUploadUri, uploadPath, uploadedCount)); + }); + + RegistrySettings settings = new() + { + ParallelUploadEnabled = false, + ForceChunkedUpload = false, + ChunkedUploadSizeBytes = chunkSize, + }; + + Registry registry = new(registryUri, logger, api.Object, settings); + await registry.PushLayerAsync(mockLayer.Object, repoName, CancellationToken.None); + + api.Verify(api => api.Blob.Upload.UploadAtomicallyAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Once()); + api.Verify(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Exactly(10)); + } + + [Fact] + public async Task PushAsync_Logging() + { + using TestLoggerFactory loggerFactory = new(_testOutput); + List<(LogLevel, string)> loggedMessages = new(); + loggerFactory.AddProvider(new InMemoryLoggerProvider(loggedMessages)); + ILogger logger = loggerFactory.CreateLogger(nameof(PushAsync_Logging)); + + var repoName = "testRepo"; + var layerDigest = "sha256:fafafafafafafafafafafafafafafafa"; + var mockLayer = new Mock(MockBehavior.Strict); + mockLayer + .Setup(l => l.OpenBackingFile()).Returns(new MemoryStream(new byte[1000])); + mockLayer + .Setup(l => l.Descriptor).Returns(new Descriptor("blah", layerDigest, 1234)); + + var uploadPath = new Uri("/uploads/foo/12345", UriKind.Relative); + var api = new Mock(MockBehavior.Loose); + api.Setup(api => api.Blob.ExistsAsync(repoName, layerDigest, It.IsAny())).Returns(Task.FromResult(false)); + api.Setup(api => api.Blob.Upload.StartAsync(repoName, It.IsAny())).Returns(Task.FromResult(new StartUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadAtomicallyAsync(uploadPath, It.IsAny(), It.IsAny())).Returns(Task.FromResult(new FinalizeUploadInformation(uploadPath))); + + Registry registry = new(ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"), logger, api.Object, new RegistrySettings()); + await registry.PushLayerAsync(mockLayer.Object, repoName, CancellationToken.None); + + Assert.NotEmpty(loggedMessages); + Assert.True(loggedMessages.All(m => m.Item1 == LogLevel.Trace)); + var messages = loggedMessages.Select(m => m.Item2).ToList(); + Assert.Contains(messages, m => m == "Started upload session for sha256:fafafafafafafafafafafafafafafafa"); + Assert.Contains(messages, m => m == "Finalized upload session for sha256:fafafafafafafafafafafafafafafafa"); + } + + [Fact] + public async Task PushAsync_ForceChunkedUpload() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(PushAsync_ForceChunkedUpload)); + + string repoName = "testRepo"; + string layerDigest = "sha256:fafafafafafafafafafafafafafafafa"; + Mock mockLayer = new(MockBehavior.Strict); + int contentLength = 1000000; + int chunkSize = 100000; + Uri registryUri = ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"); + mockLayer + .Setup(l => l.OpenBackingFile()).Returns(new MemoryStream(new byte[contentLength])); + mockLayer + .Setup(l => l.Descriptor).Returns(new Descriptor("blah", layerDigest, 1234)); + + Uri uploadPath = new("/uploads/foo/12345", UriKind.Relative); + Uri absoluteUploadUri = new(registryUri, uploadPath); + Mock api = new(MockBehavior.Loose); + int uploadedCount = 0; + api.Setup(api => api.Blob.ExistsAsync(repoName, layerDigest, It.IsAny())).Returns(Task.FromResult(false)); + api.Setup(api => api.Blob.Upload.StartAsync(repoName, It.IsAny())).Returns(Task.FromResult(new StartUploadInformation(uploadPath))); + api.Setup(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Returns(() => { + uploadedCount += chunkSize; + return Task.FromResult(ChunkUploadSuccessful(absoluteUploadUri, uploadPath, uploadedCount)); + }); + + RegistrySettings settings = new() + { + ParallelUploadEnabled = false, + ForceChunkedUpload = true, + ChunkedUploadSizeBytes = chunkSize, + }; + + Registry registry = new(registryUri, logger, api.Object, settings); + await registry.PushLayerAsync(mockLayer.Object, repoName, CancellationToken.None); + + api.Verify(api => api.Blob.Upload.UploadAtomicallyAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Never()); + api.Verify(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Exactly(10)); + } + + [Fact] + public async Task CanParseRegistryDeclaredChunkSize_FromRange() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(CanParseRegistryDeclaredChunkSize_FromRange)); + string repoName = "testRepo"; + + Mock client = new(MockBehavior.Loose); + HttpResponseMessage httpResponse = new() + { + StatusCode = HttpStatusCode.Accepted, + }; + httpResponse.Headers.Add("Range", "0-100000"); + httpResponse.Headers.Location = new Uri("https://my-registy.com/v2/testRepo/blobs/uploads/"); + client.Setup(client => client.SendAsync(It.Is(m => m.RequestUri == new Uri("https://my-registy.com/v2/testRepo/blobs/uploads/")), It.IsAny())).Returns(Task.FromResult(httpResponse)); + + HttpClient finalClient = client.Object; + DefaultBlobUploadOperations operations = new(new Uri("https://my-registy.com"), finalClient, logger); + StartUploadInformation result = await operations.StartAsync(repoName, CancellationToken.None); + + Assert.Equal("https://my-registy.com/v2/testRepo/blobs/uploads/", result.UploadUri.AbsoluteUri); + } + + [Fact] + public async Task CanParseRegistryDeclaredChunkSize_FromOCIChunkMinLength() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(CanParseRegistryDeclaredChunkSize_FromOCIChunkMinLength)); + string repoName = "testRepo"; + + Mock client = new(MockBehavior.Loose); + HttpResponseMessage httpResponse = new() + { + StatusCode = HttpStatusCode.Accepted, + }; + httpResponse.Headers.Add("OCI-Chunk-Min-Length", "100000"); + httpResponse.Headers.Location = new Uri("https://my-registy.com/v2/testRepo/blobs/uploads/"); + client.Setup(client => client.SendAsync(It.Is(m => m.RequestUri == new Uri("https://my-registy.com/v2/testRepo/blobs/uploads/")), It.IsAny())).Returns(Task.FromResult(httpResponse)); + + HttpClient finalClient = client.Object; + DefaultBlobUploadOperations operations = new(new Uri("https://my-registy.com"), finalClient, logger); + StartUploadInformation result = await operations.StartAsync(repoName, CancellationToken.None); + + Assert.Equal("https://my-registy.com/v2/testRepo/blobs/uploads/", result.UploadUri.AbsoluteUri); + } + + [Fact] + public async Task CanParseRegistryDeclaredChunkSize_None() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(CanParseRegistryDeclaredChunkSize_None)); + string repoName = "testRepo"; + + Mock client = new(MockBehavior.Loose); + HttpResponseMessage httpResponse = new() + { + StatusCode = HttpStatusCode.Accepted, + }; + httpResponse.Headers.Location = new Uri("https://my-registy.com/v2/testRepo/blobs/uploads/"); + client.Setup(client => client.SendAsync(It.Is(m => m.RequestUri == new Uri("https://my-registy.com/v2/testRepo/blobs/uploads/")), It.IsAny())).Returns(Task.FromResult(httpResponse)); + + HttpClient finalClient = client.Object; + DefaultBlobUploadOperations operations = new(new Uri("https://my-registy.com"), finalClient, logger); + StartUploadInformation result = await operations.StartAsync(repoName, CancellationToken.None); + + Assert.Equal("https://my-registy.com/v2/testRepo/blobs/uploads/", result.UploadUri.AbsoluteUri); + } + + [Fact] + public async Task UploadBlobChunkedAsync_NormalFlow() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(UploadBlobChunkedAsync_NormalFlow)); + Uri registryUri = ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"); + + int contentLength = 50000000; + int chunkSize = 10000000; + + Stream testStream = new MemoryStream(new byte[contentLength]); + + Uri uploadPath = new("/uploads/foo/12345", UriKind.Relative); + Uri absoluteUploadUri = new(registryUri, uploadPath); + Mock api = new(MockBehavior.Loose); + int uploadedCount = 0; + api.Setup(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Returns(() => { + uploadedCount += chunkSize; + return Task.FromResult(ChunkUploadSuccessful(absoluteUploadUri, uploadPath, uploadedCount)); + }); + + RegistrySettings settings = new() + { + ParallelUploadEnabled = false, + ForceChunkedUpload = false, + ChunkedUploadSizeBytes = chunkSize, + }; + + Registry registry = new(registryUri, logger, api.Object, settings); + await registry.UploadBlobChunkedAsync(testStream, new StartUploadInformation(absoluteUploadUri), CancellationToken.None); + + api.Verify(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Exactly(5)); + } + + [Fact] + public async Task UploadBlobChunkedAsync_Failure() + { + ILogger logger = _loggerFactory.CreateLogger(nameof(UploadBlobChunkedAsync_NormalFlow)); + Uri registryUri = ContainerHelpers.TryExpandRegistryToUri("public.ecr.aws"); + + int contentLength = 50000000; + int chunkSize = 10000000; + + Stream testStream = new MemoryStream(new byte[contentLength]); + + Uri uploadPath = new("/uploads/foo/12345", UriKind.Relative); + Uri absoluteUploadUri = new(registryUri, uploadPath); + Mock api = new(MockBehavior.Loose); + + Exception preparedException = new ApplicationException(Resource.FormatString(nameof(Strings.BlobUploadFailed), $"PATCH ", HttpStatusCode.InternalServerError)); + + api.Setup(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny())).Returns(() => { + throw preparedException; + }); + + RegistrySettings settings = new() + { + ParallelUploadEnabled = false, + ForceChunkedUpload = false, + ChunkedUploadSizeBytes = chunkSize, + }; + + Registry registry = new(registryUri, logger, api.Object, settings); + ApplicationException receivedException = await Assert.ThrowsAsync(() => registry.UploadBlobChunkedAsync(testStream, new StartUploadInformation(absoluteUploadUri), CancellationToken.None)); + + Assert.Equal(preparedException, receivedException); + + api.Verify(api => api.Blob.Upload.UploadChunkAsync(It.IsIn(absoluteUploadUri, uploadPath), It.IsAny(), It.IsAny()), Times.Exactly(1)); + } + + + + private static NextChunkUploadInformation ChunkUploadSuccessful(Uri requestUri, Uri uploadUrl, int? contentLength, HttpStatusCode code = HttpStatusCode.Accepted) + { + return new(uploadUrl); + } + } diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantAMessageWhenBuildingWithAPreviewSdk.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantAMessageWhenBuildingWithAPreviewSdk.cs index 536ca0ff2c85..25ac7aa68ffb 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantAMessageWhenBuildingWithAPreviewSdk.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantAMessageWhenBuildingWithAPreviewSdk.cs @@ -33,7 +33,7 @@ public void It_displays_a_preview_message_when_using_a_preview_Sdk() .Execute("/p:_NETCoreSdkIsPreview=true") .Should() .Pass() - .And.HaveStdOutContaining(Strings.UsingPreviewSdk_Info); + .And.HaveStdOutContaining(Strings.UsingPreviewSdk); } [Fact] @@ -49,7 +49,7 @@ public void It_does_not_display_a_preview_message_when_using_a_release_Sdk() .Execute("/p:_NETCoreSdkIsPreview=") .Should() .Pass() - .And.NotHaveStdOutContaining(Strings.UsingPreviewSdk_Info); + .And.NotHaveStdOutContaining(Strings.UsingPreviewSdk); } } } diff --git a/src/Tests/Microsoft.NET.TestFramework/TestContext.cs b/src/Tests/Microsoft.NET.TestFramework/TestContext.cs index 61797ff7e10c..a7f95fb5cffe 100644 --- a/src/Tests/Microsoft.NET.TestFramework/TestContext.cs +++ b/src/Tests/Microsoft.NET.TestFramework/TestContext.cs @@ -98,6 +98,10 @@ public static void Initialize(TestCommandLine commandLine) testContext.TestAssetsDirectory = FindFolderInTree(Path.Combine("src", "Assets"), AppContext.BaseDirectory); } + else if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DOTNET_SDK_TEST_ASSETS_DIRECTORY"))) + { + testContext.TestAssetsDirectory = Environment.GetEnvironmentVariable("DOTNET_SDK_TEST_ASSETS_DIRECTORY"); + } string repoRoot = null; #if DEBUG diff --git a/src/Tests/UnitTests.proj b/src/Tests/UnitTests.proj index 846c10aa73bb..8a9357d25007 100644 --- a/src/Tests/UnitTests.proj +++ b/src/Tests/UnitTests.proj @@ -17,7 +17,12 @@ - + + true + + + true + net472 @@ -64,6 +69,10 @@ + + + + @@ -92,6 +101,8 @@ + +