settings.gradle中的环境变量不适用于Android Studio

cki*_*ihm 14 android android-studio

我确实有一个多模块项目,其中一个库项目位于不同的根路径中.如图所示,你可以想象这样的事情:

/projects_home/projects/app_root
   |--app/
   |   |--build.gradle
   |--build.gradle
   |--settings.gradle

/libraries_home/libraries
   |--libA
       |--build.gradle
Run Code Online (Sandbox Code Playgroud)

在我的settings.gradle文件中,我可以使用projectDir属性设置库项目的绝对路径.这在控制台和Android Studio中都可以正常工作.

但是,如果我尝试使用环境变量,它将停止使用Android Studio.上面示例的settings.gradle如下所示:

include ':app'
include ':libA'

project(':libA').projectDir = new File("$System.env.LIB_ROOT", '/libraries/libA')
Run Code Online (Sandbox Code Playgroud)

如果我使用控制台中的graddle包装器构建,它仍然有效.但AS停止使用以下错误消息:

Gradle 'app' project refresh failed:
Configuration with name 'default' not found.
Run Code Online (Sandbox Code Playgroud)

如果我取消设置环境变量,则控制台上的构建将失败并显示相同的消息:

* What went wrong:
A problem occurred configuring project ':app'.
> Configuration with name 'default' not found.
Run Code Online (Sandbox Code Playgroud)

因此我猜AS在某种程度上无法访问使用〜/ .bashrc设置的环境变量

你们中的某些人是否知道如何让AS了解我的环境?

cha*_*eng 13

Android Studio 读取环境变量.你可以通过从那些env的shell启动Android Studio来证明它.指定变量而不是X窗口仪表板.

您没有这些变量的原因是您使用的X-window环境没有读取$HOME/.bashrc包含这些变量的内容.这是有道理的,因为bashrcBash而不是X.

假设您正在使用GNOME或Unity,启动Android Studio并指定了这些环境变量,只需修改.desktopAndroid Studio 的文件(例如~/.local/share/applications/android-studio.desktop):

找到这一行:

Exec="/home/username/tools/android/android-studio/bin/studio.sh" %f
Run Code Online (Sandbox Code Playgroud)

将其更改为:

Exec=env LIB_ROOT=/libraries_home "/home/username/tools/android/android-studio/bin/studio.sh" %f
Run Code Online (Sandbox Code Playgroud)

注意:

此修改只是前env LIB_ROOT=/libraries_home置于原始命令.您必须username使用自己的用户名替换.

更新

如果您有任何疑问,请先发表评论,然后直接编辑答案.特别是,我不知道如何联系编辑.


Sco*_*rta 7

Android Studio不读取环境变量,因此这种方法不起作用.此外,projectDirsettings.gradle中使用该方案可能会导致问题.Android Studio有一个限制,即所有模块都需要位于项目根目录下.如果您有多个项目中使用的库并且它们不能放在单个项目根目录下,那么最好的建议是让它们将JAR或AAR发布到各个项目可以获取的本地Maven存储库.

  • 请检查我的答案:http://stackoverflow.com/a/27795843/1592410.声明"AS不读取env vars"是不正确的. (3认同)

cki*_*ihm 6

尽管斯科特巴塔的答案是正确的,但我意识到有一种方法可以解决我的问题,如果其他人有相同的要求,我不想分享这个问题.

我现在使用gradle.properties文件来定义和使用gradle属性而不是系统属性.可以在用户指南中对此功能的文档进行细化

我原来问题的解决方案现在看起来像这样:

$USER_HOME/.gradle/gradle.properties:

LIB_ROOT=/libraries_home
Run Code Online (Sandbox Code Playgroud)

必须修改settings.gradle文件以使用gradle属性而不是system属性:

include ':app'
include ':libA'

project(':libA').projectDir = new File(LIB_ROOT, '/libraries/libA')
Run Code Online (Sandbox Code Playgroud)

这对我来说很好,无头以及AS.

关于我正在使用未放置在一个项目根目录下的模块这一事实的更多说法.直到现在看起来AS并没有抱怨这个.但我刚开始使用这种结构,可能会在以后遇到问题.我喜欢这个是AS中更平坦的表示,更像是我习惯用Eclipse.

用户指南中还描述了使用gradle.properties文件设置系统属性.我也尝试了这个,但我确实遇到了使用环境变量的AS相同的问题.


man*_*roe 5

在Mac上,Android Studio显然不会读取在Gradle中使用的环境变量.我相信这是在这里答案混淆的原因 - 也许它在Windows上.

为了让Android Studio读取环境变量,我从命令行运行应用程序:

> /Applications/Android\ Studio.app/Contents/MacOS/studio 
Run Code Online (Sandbox Code Playgroud)

这里的其他答案提供除使用环境变量之外的解决方案.对于我的情况,我正在使用一个我没写过的库,需要使用环境变量,而我宁愿不编辑它们的代码,以便以后更容易更新.

编辑:而且,我有一个停靠图标以这种方式启动Android Studio:https://superuser.com/a/260712/501568解释如何.