Переменная окружения в settings.gradle не работает с Android Studio
У меня есть многомодульный проект с проектом библиотеки в другом корневом пути. В качестве иллюстрации вы можете представить что-то вроде этого:
/projects_home/projects/app_root
|--app/
| |--build.gradle
|--build.gradle
|--settings.gradle
/libraries_home/libraries
|--libA
|--build.gradle
В моем файле settings.gradle я могу установить абсолютный путь к проекту библиотеки, используя атрибут projectDir. Это прекрасно работает как в консоли, так и в Android Studio.
Но если я пытаюсь использовать переменную среды, она перестает работать с Android Studio. Настройки .gradle для приведенного выше примера выглядят следующим образом:
include ':app'
include ':libA'
project(':libA').projectDir = new File("$System.env.LIB_ROOT", '/libraries/libA')
Если я создаю с помощью оболочки graddle с консоли, она все равно работает. Но AS перестает работать со следующей ошибкой msg:
Gradle 'app' project refresh failed:
Configuration with name 'default' not found.
Если я отключу переменную среды, сборка на консоли завершится с тем же сообщением:
* What went wrong:
A problem occurred configuring project ':app'.
> Configuration with name 'default' not found.
Поэтому я предполагаю, что AS каким-то образом не сможет получить доступ к переменным окружения, установленным с моим ~/.bashrc
Может кто-нибудь из вас, возможно, знает способ, как я могу узнать AS о моей среде?
Ответы
Ответ 1
Android Studio не читает переменные среды, поэтому этот подход не будет работать. Кроме того, использование схемы projectDir
в settings.gradle, вероятно, вызовет проблемы. Android Studio имеет ограничение, что все его модули должны быть расположены под корнем проекта. Если у вас есть библиотеки, которые используются в нескольких проектах, и они не могут быть размещены под одним корнем проекта, лучшим советом является их публикация JAR или AARs в локальном репозитории Maven, который могут выбрать отдельные проекты.
Ответ 2
Android Studio выполняет чтение переменных среды. Вы можете доказать это, запустив Android Studio из оболочки, в которой эти env. переменные указываются вместо панели приборов X-window.
Причина, по которой у вас не были эти переменные, - это среда X-окна, которую вы использовали, не читала $HOME/.bashrc
, которая содержала эти переменные. Это имеет смысл, потому что bashrc
для Bash не X.
Предположим, вы используете GNOME или Unity для запуска Android Studio с указанными переменными окружения, просто измените файл .desktop
Android Studio (например, ~/.local/share/applications/android-studio.desktop
):
Найдите эту строку:
Exec="/home/username/tools/android/android-studio/bin/studio.sh" %f
Измените его на:
Exec=env LIB_ROOT=/libraries_home "/home/username/tools/android/android-studio/bin/studio.sh" %f
Примечание:
Эта модификация просто добавляет env LIB_ROOT=/libraries_home
к исходной команде. Вы должны заменить username
своим собственным именем пользователя.
Обновление
Если у вас есть какие-либо вопросы, пожалуйста, оставить комментарий сначала, вместо этого отредактировав ответ напрямую. В частности, я не знаю, как связаться с редактором.
Ответ 3
Несмотря на то, что ответ от Скотта Барты верен, я понял, что есть способ решить мою проблему и не поделиться этим, если у кого-то еще есть такое же требование.
Теперь я использую файл gradle.properties, который определяет и использует свойства gradle вместо свойств системы. Документацию по этой функции можно оштрафовать в руководстве пользователя
Решение моего исходного вопроса теперь выглядит следующим образом:
$USER_HOME/.gradle/gradle.properties:
LIB_ROOT=/libraries_home
Файл settings.gradle должен быть изменен, чтобы использовать свойство gradle вместо системного свойства:
include ':app'
include ':libA'
project(':libA').projectDir = new File(LIB_ROOT, '/libraries/libA')
Это отлично работает для меня, без головы, а также с AS.
Еще несколько слов о том, что я работаю с модулями, которые не помещаются под одним корнем проекта. До сих пор похоже, что AS не жалуется на это. Но я только начал работать с этой структурой, и может случиться, что позже я столкнулся с проблемами. Мне нравится в этом более плоское представление в AS, которое больше похоже на то, что я использую его с Eclipse.
То, что также описано в руководстве пользователя, заключается в установке системных свойств с помощью файла gradle.properties. Я также пробовал это, но я столкнулся с теми же проблемами с AS, используя переменные среды.
Ответ 4
На Mac, Android Studio не читает переменные среды для использования в Gradle, по-видимому. Я считаю, что это причина путаницы в ответах здесь - возможно, это происходит в Windows.
Чтобы заставить Android Studio читать переменные среды, я запускаю приложение из командной строки:
> /Applications/Android\ Studio.app/Contents/MacOS/studio
Другие ответы здесь предлагают решения, отличные от использования переменных среды. Для моей ситуации я использую библиотеку, которую я не писал, для которой требуется использование переменной окружения, и я бы не стал редактировать их код, чтобы было легче обновить его позже.
EDIT: И у меня есть значок док-станции для запуска Android Studio таким образом: https://superuser.com/a/260712/501568 объясняет, как.
Ответ 5
Он работает для меня со следующими шагами:
- Задайте переменную в Windows
- Reboot
- достигните его в gradle build:
System.env.MYVARIABLE
Ответ 6
Вы можете установить переменную окружения, добавив:
-DYOUR_VARIABLE=variable_value
до ~/Library/Preferences/AndroidStudioX.X/studio.vmoptions
, которую вы можете открыть, выбрав "Справка → Изменить пользовательские параметры виртуальной машины..." в меню Android Studio.
И тогда вы можете использовать его как:
System.env.YOUR_VARIABLE
в файле build.gradle или settings.gradle.