Android Значения вкуса Gradle, зависящие от других параметров вкуса - PullRequest
0 голосов
/ 22 января 2020

Итак, я какое-то время работал над проектом в стиле white label и столкнулся с проблемой расширяемости. В частности, как работает проект, я должен иметь возможность поддерживать несколько сред бэкэнда, каждая с уникальными учетными данными, для каждого клиента.

Я запек это поведение в gradle, используя два измерения вкуса один для клиента и один для бэкэнда, но у меня возникли некоторые проблемы с тем, чтобы заставить их склеиваться так легко, как хотелось бы.

Вот пример настройки gradle:

productFlavors {
        client1 {
            applicationId "com.app.client1"
            dimension "customer"
            resValue "string", "app_name", "Client 1"
        }
        client2{
            applicationId "com.app.client2"
            dimension "customer"
            resValue "string", "app_name", "Client 2"
        }

        dev {
            ext {
                packageExtension = ".DEV"
            }
            dimension "environment"
            resValue "string", "url", "https://dev.hostname.com/"
        }
        uat {
            ext {
                packageExtension = ".UAT"
            }
            dimension "environment"
            resValue "string", "url", "https://uat.hostname.com/"
        }
        stage {
            ext {
                packageExtension = ".STAGE"
            }
            dimension "environment"
            resValue "string", "url", "https://stg.hostname.com/"
        }
        prod {
            ext {
                packageExtension = ""
            }
            dimension "environment"
            resValue "string", "url", "https://hostname.com/"
        }
    }

Это прекрасно подходит для предоставления доступа к нужной среде и уникальному коду для каждого клиента, но это означает, что я не могу включить идентификатор клиента в Gradle. Я должен вставить его в файл ресурсов в каталоге client1Dev и т. П., Чтобы получить правильное значение во время выполнения.

У меня вопрос, есть ли способ переместить идентификатор клиента в gradle и получить правильное значение, основанное на сочетании вкусов клиента и среды?

Например, я хотел бы сделать что-то вроде:

        client1 {
            applicationId "com.app.client1"
            dimension "customer"
            resValue "string", "app_name", "Client 1"
            dev{
                resValue "string", "clientId", "1032145d8eefa00aff0098b08c9d"
            }
            uat{
                resValue "string", "clientId", "8654684561584798531985964/56"
            }
        }
        client2{
            applicationId "com.app.client2"
            dimension "customer"
            resValue "string", "app_name", "Client 2"
            dev{
                resValue "string", "clientId", "89612ad8967a00aff0098b08c08e"
            }
            uat{
                resValue "string", "clientId", "8612ad890981237409d0ab08c08f"
            }
        }

Что-то в этом духе, что позволило бы мне сохранить мой идентификатор клиента в файле Gradle вместе с другой информацией о настройке бэкэнда. Я ничего не могу найти о таких вещах, хотя, и я надеюсь, что кто-то здесь может пролить свет на то, как это сделать, или, по крайней мере, сказать мне, что это невозможно.

Спасибо!

1 Ответ

0 голосов
/ 23 января 2020

Вы всегда можете использовать отдельные исходные деревья для комбинации из нескольких ароматов и хранить строки непосредственно в правильном ресурсе (поскольку это, в сущности, то, что в любом случае делает resValue "string" "{ID}" "{VALUE}").

src/
  main/
    java/
    res/
      values/
        strings_ids.xml
          <string name="clientId">override_me</string>
  client1Dev/
  client1Uat/
  client2Dev/
    res/
      values/
        strings_ids.xml
          <string name="clientId">89612ad8967a00aff0098b08c08e</string>
  client2Uat/
    res/
      values/
        strings_ids.xml
          <string name="clientId">8612ad890981237409d0ab08c08f</string>

Или, если вы действительно хотите сохранить внутри файл build.gradle, вы можете написать его с помощью чего-то (менее элегантного) в следующем виде:

android.applicationVariants.all { variant ->
  if (variant.getFlavorName().equalsIgnoreCase("client1Dev")) {
    variant.resValue "string", "clientId", "1032145d8eefa00aff0098b08c9d"
  }
  else if (variant.getFlavorName().equalsIgnoreCase("client1Uat")) {
    variant.resValue "string", "clientId", "8654684561584798531985964/56"
  }
}

Но вы можете видеть, что последний станет очень неприятным, довольно быстро

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