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
+ 4b0550942d7e38bf28dcfddb955e616290b83787https://dev.azure.com/dnceng/internal/_git/dotnet-runtime5b20af47d99620150c53eaf5db8636fdf730b126
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 5b20af47d99620150c53eaf5db8636fdf730b126
+ 4b0550942d7e38bf28dcfddb955e616290b83787https://dev.azure.com/dnceng/internal/_git/dotnet-runtimed099f075e45d2aa6007a22b71b45a08758559f80
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 5b20af47d99620150c53eaf5db8636fdf730b126
+ 4b0550942d7e38bf28dcfddb955e616290b83787https://github.com/dotnet/msbuild
@@ -58,13 +58,13 @@
https://github.com/dotnet/msbuild5785ed5c22cebcbf3a7c79dc8c91c3ce7954b2f5
-
+ 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
+ 13f2b6af6e9864711e815cfbffd7aa5015c52cechttps://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-runtimed099f075e45d2aa6007a22b71b45a08758559f80
-
+ 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
+ 0ab18affdf2a37647768d0e25f5f021bee6257a1https://github.com/dotnet/razor6d470d921df7c2244786e157397efb2082b4ad9d
-
+ 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
+ 3c37ef8f5358abb303c05d299f029fca7d867d56https://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.76.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.07.0.07.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.17.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.06.1.07.0.0-beta.23316.4
- 4.8.2
+ 4.18.46.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: Nepovedlo se nahrát objekt blob pomocí {0}; přijatý stavový kód {1}{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ Kontejner {0} se odeslal do démona Dockeru.
- 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}'.
+ Sestavení image {0} se značkami {1} nad základní imagí {2}
@@ -169,12 +169,12 @@
- 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}
+ 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}',
+ Konfigurace se nahrává do registru v objektu blob {0},
- Uploaded config to registry.
+ Konfigurace se nahrála do registru.
- Layer '{0}' already exists.
+ Vrstva {0} již existuje.
- 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}'.
+ 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}'.
+ Manifest se nahrává do registru {0} jako objekt blob {1}.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Manifest se nahrál do {0}.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Značka {0} se nahrává do {1}.{1} is the registry name
- 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: Fehler beim Hochladen des Blobs mit {0}; der Statuscode „{1}“ wurde empfangen.{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ Der Container „{0}“ wurde per Push an den Docker-Daemon übertragen.
- 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}'.
+ Das Image „{0}“ mit den Tags „{1}“ wird auf dem Basisimage „{2}“ erstellt.
@@ -169,12 +169,12 @@
- 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}
+ 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}',
+ Die Konfiguration wird in die Registrierung unter Blob „{0}“ hochgeladen,
- Uploaded config to registry.
+ Die Konfiguration wurde in die Registrierung hochgeladen.
- Layer '{0}' already exists.
+ Die Ebene „{0}“ ist bereits vorhanden.
- 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}'.
+ 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}'.
+ Das Manifest wird in die Registrierung „{0}“ als Blob „{1}“ hochgeladen.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Manifest in „{0}“ hochgeladen.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Das Tag „{0}“ wird in „{1}“ hochgeladen.{1} is the registry name
- 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: 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.
+ Se insertó el contenedor "{0}" en el demonio de Docker.
- 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}'.
+ Compilando imagen "{0}" con etiquetas "{1}" encima de la imagen base "{2}".
@@ -169,12 +169,12 @@
- 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}
+ 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}',
+ Cargando la configuración en el Registro en el blob "{0}",
- Uploaded config to registry.
+ Se cargó la configuración en el Registro.
- Layer '{0}' already exists.
+ La capa "{0}" ya existe.
- 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}'.
+ 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}'.
+ Cargando manifiesto en el Registro "{0}" como blob "{1}".{0} is the registry name
- Uploaded manifest to '{0}'.
+ Se cargó el manifiesto en "{0}".{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Cargando la etiqueta "{0}" en "{1}".{1} is the registry name
- 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: é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.
+ Le conteneur «{0}» a été envoyé au démon Docker.
- 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}'.
+ 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}
+ 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}
+ 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}',
+ Chargement de la configuration dans le Registre sur l’objet blob «{0}»,
- Uploaded config to registry.
+ Configuration chargée dans le Registre.
- Layer '{0}' already exists.
+ La couche '{0}' existe déjà.
- 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}'.
+ 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}'.
+ Chargement du manifeste dans le Registre '{0}' en tant qu’objet blob '{1}'.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Manifeste chargé dans '{0}'.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Chargement de la balise «{0}» vers «{1}».{1} is the registry name
- 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: non è stato possibile caricare il BLOB usando {0}; codice di stato ricevuto '{1}'.{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ È stato eseguito il push del contenitore '{0}' nel daemon Docker.
- 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}'.
+ Compilazione dell'immagine '{0}' con i tag '{1}' sopra l'immagine di base '{2}'.
@@ -169,12 +169,12 @@
- 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}
+ 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}',
+ Caricamento della configurazione nel Registro di sistema nel BLOB '{0}',
- Uploaded config to registry.
+ Configurazione caricata nel Registro di sistema.
- Layer '{0}' already exists.
+ Il livello '{0}' esiste già.
- 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}'.
+ 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}'.
+ Caricamento del manifesto nel Registro di sistema '{0}' come BLOB '{1}'.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Manifesto caricato in '{0}'.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Caricamento del tag '{0}' in '{1}'.{1} is the registry name
- 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: {0} を使用して BLOB をアップロードできませんでした; 状態コード '{1}' を受信しました。{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ コンテナー '{0}' を Docker デーモンにプッシュしました。
- Pushed container '{0}' to registry '{1}'.
+ コンテナー '{0}' をレジストリ '{1}' にプッシュしました。
- 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}
+ デーモン構成の読み取り中にエラーが発生しました: {0}{0} is the exception message that ends with period
- 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}',
+ BLOB '{0}' のレジストリに構成をアップロードしています、
- Uploaded config to registry.
+ 構成をレジストリにアップロードしました。
- Layer '{0}' already exists.
+ レイヤー '{0}' は既に存在します。
- Uploading layer '{0}' to '{1}'.
+ レイヤー '{0}' を '{1}' にアップロードしています。{0} is the layer digest, {1} is the registry name
- 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}'.
+ BLOB '{0}' としてレジストリ '{1}' にマニフェストをアップロードしています。{0} is the registry name
- Uploaded manifest to '{0}'.
+ マニフェストを '{0}' にアップロードしました。{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ タグ '{0}' を '{1}' にアップロードしています。{1} is the registry name
- 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: {0}을(를) 사용하여 Blob을 업로드하지 못했습니다. '{1}' 상태 코드를 수신했습니다.{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ Docker 디먼에 '{0}' 컨테이너를 푸시했습니다.
- Pushed container '{0}' to registry '{1}'.
+ '{1}' 레지스트리에 '{0}' 컨테이너를 푸시했습니다.
- 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}
+ 디먼 구성을 읽는 동안 오류가 발생했습니다. {0}{0} is the exception message that ends with period
- 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}',
+ Blob '{0}'에서 레지스트리에 구성을 업로드하는 중입니다.
- Uploaded config to registry.
+ 레지스트리에 구성을 업로드했습니다.
- Layer '{0}' already exists.
+ '{0}' 계층이 이미 있습니다.
- Uploading layer '{0}' to '{1}'.
+ '{1}'에 '{0}' 계층을 업로드하는 중입니다.{0} is the layer digest, {1} is the registry name
- 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}'.
+ '{0}' 레지스트리에 매니페스트를 '{1}' Blob으로 업로드하는 중입니다.{0} is the registry name
- Uploaded manifest to '{0}'.
+ '{0}'에 매니페스트를 업로드했습니다.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ '{1}'에 '{0}' 태그를 업로드하는 중입니다.{1} is the registry name
- 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: nie można przekazać obiektu blob przy użyciu {0}; odebrano kod stanu „{1}”.{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ Wypchnięto kontener „{0}” do demona platformy Docker.
- 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}'.
+ Tworzenie obrazu „{0}” z tagami „{1}” nad obrazem podstawowym „{2}”.
@@ -169,12 +169,12 @@
- 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}
+ 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}',
+ Przekazywanie konfiguracji do rejestru w obiekcie blob „{0}”,
- Uploaded config to registry.
+ Przekazano konfigurację do rejestru.
- Layer '{0}' already exists.
+ Warstwa „{0}” już istnieje.
- 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}'.
+ 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}'.
+ Przekazywanie manifestu do rejestru „{0}” jako obiektu blob „{1}”.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Przekazano manifest do rejestru „{0}”.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Przekazywanie tagu „{0}” do rejestru „{1}”.{1} is the registry name
- 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: Falha ao carregar o blob usando {0}; código de status recebido '{1}'.{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ Enviou o contêiner '{0}' para o daemon do Docker.
- 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}'.
+ Construindo imagem '{0}' com tags '{1}' em cima da imagem base '{2}'.
@@ -169,12 +169,12 @@
- 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}
+ 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}',
+ Carregamento da configuração para o registro no blob '{0}',
- Uploaded config to registry.
+ Configuração carregada no registro.
- Layer '{0}' already exists.
+ A camada '{0}' já existe.
- 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}'.
+ 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}'.
+ Carregamento do manifesto para o registro '{0}' como blob '{1}'.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Manifesto enviado para '{0}'.{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Carregando marca '{0}' para '{1}'.{1} is the registry name
- 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: не удалось отправить BLOB-объект с помощью {0}; получен код состояния "{1}".{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ Принудительно отправлен контейнер "{0}" в управляющую программу Docker.
- Pushed container '{0}' to registry '{1}'.
+ Принудительно отправлен контейнер "{0}" в реестр "{1}".
- 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}
+ Ошибка при чтении конфигурации управляющей программы: {0}{0} is the exception message that ends with period
- 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}',
+ Отправка конфигурации в реестр в BLOB-объекте "{0}",
- Uploaded config to registry.
+ Конфигурация отправлена в реестр.
- Layer '{0}' already exists.
+ Слой "{0}" уже существует.
- Uploading layer '{0}' to '{1}'.
+ Отправка слоя "{0}" в "{1}".{0} is the layer digest, {1} is the registry name
- 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}'.
+ Отправка манифеста в реестр "{0}" как BLOB-объект "{1}".{0} is the registry name
- Uploaded manifest to '{0}'.
+ Манифест отправлен в "{0}".{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ Отправка тега "{0}" в "{1}".{1} is the registry name
- 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: Blob, {0} kullanarak karşıya yüklenemedi; '{1}' durum kodu alındı.{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ '{0}' kapsayıcısı, Docker daemon'a gönderildi.
- 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}'.
+ '{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}
+ Daemon yapılandırması okunurken hata oluştu: {0}{0} is the exception message that ends with period
- 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}',
+ Yapılandırma, blob '{0}' konumundaki kayıt defterine karşıya yükleniyor,
- Uploaded config to registry.
+ Yapılandırma, kayıt defterine karşıya yüklendi.
- Layer '{0}' already exists.
+ '{0}' katmanı zaten var.
- 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}'.
+ '{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}'.
+ Bildirim, '{0}' kayıt defterine '{1}' blob olarak karşıya yükleniyor.{0} is the registry name
- Uploaded manifest to '{0}'.
+ Bildirim, '{0}' kayıt defterine karşıya yüklendi.{0} is the registry name
- 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}'.
+ '{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: 无法使用 {0} 上传 blob;已收到状态代码“{1}”。{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ 已将容器“{0}”推送到 Docker 守护程序。
- Pushed container '{0}' to registry '{1}'.
+ 已将容器“{0}”推送到注册表“{1}”。
- 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}
+ 读取守护程序配置时出错: {0}{0} is the exception message that ends with period
- 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}',
+ 正在将配置上传到 blob“{0}”处的注册表,
- Uploaded config to registry.
+ 已将配置上传到注册表。
- Layer '{0}' already exists.
+ 层“{0}”已存在。
- Uploading layer '{0}' to '{1}'.
+ 正在将层“{0}”上传到“{1}”。{0} is the layer digest, {1} is the registry name
- 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}'.
+ 正在将清单作为 blob“{1}”上传到注册表“{0}”。{0} is the registry name
- Uploaded manifest to '{0}'.
+ 已将清单上传到“{0}”。{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ 正在将标记“{0}”上传到“{1}”。{1} is the registry name
- 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: 無法使用 {0} 上傳 blob; 收到狀態碼 '{1}'。{StrBegin="CONTAINER1001: "}
- Pushed container '{0}' to Docker daemon.
+ 已推送容器 '{0}' 至 Docker 精靈。
- Pushed container '{0}' to registry '{1}'.
+ 已將容器 '{0}' 推送至登錄 '{1}'。
- 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}
+ 讀取精靈設定時發生錯誤: {0}{0} is the exception message that ends with period
- 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}',
+ 上傳設定至位於 blob '{0}' 的登錄,
- Uploaded config to registry.
+ 已上傳設定至登錄。
- Layer '{0}' already exists.
+ 圖層 '{0}' 已存在。
- Uploading layer '{0}' to '{1}'.
+ 上傳圖層 '{0}' 至 '{1}'。{0} is the layer digest, {1} is the registry name
- 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}'.
+ 上傳資訊清單至登錄 '{0}' 做為 blob '{1}'。{0} is the registry name
- Uploaded manifest to '{0}'.
+ 已上傳資訊清單清單至 '{0}'。{0} is the registry name
- Uploading tag '{0}' to '{1}'.
+ 上傳標記 '{0}' 至 '{1}'。{1} is the registry name
- 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.
+ 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.
+ 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.
+ 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.
+ 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.
+ 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.
+ {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.
+ {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.
+ 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.
+ 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.
+ Версия рабочей нагрузки {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.
+ {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.
+ 找不到在 {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.
+ 找不到 {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 stringNETSDK1189: 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: 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: 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
@@ -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: 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: Používáte verzi Preview rozhraní .NET. Viz: https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: 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: 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
@@ -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: 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: Sie verwenden eine Vorschauversion von .NET. Weitere Informationen: https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: 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: 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
@@ -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: 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: Está usando una versión preliminar de .NET. Visite: https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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} 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} 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
@@ -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 : 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: "}
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: 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: 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
@@ -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: si sta usando una versione in anteprima di .NET. Vedere https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: è possibile usare AddResource solo con tipi di risorsa integer.
- {StrBegin="NETSDK1076: "}
-
-
-
- NETSDK1070: il file di configurazione dell'applicazione deve avere un elemento di configurazione radice.
- {StrBegin="NETSDK1070: "}
-
-
-
- NETSDK1113: non è stato possibile creare apphost (tentativo {0} di {1}): {2}
- {StrBegin="NETSDK1113: "}
-
-
-
- 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: 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: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un file di Windows PE.
- {StrBegin="NETSDK1078: "}
-
-
-
- NETSDK1072: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un eseguibile Windows per il sottosistema CUI (Console).
- {StrBegin="NETSDK1072: "}
-
-
-
- NETSDK1177: impossibile firmare apphost con codice di errore {1}: {0}
- {StrBegin="NETSDK1177: "}
-
-
-
- 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: 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: prima di elaborare le risorse, è necessario configurare il preprocessore di risorse.
- {StrBegin="NETSDK1017: "}
-
-
-
- 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: 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: il file di risorse '{0}' non è stato trovato. Per generare questo file, eseguire un ripristino del pacchetto NuGet.
- {StrBegin="NETSDK1004: "}
-
-
-
- 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: il percorso dei file di risorse '{0}' non contiene una radice. Sono supportati solo percorsi completi.
- {StrBegin="NETSDK1006: "}
-
-
-
- NETSDK1001: è necessario specificare almeno un framework di destinazione possibile.
- {StrBegin="NETSDK1001: "}
-
-
-
- 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: 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: 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: 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: le informazioni del progetto per '{0}' non sono state trovate. Questo errore può indicare la mancanza di un riferimento al progetto.
- {StrBegin="NETSDK1007: "}
-
-
-
- NETSDK1032: la piattaforma '{0}' di RuntimeIdentifier e quella '{1}' di PlatformTarget devono essere compatibili.
- {StrBegin="NETSDK1032: "}
-
-
-
- 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: 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: 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: la pubblicazione in un singolo file è supportata solo per le applicazioni eseguibili.
- {StrBegin="NETSDK1099: "}
-
-
-
- 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: il valore di SupportedOSPlatformVersion {0} non può essere maggiore di quello di TargetPlatformVersion {1}.
- {StrBegin="NETSDK1135: "}
-
-
-
- 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: 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: 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: con le applicazioni complete è necessario usare l'host applicazione. Impostare SelfContained su false o UseAppHost su true.
- {StrBegin="NETSDK1067: "}
-
-
-
- NETSDK1125: la pubblicazione in un file singolo è supportata solo per la destinazione netcoreapp.
- {StrBegin="NETSDK1125: "}
-
-
-
- Verrà scelto '{0}' perché il valore di AssemblyVersion '{1}' è maggiore di '{2}'.
-
-
-
-
- Verrà scelto '{0}' in modo arbitrario perché entrambi gli elementi sono una copia locale e contengono versioni di file e assembly uguali.
-
-
-
-
- Verrà scelto '{0}' perché la versione del file '{1}' è maggiore di '{2}'.
-
-
-
-
- Verrà scelto '{0}' perché è un elemento della piattaforma.
-
-
-
-
- Verrà scelto '{0}' perché proviene da un pacchetto preferito.
-
-
-
-
- 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: 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: 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: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione per .NET6 o versioni successive.
- {StrBegin="NETSDK1167: "}
-
-
-
- NETSDK1176: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione di un'applicazione indipendente.
- {StrBegin="NETSDK1176: "}
-
-
-
- NETSDK1133: sono presenti informazioni in conflitto sui pacchetti di runtime disponibili per {0}:
-{1}
- {StrBegin="NETSDK1133: "}
-
-
-
- NETSDK1014: l'elemento di contenuto per '{0}' imposta '{1}', ma non fornisce '{2}' o '{3}'.
- {StrBegin="NETSDK1014: "}
-
-
-
- NETSDK1010: per poter utilizzare il contenuto pre-elaborato, è necessario assegnare un valore per il parametro '{1}' nell'attività '{0}'.
- {StrBegin="NETSDK1010: "}
-
-
-
- Non è stato possibile determinare la versione da usare perché '{0}' non esiste.
-
-
-
-
- Non è stato possibile determinare la versione da usare perché le versioni dell'assembly e del file sono uguali.
-
-
-
-
- Non è stato possibile determinare la versione da usare perché non esiste alcuna versione del file per '{0}'.
-
-
-
-
- Non è stato possibile determinare la versione da usare perché '{0}' non è un assembly.
-
-
-
-
- NETSDK1181: errore durante il recupero della versione del pacchetto: il pacchetto '{0}' non era presente nei manifesti del carico di lavoro.
- {StrBegin="NETSDK1181: "}
-
-
-
- NETSDK1042: non è stato possibile caricare PlatformManifest da '{0}' perché non esiste.
- {StrBegin="NETSDK1042: "}
-
-
-
- NETSDK1120: con i progetti C++/CLI destinati a .NET Core è il framework di destinazione deve essere impostato almeno su 'netcoreapp3.1'.
- {StrBegin="NETSDK1120: "}
-
-
-
- NETSDK1158: nell'elemento Crossgen2Tool mancano i metadati richiesti di '{0}'.
- {StrBegin="NETSDK1158: "}
-
-
-
- NETSDK1126: la pubblicazione di ReadyToRun tramite Crossgen2 è supportata solo per le applicazioni autonome.
- {StrBegin="NETSDK1126: "}
-
-
-
- NETSDK1155: l'eseguibile '{0}' di Crossgen2Tool non è stato trovato.
- {StrBegin="NETSDK1155: "}
-
-
-
- NETSDK1154: è necessario specificare Crossgen2Tool quando UseCrossgen2 è impostato su true.
- {StrBegin="NETSDK1154: "}
-
-
-
- NETSDK1166: non è possibile creare simboli durante la pubblicazione per .NET 5 con Crossgen2 usando la modalità composita.
- {StrBegin="NETSDK1166: "}
-
-
-
- NETSDK1160: l'eseguibile '{0}' di CrossgenTool non è stato trovato.
- {StrBegin="NETSDK1160: "}
-
-
-
- NETSDK1153: CrossgenTool non è stato specificato nella modalità di compilazione PDB.
- {StrBegin="NETSDK1153: "}
-
-
-
- NETSDK1159: è necessario specificare CrossgenTool quando UseCrossgen2 è impostato su false.
- {StrBegin="NETSDK1159: "}
-
-
-
- NETSDK1161: la libreria '{0}' di DiaSymReader non è stata trovata.
- {StrBegin="NETSDK1161: "}
-
-
-
- NETSDK1156: l'eseguibile '{0}' dell'host .NET non è stato trovato.
- {StrBegin="NETSDK1156: "}
-
-
-
- NETSDK1055: DotnetTool non supporta framework di destinazione di versioni precedenti a netcoreapp2.1.
- {StrBegin="NETSDK1055: "}
-
-
-
- NETSDK1054: supporta solo .NET Core.
- {StrBegin="NETSDK1054: "}
-
-
-
- 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: al token di preprocessore '{0}' è stato assegnato più di un valore. Come valore verrà scelto '{1}'.
- {StrBegin="NETSDK1015: "}
-
-
-
- NETSDK1152: sono stati trovati più file di output di pubblicazione con lo stesso percorso relativo: {0}.
- {StrBegin="NETSDK1152: "}
-
-
-
- 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: è 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: "}
-
-
-
- È stato rilevato un conflitto tra '{0}' e '{1}'.
-
-
-
-
- NETSDK1051: si è verificato un errore durante l'analisi di FrameworkList da '{0}'. {1} '{2}' non è valido.
- {StrBegin="NETSDK1051: "}
-
-
-
- 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: si è verificato un errore durante l'analisi di PlatformManifest da '{0}' a riga {1}. Il valore {2} '{3}' non è valido.
- {StrBegin="NETSDK1044: "}
-
-
-
- NETSDK1060: errore durante la lettura del file di asset: {0}
- {StrBegin="NETSDK1060: "}
-
-
-
- NETSDK1111: non è stato possibile eliminare l'apphost di output: {0}
- {StrBegin="NETSDK1111: "}
-
-
-
- NETSDK1077: non è stato possibile bloccare la risorsa.
- {StrBegin="NETSDK1077: "}
-
-
-
- NETSDK1030: il nome file specificato '{0}' supera 1024 byte
- {StrBegin="NETSDK1030: "}
-
-
-
- NETSDK1024: la cartella '{0}' esiste già. Eliminarla o specificare un elemento ComposeWorkingDir diverso
- {StrBegin="NETSDK1024: "}
-
-
-
- NETSDK1068: con l'host applicazione dipendente dal framework il framework di destinazione deve essere impostato almeno su 'netcoreapp2.1'.
- {StrBegin="NETSDK1068: "}
-
-
-
- NETSDK1052: il percorso '{0}' del file dell'elenco di framework non contiene una radice. Sono supportati solo percorsi completi.
- {StrBegin="NETSDK1052: "}
-
-
-
- NETSDK1087: nel progetto sono stati inclusi più elementi FrameworkReference per '{0}'.
- {StrBegin="NETSDK1087: "}
-
-
-
- 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: il file risolto ha un'immagine danneggiata, non contiene metadati o è inaccessibile per altri motivi. {0} {1}
- {StrBegin="NETSDK1049: "}
-
-
-
- NETSDK1141: non è possibile risolvere la versione di .NET SDK come specificato nel file global.json presente in {0}.
- {StrBegin="NETSDK1141: "}
-
-
-
- NETSDK1144: l'ottimizzazione degli assembly per le dimensioni non è riuscita. È possibile disabilitare l'ottimizzazione impostando la proprietà PublishTrimmed su false.
- {StrBegin="NETSDK1144: "}
-
-
-
- NETSDK1102: l'ottimizzazione degli assembly per le dimensioni non è supportata per la configurazione di pubblicazione selezionata. Assicurarsi di pubblicare un'app indipendente.
- {StrBegin="NETSDK1102: "}
-
-
-
- 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: la radice {0} del pacchetto specificata per la libreria risolta {1} non è corretta
- {StrBegin="NETSDK1020: "}
-
-
-
- NETSDK1025: il formato del manifesto di destinazione specificato {0} non è corretto
- {StrBegin="NETSDK1025: "}
-
-
-
- NETSDK1163: l'assembly di input '{0}' non è stato trovato.
- {StrBegin="NETSDK1163: "}
-
-
-
- NETSDK1003: nome di framework non valido: '{0}'.
- {StrBegin="NETSDK1003: "}
-
-
-
- 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: la stringa di versione '{0}' di NuGet non è valida.
- {StrBegin="NETSDK1018: "}
-
-
-
- NETSDK1075: il punto di controllo dell'aggiornamento non è valido. Non è possibile usare questa istanza per ulteriori aggiornamenti.
- {StrBegin="NETSDK1075: "}
-
-
-
- NETSDK1104: il valore '{0}' di RollForward non è valido. I valori consentiti sono {1}.
- {StrBegin="NETSDK1104: "}
-
-
-
- NETSDK1140: {0} non è un valore valido di TargetPlatformVersion per or {1}. Le versioni valide includono:
-{2}
- {StrBegin="NETSDK1140: "}
-
-
-
- NETSDK1173: il formato della libreria dei tipi specificata '{0}' non è valido.
- {StrBegin="NETSDK1173: "}
-
-
-
- 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: la libreria '{0}' di JIT non è stata trovata.
- {StrBegin="NETSDK1157: "}
-
-
-
- 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: mancano i metadati di '{0}' sull'elemento '{2}' di '{1}'.
- {StrBegin="NETSDK1008: "}
-
-
-
- NETSDK1164: il percorso PDB di output non è presente nella modalità di generazione PDB (metadati di OutputPDBImage).
- {StrBegin="NETSDK1164: "}
-
-
-
- NETSDK1165: il percorso dell'immagine R2R di output non è presente (metadati di OutputR2RImage).
- {StrBegin="NETSDK1165: "}
-
-
-
- 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: è stato trovato più di un file per {0}
- {StrBegin="NETSDK1021: "}
-
-
-
- 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: 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: la destinazione .NET 6.0 o versione successiva in Visual Studio 2019 non è supportata.
- {StrBegin="NETSDK1182: "}
-
-
-
- NETSDK1084: non è disponibile alcun host applicazione per l'elemento RuntimeIdentifier specificato '{0}'.
- {StrBegin="NETSDK1084: "}
-
-
-
- NETSDK1085: non è stata impostata alcuna proprietà 'NoBuild' su true, ma è stata chiamata la destinazione 'Build'.
- {StrBegin="NETSDK1085: "}
-
-
-
- NETSDK1002: il progetto '{0}' è destinato a '{2}'. Non può essere usato come riferimento in un progetto destinato a '{1}'.
- {StrBegin="NETSDK1002: "}
-
-
-
- NETSDK1082: non è disponibile alcun pacchetto di runtime per {0} per l'elemento RuntimeIdentifier specificato '{1}'.
- {StrBegin="NETSDK1082: "}
-
-
-
- NETSDK1132: non sono disponibili informazioni sui pacchetti di runtime per {0}.
- {StrBegin="NETSDK1132: "}
-
-
-
- NETSDK1128: l'hosting COM non supporta le distribuzioni complete.
- {StrBegin="NETSDK1128: "}
-
-
-
- NETSDK1119: i progetti C++/CLI destinati a .NET Core non possono usare EnableComHosting=true.
- {StrBegin="NETSDK1119: "}
-
-
-
- NETSDK1116: i progetti C++/CLI destinati a .NET Core devono essere librerie dinamiche.
- {StrBegin="NETSDK1116: "}
-
-
-
- NETSDK1118: i progetti C++/CLI destinati a .NET Core non possono essere compressi.
- {StrBegin="NETSDK1118: "}
-
-
-
- NETSDK1117: la pubblicazione di progetti C++/CLI destinati a .NET Core non è supportata.
- {StrBegin="NETSDK1117: "}
-
-
-
- NETSDK1121: i progetti C++/CLI destinati a .NET Core non possono usare SelfContained=true.
- {StrBegin="NETSDK1121: "}
-
-
-
- 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: generazione PDB: l'eseguibile '{0}' di R2R non è stato trovato.
- {StrBegin="NETSDK1162: "}
-
-
-
- NETSDK1053: la creazione di pacchetti come strumenti non prevede elementi autonomi.
- {StrBegin="NETSDK1053: "}
-
-
-
- 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: 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: 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: 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
- {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: le risorse vengono utilizzate dal progetto '{0}', ma non è stato trovato alcun percorso di progetto MSBuild corrispondente in '{1}'.
- {StrBegin="NETSDK1011: "}
-
-
-
- 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: gli strumenti del progetto (DotnetCliTool) supportano come destinazione solo .NET Core 2.2 e versioni precedenti.
- {StrBegin="NETSDK1093: "}
-
-
-
- NETSDK1122: la compilazione eseguita con ReadyToRun verrà ignorata perché è supportata solo per .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1122: "}
-
-
-
- NETSDK1123: per la pubblicazione di un'applicazione in un file singolo è richiesto .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1123: "}
-
-
-
- NETSDK1124: per il trimming degli assembly è richiesto .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1124: "}
-
-
-
- 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: 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: "}
-
-
-
- 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: 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: 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: l'impostazione RollForward è supportata solo in .NET Core 3.0 o versione successiva.
- {StrBegin="NETSDK1103: "}
-
-
-
- NETSDK1083: l'elemento RuntimeIdentifier '{0}' specificato non è riconosciuto.
- {StrBegin="NETSDK1083: "}
-
-
-
- NETSDK1028: specificare un elemento RuntimeIdentifier
- {StrBegin="NETSDK1028: "}
-
-
-
- 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: il pacchetto di runtime per {0} non è stato scaricato. Provare a eseguire un ripristino NuGet con RuntimeIdentifier '{1}'.
- {StrBegin="NETSDK1112: "}
-
-
-
- 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: quando si usa '--runtime' è necessaria una delle opzioni '--self-contained' o '--no-self-contained'.
- {StrBegin="NETSDK1179: "}
-
-
-
- NETSDK1048: per GenerateRuntimeConfigurationFiles è stato specificato 'AdditionalProbingPaths', ma questo valore verrà ignorato perché 'RuntimeConfigDevPath' è vuoto.
- {StrBegin="NETSDK1048: "}
-
-
-
- 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: il valore '{0}' di TargetFramework non è valido. Per impostare più destinazioni, usare la proprietà 'TargetFrameworks'.
- {StrBegin="NETSDK1046: "}
-
-
-
- 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: il Targeting Pack {0} non è installato. Ripristinare e riprovare.
- {StrBegin="NETSDK1127: "}
-
-
-
- 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: quando il trimming è abilitato, il WPF non è supportato o consigliato. Per altre informazioni, visitare https://aka.ms/dotnet-illink/wpf.
- {StrBegin="NETSDK1168: "}
-
-
-
- NETSDK1172: la libreria dei tipi specificata '{0}' non esiste.
- {StrBegin="NETSDK1172: "}
-
-
-
- NETSDK1016: il percorso risolto per '{0}' non è stato trovato.
- {StrBegin="NETSDK1016: "}
-
-
-
- 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: tipo di file imprevisto per '{0}'. Il tipo è sia '{1}' che '{2}'.
- {StrBegin="NETSDK1012: "}
-
-
-
- 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.
- {StrBegin="NETSDK1182: "}
-
-
-
- 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: token di preprocessore '{0}' non riconosciuto in '{1}'.
- {StrBegin="NETSDK1009: "}
-
-
-
- NETSDK1081: il pacchetto di destinazione per {0} non è stato trovato. Per risolvere il problema, eseguire un ripristino NuGet sul progetto.
- {StrBegin="NETSDK1081: "}
-
-
-
- NETSDK1019: {0} è un framework non supportato.
- {StrBegin="NETSDK1019: "}
-
-
-
- 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: 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: 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: l'identificatore di piattaforma di destinazione {0} non è stato riconosciuto.
- {StrBegin="NETSDK1139: "}
-
-
-
- NETSDK1107: per compilare applicazioni desktop di Windows, è necessario Microsoft.NET.Sdk.WindowsDesktop. 'UseWpf' e 'UseWindowsForms' non sono supportati dall'SDK corrente.
- {StrBegin="NETSDK1107: "}
-
-
-
- Si sta usando una versione in anteprima di .NET. Vedere https://aka.ms/dotnet-core-preview
-
-
-
-
- NETSDK1131: la produzione di un componente Metadati Windows gestito con WinMDExp non è supportata quando la destinazione è {0}.
- {StrBegin="NETSDK1131: "}
-
-
-
- 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: 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: con Microsoft.NET.Sdk.WindowsDesktop 'UseWpf' o 'UseWindowsForms' deve essere impostato su 'true'
- {StrBegin="NETSDK1106: "}
-
-
-
- NETSDK1105: le applicazioni desktop di Windows sono supportate solo in .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1105: "}
-
-
-
- NETSDK1100: per compilare applicazioni desktop di Windows è richiesto Windows.
- {StrBegin="NETSDK1100: "}
-
-
-
- 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: 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: 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: 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: è possibile usare AddResource solo con tipi di risorsa integer.
- {StrBegin="NETSDK1076: "}
-
-
-
- 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: il file di configurazione dell'applicazione deve avere un elemento di configurazione radice.
- {StrBegin="NETSDK1070: "}
-
-
-
- NETSDK1113: non è stato possibile creare apphost (tentativo {0} di {1}): {2}
- {StrBegin="NETSDK1113: "}
-
-
-
- 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: 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: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un file di Windows PE.
- {StrBegin="NETSDK1078: "}
-
-
-
- NETSDK1072: non è possibile usare '{0}' come eseguibile dell'host applicazione perché non è un eseguibile Windows per il sottosistema CUI (Console).
- {StrBegin="NETSDK1072: "}
-
-
-
- NETSDK1177: impossibile firmare apphost con codice di errore {1}: {0}
- {StrBegin="NETSDK1177: "}
-
-
-
- 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: 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: prima di elaborare le risorse, è necessario configurare il preprocessore di risorse.
- {StrBegin="NETSDK1017: "}
-
-
-
- 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: 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: il file di risorse '{0}' non è stato trovato. Per generare questo file, eseguire un ripristino del pacchetto NuGet.
- {StrBegin="NETSDK1004: "}
-
-
-
- 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: il percorso dei file di risorse '{0}' non contiene una radice. Sono supportati solo percorsi completi.
- {StrBegin="NETSDK1006: "}
-
-
-
- NETSDK1001: è necessario specificare almeno un framework di destinazione possibile.
- {StrBegin="NETSDK1001: "}
-
-
-
- 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: 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: 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: 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: le informazioni del progetto per '{0}' non sono state trovate. Questo errore può indicare la mancanza di un riferimento al progetto.
- {StrBegin="NETSDK1007: "}
-
-
-
- NETSDK1032: la piattaforma '{0}' di RuntimeIdentifier e quella '{1}' di PlatformTarget devono essere compatibili.
- {StrBegin="NETSDK1032: "}
-
-
-
- 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: 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: 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: la pubblicazione in un singolo file è supportata solo per le applicazioni eseguibili.
- {StrBegin="NETSDK1099: "}
-
-
-
- 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: il valore di SupportedOSPlatformVersion {0} non può essere maggiore di quello di TargetPlatformVersion {1}.
- {StrBegin="NETSDK1135: "}
-
-
-
- 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: 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: 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: con le applicazioni complete è necessario usare l'host applicazione. Impostare SelfContained su false o UseAppHost su true.
- {StrBegin="NETSDK1067: "}
-
-
-
- NETSDK1125: la pubblicazione in un file singolo è supportata solo per la destinazione netcoreapp.
- {StrBegin="NETSDK1125: "}
-
-
-
- Verrà scelto '{0}' perché il valore di AssemblyVersion '{1}' è maggiore di '{2}'.
-
-
-
-
- Verrà scelto '{0}' in modo arbitrario perché entrambi gli elementi sono una copia locale e contengono versioni di file e assembly uguali.
-
-
-
-
- Verrà scelto '{0}' perché la versione del file '{1}' è maggiore di '{2}'.
-
-
-
-
- Verrà scelto '{0}' perché è un elemento della piattaforma.
-
-
-
-
- Verrà scelto '{0}' perché proviene da un pacchetto preferito.
-
-
-
-
- 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: 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: 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: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione per .NET6 o versioni successive.
- {StrBegin="NETSDK1167: "}
-
-
-
- NETSDK1176: la compressione in un unico bundle di file è supportata solo quando si esegue la pubblicazione di un'applicazione indipendente.
- {StrBegin="NETSDK1176: "}
-
-
-
- NETSDK1133: sono presenti informazioni in conflitto sui pacchetti di runtime disponibili per {0}:
-{1}
- {StrBegin="NETSDK1133: "}
-
-
-
- NETSDK1014: l'elemento di contenuto per '{0}' imposta '{1}', ma non fornisce '{2}' o '{3}'.
- {StrBegin="NETSDK1014: "}
-
-
-
- NETSDK1010: per poter utilizzare il contenuto pre-elaborato, è necessario assegnare un valore per il parametro '{1}' nell'attività '{0}'.
- {StrBegin="NETSDK1010: "}
-
-
-
- Non è stato possibile determinare la versione da usare perché '{0}' non esiste.
-
-
-
-
- Non è stato possibile determinare la versione da usare perché le versioni dell'assembly e del file sono uguali.
-
-
-
-
- Non è stato possibile determinare la versione da usare perché non esiste alcuna versione del file per '{0}'.
-
-
-
-
- Non è stato possibile determinare la versione da usare perché '{0}' non è un assembly.
-
-
-
-
- NETSDK1181: errore durante il recupero della versione del pacchetto: il pacchetto '{0}' non era presente nei manifesti del carico di lavoro.
- {StrBegin="NETSDK1181: "}
-
-
-
- NETSDK1042: non è stato possibile caricare PlatformManifest da '{0}' perché non esiste.
- {StrBegin="NETSDK1042: "}
-
-
-
- NETSDK1120: con i progetti C++/CLI destinati a .NET Core è il framework di destinazione deve essere impostato almeno su 'netcoreapp3.1'.
- {StrBegin="NETSDK1120: "}
-
-
-
- NETSDK1158: nell'elemento Crossgen2Tool mancano i metadati richiesti di '{0}'.
- {StrBegin="NETSDK1158: "}
-
-
-
- NETSDK1126: la pubblicazione di ReadyToRun tramite Crossgen2 è supportata solo per le applicazioni autonome.
- {StrBegin="NETSDK1126: "}
-
-
-
- NETSDK1155: l'eseguibile '{0}' di Crossgen2Tool non è stato trovato.
- {StrBegin="NETSDK1155: "}
-
-
-
- NETSDK1154: è necessario specificare Crossgen2Tool quando UseCrossgen2 è impostato su true.
- {StrBegin="NETSDK1154: "}
-
-
-
- NETSDK1166: non è possibile creare simboli durante la pubblicazione per .NET 5 con Crossgen2 usando la modalità composita.
- {StrBegin="NETSDK1166: "}
-
-
-
- NETSDK1160: l'eseguibile '{0}' di CrossgenTool non è stato trovato.
- {StrBegin="NETSDK1160: "}
-
-
-
- NETSDK1153: CrossgenTool non è stato specificato nella modalità di compilazione PDB.
- {StrBegin="NETSDK1153: "}
-
-
-
- NETSDK1159: è necessario specificare CrossgenTool quando UseCrossgen2 è impostato su false.
- {StrBegin="NETSDK1159: "}
-
-
-
- NETSDK1161: la libreria '{0}' di DiaSymReader non è stata trovata.
- {StrBegin="NETSDK1161: "}
-
-
-
- NETSDK1156: l'eseguibile '{0}' dell'host .NET non è stato trovato.
- {StrBegin="NETSDK1156: "}
-
-
-
- NETSDK1055: DotnetTool non supporta framework di destinazione di versioni precedenti a netcoreapp2.1.
- {StrBegin="NETSDK1055: "}
-
-
-
- NETSDK1054: supporta solo .NET Core.
- {StrBegin="NETSDK1054: "}
-
-
-
- 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: al token di preprocessore '{0}' è stato assegnato più di un valore. Come valore verrà scelto '{1}'.
- {StrBegin="NETSDK1015: "}
-
-
-
- NETSDK1152: sono stati trovati più file di output di pubblicazione con lo stesso percorso relativo: {0}.
- {StrBegin="NETSDK1152: "}
-
-
-
- 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: è 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: "}
-
-
-
- È stato rilevato un conflitto tra '{0}' e '{1}'.
-
-
-
-
- NETSDK1051: si è verificato un errore durante l'analisi di FrameworkList da '{0}'. {1} '{2}' non è valido.
- {StrBegin="NETSDK1051: "}
-
-
-
- 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: si è verificato un errore durante l'analisi di PlatformManifest da '{0}' a riga {1}. Il valore {2} '{3}' non è valido.
- {StrBegin="NETSDK1044: "}
-
-
-
- NETSDK1060: errore durante la lettura del file di asset: {0}
- {StrBegin="NETSDK1060: "}
-
-
-
- NETSDK1111: non è stato possibile eliminare l'apphost di output: {0}
- {StrBegin="NETSDK1111: "}
-
-
-
- NETSDK1077: non è stato possibile bloccare la risorsa.
- {StrBegin="NETSDK1077: "}
-
-
-
- NETSDK1030: il nome file specificato '{0}' supera 1024 byte
- {StrBegin="NETSDK1030: "}
-
-
-
- NETSDK1024: la cartella '{0}' esiste già. Eliminarla o specificare un elemento ComposeWorkingDir diverso
- {StrBegin="NETSDK1024: "}
-
-
-
- NETSDK1068: con l'host applicazione dipendente dal framework il framework di destinazione deve essere impostato almeno su 'netcoreapp2.1'.
- {StrBegin="NETSDK1068: "}
-
-
-
- NETSDK1052: il percorso '{0}' del file dell'elenco di framework non contiene una radice. Sono supportati solo percorsi completi.
- {StrBegin="NETSDK1052: "}
-
-
-
- NETSDK1087: nel progetto sono stati inclusi più elementi FrameworkReference per '{0}'.
- {StrBegin="NETSDK1087: "}
-
-
-
- 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: il file risolto ha un'immagine danneggiata, non contiene metadati o è inaccessibile per altri motivi. {0} {1}
- {StrBegin="NETSDK1049: "}
-
-
-
- NETSDK1141: non è possibile risolvere la versione di .NET SDK come specificato nel file global.json presente in {0}.
- {StrBegin="NETSDK1141: "}
-
-
-
- NETSDK1144: l'ottimizzazione degli assembly per le dimensioni non è riuscita. È possibile disabilitare l'ottimizzazione impostando la proprietà PublishTrimmed su false.
- {StrBegin="NETSDK1144: "}
-
-
-
- NETSDK1102: l'ottimizzazione degli assembly per le dimensioni non è supportata per la configurazione di pubblicazione selezionata. Assicurarsi di pubblicare un'app indipendente.
- {StrBegin="NETSDK1102: "}
-
-
-
- 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
-
-
-
-
- Ottimizzazione degli assembly per le dimensioni. Questo processo potrebbe richiedere del tempo.
-
-
-
-
- NETSDK1191: non è stato possibile dedurre un identificatore di runtime per la proprietà '{0}'. Specificare un RID in modo esplicito.
- {StrBegin="NETSDK1191: "}
-
-
-
- NETSDK1020: la radice {0} del pacchetto specificata per la libreria risolta {1} non è corretta
- {StrBegin="NETSDK1020: "}
-
-
-
- NETSDK1025: il formato del manifesto di destinazione specificato {0} non è corretto
- {StrBegin="NETSDK1025: "}
-
-
-
- NETSDK1163: l'assembly di input '{0}' non è stato trovato.
- {StrBegin="NETSDK1163: "}
-
-
-
- NETSDK1003: nome di framework non valido: '{0}'.
- {StrBegin="NETSDK1003: "}
-
-
-
- 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: la stringa di versione '{0}' di NuGet non è valida.
- {StrBegin="NETSDK1018: "}
-
-
-
- NETSDK1075: il punto di controllo dell'aggiornamento non è valido. Non è possibile usare questa istanza per ulteriori aggiornamenti.
- {StrBegin="NETSDK1075: "}
-
-
-
- NETSDK1104: il valore '{0}' di RollForward non è valido. I valori consentiti sono {1}.
- {StrBegin="NETSDK1104: "}
-
-
-
- NETSDK1140: {0} non è un valore valido di TargetPlatformVersion per or {1}. Le versioni valide includono:
-{2}
- {StrBegin="NETSDK1140: "}
-
-
-
- NETSDK1173: il formato della libreria dei tipi specificata '{0}' non è valido.
- {StrBegin="NETSDK1173: "}
-
-
-
- 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: la libreria '{0}' di JIT non è stata trovata.
- {StrBegin="NETSDK1157: "}
-
-
-
- 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: mancano i metadati di '{0}' sull'elemento '{2}' di '{1}'.
- {StrBegin="NETSDK1008: "}
-
-
-
- NETSDK1164: il percorso PDB di output non è presente nella modalità di generazione PDB (metadati di OutputPDBImage).
- {StrBegin="NETSDK1164: "}
-
-
-
- NETSDK1165: il percorso dell'immagine R2R di output non è presente (metadati di OutputR2RImage).
- {StrBegin="NETSDK1165: "}
-
-
-
- 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: è stato trovato più di un file per {0}
- {StrBegin="NETSDK1021: "}
-
-
-
- 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: 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: 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.
- {StrBegin="NETSDK1192: "}
-
-
-
- NETSDK1084: non è disponibile alcun host applicazione per l'elemento RuntimeIdentifier specificato '{0}'.
- {StrBegin="NETSDK1084: "}
-
-
-
- NETSDK1085: non è stata impostata alcuna proprietà 'NoBuild' su true, ma è stata chiamata la destinazione 'Build'.
- {StrBegin="NETSDK1085: "}
-
-
-
- NETSDK1002: il progetto '{0}' è destinato a '{2}'. Non può essere usato come riferimento in un progetto destinato a '{1}'.
- {StrBegin="NETSDK1002: "}
-
-
-
- NETSDK1082: non è disponibile alcun pacchetto di runtime per {0} per l'elemento RuntimeIdentifier specificato '{1}'.
- {StrBegin="NETSDK1082: "}
-
-
-
- NETSDK1132: non sono disponibili informazioni sui pacchetti di runtime per {0}.
- {StrBegin="NETSDK1132: "}
-
-
-
- NETSDK1128: l'hosting COM non supporta le distribuzioni complete.
- {StrBegin="NETSDK1128: "}
-
-
-
- NETSDK1119: i progetti C++/CLI destinati a .NET Core non possono usare EnableComHosting=true.
- {StrBegin="NETSDK1119: "}
-
-
-
- NETSDK1116: i progetti C++/CLI destinati a .NET Core devono essere librerie dinamiche.
- {StrBegin="NETSDK1116: "}
-
-
-
- NETSDK1118: i progetti C++/CLI destinati a .NET Core non possono essere compressi.
- {StrBegin="NETSDK1118: "}
-
-
-
- NETSDK1117: la pubblicazione di progetti C++/CLI destinati a .NET Core non è supportata.
- {StrBegin="NETSDK1117: "}
-
-
-
- NETSDK1121: i progetti C++/CLI destinati a .NET Core non possono usare SelfContained=true.
- {StrBegin="NETSDK1121: "}
-
-
-
- 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: generazione PDB: l'eseguibile '{0}' di R2R non è stato trovato.
- {StrBegin="NETSDK1162: "}
-
-
-
- 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: la creazione di pacchetti come strumenti non prevede elementi autonomi.
- {StrBegin="NETSDK1053: "}
-
-
-
- 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: 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: 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: 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: 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: 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
- {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 non è supportato e non ha alcun effetto per la destinazione netcoreapp.
- {StrBegin="NETSDK1189: "}
-
-
-
- NETSDK1011: le risorse vengono utilizzate dal progetto '{0}', ma non è stato trovato alcun percorso di progetto MSBuild corrispondente in '{1}'.
- {StrBegin="NETSDK1011: "}
-
-
-
- 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: gli strumenti del progetto (DotnetCliTool) supportano come destinazione solo .NET Core 2.2 e versioni precedenti.
- {StrBegin="NETSDK1093: "}
-
-
-
- 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}'.
- {StrBegin="NETSDK1193: "}
-
-
-
- NETSDK1123: per la pubblicazione di un'applicazione in un file singolo è richiesto .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1123: "}
-
-
-
- NETSDK1124: per il trimming degli assembly è richiesto .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1124: "}
-
-
-
- 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: 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: "}
-
-
-
- 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: 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: 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: l'impostazione RollForward è supportata solo in .NET Core 3.0 o versione successiva.
- {StrBegin="NETSDK1103: "}
-
-
-
- NETSDK1083: l'elemento RuntimeIdentifier '{0}' specificato non è riconosciuto.
- {StrBegin="NETSDK1083: "}
-
-
-
- NETSDK1028: specificare un elemento RuntimeIdentifier
- {StrBegin="NETSDK1028: "}
-
-
-
- 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: il pacchetto di runtime per {0} non è stato scaricato. Provare a eseguire un ripristino NuGet con RuntimeIdentifier '{1}'.
- {StrBegin="NETSDK1112: "}
-
-
-
- NETSDK1185: il Runtime Pack per FrameworkReference '{0}' non è disponibile. È possibile che DisableTransitiveFrameworkReferenceDownloads sia stato impostato su true.
- {StrBegin="NETSDK1185: "}
-
-
-
- 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: quando si usa '--runtime' è necessaria una delle opzioni '--self-contained' o '--no-self-contained'.
- {StrBegin="NETSDK1179: "}
-
-
-
- NETSDK1048: per GenerateRuntimeConfigurationFiles è stato specificato 'AdditionalProbingPaths', ma questo valore verrà ignorato perché 'RuntimeConfigDevPath' è vuoto.
- {StrBegin="NETSDK1048: "}
-
-
-
- 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: il valore '{0}' di TargetFramework non è valido. Per impostare più destinazioni, usare la proprietà 'TargetFrameworks'.
- {StrBegin="NETSDK1046: "}
-
-
-
- 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: il Targeting Pack {0} non è installato. Ripristinare e riprovare.
- {StrBegin="NETSDK1127: "}
-
-
-
- NETSDK1184: il Targeting Pack per FrameworkReference '{0}' non è disponibile. È possibile che DisableTransitiveFrameworkReferenceDownloads sia stato impostato su true.
- {StrBegin="NETSDK1184: "}
-
-
-
- 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: quando il trimming è abilitato, il WPF non è supportato o consigliato. Per altre informazioni, visitare https://aka.ms/dotnet-illink/wpf.
- {StrBegin="NETSDK1168: "}
-
-
-
- NETSDK1172: la libreria dei tipi specificata '{0}' non esiste.
- {StrBegin="NETSDK1172: "}
-
-
-
- NETSDK1016: il percorso risolto per '{0}' non è stato trovato.
- {StrBegin="NETSDK1016: "}
-
-
-
- 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: tipo di file imprevisto per '{0}'. Il tipo è sia '{1}' che '{2}'.
- {StrBegin="NETSDK1012: "}
-
-
-
- NETSDK1073: l'elemento FrameworkReference '{0}' non è stato riconosciuto
- {StrBegin="NETSDK1073: "}
-
-
-
- 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: 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: token di preprocessore '{0}' non riconosciuto in '{1}'.
- {StrBegin="NETSDK1009: "}
-
-
-
- NETSDK1081: il pacchetto di destinazione per {0} non è stato trovato. Per risolvere il problema, eseguire un ripristino NuGet sul progetto.
- {StrBegin="NETSDK1081: "}
-
-
-
- NETSDK1019: {0} è un framework non supportato.
- {StrBegin="NETSDK1019: "}
-
-
-
- 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: 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: 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: l'identificatore di piattaforma di destinazione {0} non è stato riconosciuto.
- {StrBegin="NETSDK1139: "}
-
-
-
- NETSDK1107: per compilare applicazioni desktop di Windows, è necessario Microsoft.NET.Sdk.WindowsDesktop. 'UseWpf' e 'UseWindowsForms' non sono supportati dall'SDK corrente.
- {StrBegin="NETSDK1107: "}
-
-
-
- NETSDK1057: si sta usando una versione in anteprima di .NET. Vedere https://aka.ms/dotnet-support-policy
-
-
-
-
- NETSDK1131: la produzione di un componente Metadati Windows gestito con WinMDExp non è supportata quando la destinazione è {0}.
- {StrBegin="NETSDK1131: "}
-
-
-
- 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: 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: con Microsoft.NET.Sdk.WindowsDesktop 'UseWpf' o 'UseWindowsForms' deve essere impostato su 'true'
- {StrBegin="NETSDK1106: "}
-
-
-
- NETSDK1105: le applicazioni desktop di Windows sono supportate solo in .NET Core 3.0 o versioni successive.
- {StrBegin="NETSDK1105: "}
-
-
-
- NETSDK1100: per compilare un progetto destinato a Windows in questo sistema operativo, impostare la proprietà EnableWindowsTargeting su true.
- {StrBegin="NETSDK1100: "}
-
-
-
- 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: 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: 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: 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: パッケージ {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: パッケージ {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
@@ -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: ターゲット プラットフォーム識別子 {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: プレビュー版の .NET を使用しています。https://aka.ms/dotnet-support-policy をご覧ください
-
+ {StrBegin="NETSDK1057: "}
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: 패키지 {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: 패키지 {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
@@ -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: 대상 플랫폼 식별자 {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: .NET의 미리 보기 버전을 사용하고 있습니다. 참조: https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: 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: 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
@@ -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: 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: Korzystasz z wersji zapoznawczej platformy .NET. Zobacz: ttps://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: 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: 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
@@ -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: Você está usando uma versão de visualização do .NET. Veja: https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: в пакете {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: в пакете {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
@@ -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: Вы используете предварительную версию .NET. Дополнительные сведения см. на странице https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: {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: {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
@@ -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: Bir .NET önizleme sürümü kullanıyorsunuz. Bkz. https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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:包 {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:包 {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
@@ -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: 你正在使用 .NET 的预览版。请参阅 https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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: 封裝 {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: 封裝 {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
@@ -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: 您目前使用的是 .NET 預覽版。請參閱: https://aka.ms/dotnet-support-policy
-
+ {StrBegin="NETSDK1057: "}
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