如何让Gradle完成一个简单的makefile事务

时间:2015-05-18 13:55:05

标签: java android gradle

我的情况是这样的:我有一个项目,它使用一些生成的代码。在生成的代码中,某些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并且空白,因为truefalse似乎没有做到这一点并且都被视为真实。

所以,一旦建筑问题完成,并且其中只有一个似乎正在建造(实际上,但我只得到一条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导入语句。

2 个答案:

答案 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_ {
       }
    }

这导致了适用于项目可用的所有当前构建配置的风格。