Это та же проблема, что и в Javascript.
Когда вы генерируете замыкания в цикле for, они связаны с переменной , а не со значением переменной.
Когда цикл завершится и будут запущены замыкания, все они будут использовать одно и то же значение ... то есть - последнее значение в цикле for перед его выходом
Например, вы ожидаете, что следующее напечатает 1 2 3 4
, но не
def closures = []
for (i in 1..4) {
closures << { -> println i }
}
closures.each { it() }
Он печатает 4 4 4 4
Чтобы это исправить, вынужно сделать одно из двух ... Во-первых, вы можете зафиксировать значение в локальной переменной, а затем закрыть эту переменную:
for (i in 1..4) {
def n = i
closures << { -> println n }
}
Второе, что вы можете сделатьиспользуйте groovy each
или collect
, так как каждый раз, когда они вызываются, переменная является другим экземпляром, поэтому она снова работает:
(1..4).each { i ->
closures << { -> println i }
}
В вашем случае вы можете выполнить цикл platforms
и собираются на карту одновременно с помощью collectEntries
:
def tasks = platforms.collectEntries { platformName ->
[
platformName,
{ ->
def componentUploadPath = componentUploadPaths[platformName]
echo "Uploading for platform [${platformName}] to [${componentUploadPath}]."
}
]
}
Надеюсь, это поможет!