我的情况是这样的:我有一个项目,它使用一些生成的代码。在生成的代码中,某些URI在几乎所有文件中都是硬编码的。
所以,在某些时候我得到了两个生成的代码库:一个针对开发,另一个针对STAGING。
我想通过Gradle解决这个问题,就像通过Makefiles一样。
所以,首先我在我的项目的根目录中创建了一个名为SOAP-DEV和SOAP-STAGE的新模块,在gradle.properties中定义了两个名为
的新变量# Make sure only one of these is set to 'true' and *do* set the other one to 'false'. Please.
USE_STAGING_SOAP=
USE_DEVELOPMENT_SOAP=1
我最后使用1并且空白,因为true
和false
似乎没有做到这一点并且都被视为真实。
所以,一旦建筑问题完成,并且其中只有一个似乎正在建造(实际上,但我只得到一条using <dev/stage> soap pack
线,我认为这实际上是正常的,而且正确的是正在建设中。
然后我遇到了另一个障碍 - 似乎我的项目的主要模块 - app
无法查看其文件夹以外的文件,这是有道理的。
现在我尝试使用不同的方法 - 让SOAP-STAGE和SOAP-DEV成为ProjectName/app
而不是ProjectName
的子文件夹,这样#import行实际上可以看到它的来源需要看到正确构建。
然而,这没有发生:/
设置可配置选项的正确方法是什么,只为项目的代码库的一部分设置哪个文件夹,但是项目的#import会在类中看到它们?
我很乐意回到在我的项目中同时使用SOAP文件夹作为模块的旧想法,如果我可以让项目中的类看到相关模块的类,即soap类。
为了更好地说明我尝试做什么,这是我的主要模块的gradle.build文件。我希望你能理解我为此做的事情。
import java.text.SimpleDateFormat
apply plugin: 'com.android.application'
android {
signingConfigs {
hockeyApp {
keyAlias 'myKeyAlias'
keyPassword 'myKeyAliasHA'
storeFile file('../myKeystore.jks')
storePassword 'myKeyAliasHA'
}
}
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.my.application"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName getVersion()
}
buildTypes {
hockeyApp {
signingConfig signingConfigs.hockeyApp
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
android.enforceUniquePackageName=false
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
compile 'com.google.android.gms:play-services:7.0.0'
compile 'com.android.support:recyclerview-v7:21.0.0'
compile 'com.daimajia.swipelayout:library:1.1.9@aar'
compile files('libs/dpdsoaplib.jar')
compile project (':androidNeoReaderSDK')
if(USE_STAGING_SOAP == 1)
{
compile {
source = 'SOAP-STAGE/src/main/java'
}
}
if(USE_DEVELOPMENT_SOAP == 1)
{
compile {
source = 'SOAP-DEV/src/main/java'
}
}
compile "com.android.support:support-v4:21.0.+"
compile 'com.google.maps.android:android-maps-utils:0.3+'
}
def getVersion() {
def Calendar cal = Calendar.getInstance();
def SimpleDateFormat dateFormat = new SimpleDateFormat("MMddHHmmss");
def StringBuilder sb = new StringBuilder("v");
sb.append("0.2");
sb.append(".");
sb.append(dateFormat.format(cal.getTimeInMillis()));
sb.append("a");
return sb.toString();
}
但是,如果我能够将这两个文件夹(SOAP-DEV和SOAP-STAGE)作为源文件夹添加到项目/模块中,我认为这样可以解决无法导入正确类的问题,这只是由从ProjectName / app / src / java文件夹中移动的类到ProjectName / SOAP-DEV / src / java和ProjectName / SOAP-STAGE / src / java文件夹引起的。
这两个文件夹具有相同的包名,并包含同名的类,这些类仅指向不同的soap服务器。
那么,人们,任何想法?我认为这个Gradle应该向android studio引入一些构建系统/ makefile功能,但到目前为止似乎并非如此。
现在我正在尝试介于两者之间 - 在项目的根目录中将这两个文件夹作为模块,但在我的app
模块中可以看到一个或另一个代码&#39 ; s导入语句。
答案 0 :(得分:1)
您最初的想法是在根目录中包含2个模块,并且两个版本的生成代码都是一个良好的开端。现在,gradle不支持使用变量来动态更改应用内容。
这种限制背后的理念是,只需通过查看输入和输出就可以评估执行gradle任务的需要。 (即输入没有改变==&gt;不需要重新执行任务)。
幸运的是,gradle提供了编写灵活构建的替代方法:
您可以使用口味(即同一产品的变体)。
定义2种口味:
android {
...
productFlavors {
dev{}
staging{}
}
}
dependencies {
devCompile project(':SOAP-DEV')
stagingCompile project(':SOAP-STAGE')
...
}
请注意,依赖项中的前缀恰好是flavor的名称。
这将产生2个apks:MyApp-dev.apk和MyApp-staging.apk
答案 1 :(得分:0)
所以,答案(最后)归结为:
结构稍有改动,并在主要模块中添加了两个新的子文件夹&#34; (主模块= app)级别。
ProjectRoot/app/src/main/my/package/name/...
ProjectRoot/app/src/soap_dev/my/package/name/...
ProjectRoot/app/src/soap_stage/my/package/name/...
然后,生成的代码从
移开ProjectRoot/app/src/main/my/package/name/backend/soap/generated
到
ProjectRoot/app/src/SOAP_DEV_/my/package/name/backend/soap/generated
ProjectRoot/app/src/SOAP_STAGE_/my/package/name/backend/soap/generated
在模块&#34; app&#34;
中制作了两种新的构建口味 productFlavors {
SOAP_DEV_ {
}
SOAP_STAGE_ {
}
}
这导致了适用于项目可用的所有当前构建配置的风格。