{"record":{"id":"839f8cac60c3633a","repo":"microsoft/aspire","slug":"a-purge-task-with-the-name-taskname-already-exists","errorCode":null,"errorMessage":"A purge task with the name '{taskName}' already exists.","messagePattern":"A purge task with the name '(.+?)' already exists\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Azure.ContainerRegistry/AzureContainerRegistryExtensions.cs","lineNumber":202,"sourceCode":"\n        return builder.ConfigureInfrastructure(infra =>\n        {\n            var prefix = \"purgeOldImages\";\n\n            var registry = infra.GetProvisionableResources().OfType<ContainerRegistryService>().Single();\n            var allTasks = infra.GetProvisionableResources().OfType<ContainerRegistryTask>()\n                .Where(t => t.Parent == registry)\n                .ToList();\n            var autoNamedTasks = allTasks\n                .Where(t => t.Name.Value?.StartsWith(prefix, StringComparison.Ordinal) == true)\n                .ToList();\n            var taskIndex = autoNamedTasks.Count;\n\n            if (!string.IsNullOrWhiteSpace(taskName))\n            {\n                if (allTasks.Any(t => string.Equals(t.Name.Value, taskName, StringComparison.Ordinal)))\n                {\n                    throw new ArgumentException($\"A purge task with the name '{taskName}' already exists.\", nameof(taskName));\n                }\n            }\n            else\n            {\n                taskName = taskIndex == 0 ? prefix : $\"{prefix}_{taskIndex}\";\n            }\n\n            var bicepIdentifier = $\"{prefix}_{taskIndex}\";\n\n            var purgeTaskCmdVariable = new ProvisioningVariable($\"purgeTaskCmd_{taskIndex}\", typeof(string))\n            {\n                Value = CreatePurgeTaskContent(filter, purgeAgo, keep)\n            };\n            infra.Add(purgeTaskCmdVariable);\n\n            var purgeTask = new ContainerRegistryTask(bicepIdentifier)\n            {\n                Name = taskName,","sourceCodeStart":184,"sourceCodeEnd":220,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Azure.ContainerRegistry/AzureContainerRegistryExtensions.cs#L184-L220","documentation":"WithPurgeTask checks existing ACR tasks on the registry resource and throws ArgumentException when an explicitly supplied taskName collides with an existing task name (ordinal comparison). Auto-generated names use a numeric suffix to avoid collisions.","triggerScenarios":"Calling WithPurgeTask twice with the same explicit taskName, or with a taskName that matches a task created elsewhere (another WithPurgeTask call, ARM/Bicep-defined task).","commonSituations":"Adding multiple purge schedules in a loop that reuses a constant name; a name collision with pre-existing infrastructure in the same Bicep module.","solutions":["Use a unique taskName per WithPurgeTask call","Omit taskName so the method auto-generates a suffixed name","Rename or remove the pre-existing ACR task with the same name"],"exampleFix":"// before\n.WithPurgeTask(taskName: \"purge\", schedule: \"0 3 * * *\", keep: 10)\n.WithPurgeTask(taskName: \"purge\", schedule: \"0 4 * * *\", keep: 5)\n// after\n.WithPurgeTask(taskName: \"purge-nightly\", schedule: \"0 3 * * *\", keep: 10)\n.WithPurgeTask(taskName: \"purge-weekly\", schedule: \"0 4 * * 0\", keep: 5)","handlingStrategy":"validation","validationCode":"var nameInUse = registryResource.Infrastructure\n    .GetResources().OfType<ContainerRegistryTask>()\n    .Any(t => string.Equals(t.Name.Value, taskName, StringComparison.Ordinal));","typeGuard":null,"tryCatchPattern":"try { env.WithPurgeTask(taskName: taskName, schedule: cron, keep: 10); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"already exists\")) { log.LogError(ex, \"Duplicate task name {Task}\", taskName); }","preventionTips":["Let WithPurgeTask auto-name tasks when uniqueness is hard to guarantee","Keep a registry of task names used in the app model","Check for pre-existing tasks in imported infrastructure"],"tags":["azure","container-registry","duplicate","naming"],"backgroundTag":"file-already-exists","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}