После изучения некоторых отличных навыков (так как вначале я действительно чувствую себя не в своей тарелке), вот короткий ответ:
изменить с этого
{
flavorDimensions 'school'
productFlavors {
fooFlavor {
dimension 'school'
// more configurations
}
barFlavor {
dimension 'school'
// more configurations
}
}
}
до:
{
flavorDimensions 'school'
productFlavors {
create('fooFlavor') {
dimension 'school'
}
create('barFlavor') {
dimension 'school'
}
}
}
полный ответ:
импорт groovy.json.JsonSlurper;
productFlavors {
def slurper = new JsonSlurper()
def orgs = slurper.parseText(new File('../orgs.json').text)
for (org in orgs) {
create(org.domain) {
dimension 'org'
applicationIdSuffix ".${org.domain}"
resValue 'string', 'app_name', "${org.name} School"
// add a meta-data in your AndroidManifest.xml like
<meta-data android:name="SERVER_PREFIX" android:value="${SERVER_PRERIX}" />
manifestPlaceholders.SERVER_PREFIX = "http://${org.domain}.xxxx.com"
}
}
}
Ниже приведены объяснения:
ФОНОВЫЕ ЗНАНИЯ
build.gradle - это dsl, написанный на groovy, а productFlavors
- это замыкание (но только в groovy, не то же самое, что означает замыкание в javascript и т. Д., Вы можете просто считать его функцией ROUGHLY), Ниже приведен пример закрытия Groovy:
def closure = { a -> "hello, $a" }
// or, just using it (stands for the argument whatever it is)
// def closure = { "hello, $it" }
assert closure('world') == 'hello, world'
и замыкание имеет важное встроенное свойство delegate
, что означает, что вы можете делегировать некоторые другие функции для выполнения, например, следующее:
def cl = { greet() } // you may wonder where's greet
class Greeter {
public greet() { println 'hello' }
}
// delegate to a greeter
cl.rehyderate(new Greeter(), this, this)
cl() // 'hello'
groovy может удалить паренсы при вызове метода (вы можете увидеть это в coffeescript). Вот пример:
def f(a, b, c) {
a + b + c // omit return just like coffeescript
}
assert f(1, 2, 3) == 6
assert f(1) 2 3 == 6
поэтому предыдущий код такой же как:
{
flavorDimensions('school')
productFlavors({
create('fooFlavor', {
dimension('school') // this is not a configuration, but just a plain method call
})
create('barFlavor', {
dimension('school')
})
})
}
здесь productFlavors принимает закрытие в качестве аргумента и делегирует NamedDomainObjectContainer для выполнения этого замыкания, а NamedDomainObjectContainer имеет метод create
для создания аромата