Как создать productFlavors из файла конфигурации json в build.gradle? - PullRequest
0 голосов
/ 17 мая 2018

В андроид-проекте мне нужно создать десятки разновидностей, каждая из которых предназначена для отдельной школы, единственными отличиями между ними являются имя приложения / идентификатор приложения.

Файл build.gradle находится под управлением исходного кода, поэтому я хочу создать постоянно меняющийся файл конфигурации в формате json, поэтому для добавления / удаления аромата нет необходимости изменять «build.gradle», файл конфигурации любит:

[
    {"name": "school1"},
    {"name": "school2"}     
]

У меня вопрос, как прочитать эту конфигурацию и динамически создать productFlavors?

1 Ответ

0 голосов
/ 20 мая 2018

После изучения некоторых отличных навыков (так как вначале я действительно чувствую себя не в своей тарелке), вот короткий ответ:

изменить с этого

{
    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 для создания аромата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...