就像ChrLipp所说,在最前沿的 Android Studio 上,有一个方便的解决方案,称为“风味”。
它基于镜像目录层次结构。“主”目录层次结构包含“主”构建的所有文件和“风味”目录层次结构,每个风味目录包含将在构建时覆盖或补充那些“主”文件的文件。
为了我的使用(我无法迁移到 Android Studio),我编写了一个简单的 ant 脚本来模仿“ flavors ”功能。它适用于 Netbeans 和 Eclipse,我认为它与项目无关。
要使用它,整个项目文件夹必须退后一级层次结构,原始文件夹需要放在“主”目录中。必须创建一个构建目录,并将多个“flavors”文件夹放在“flavors”中,如下所示:
├── build.xml < - ant script file above
├── main < - original project
├── flavors
│ └── freeVersion < - files related with a freeVersion 'skin'
└── build < - temporary build folder
运行脚本($ ant change-flavor),它会询问你想要构建的witch flavor 目录。用户输入后,它检查风味目录是否存在,并将所有主目录复制到构建文件夹中,加上最终的“风味”文件,覆盖“主”文件。
生成的 build 文件夹是一个全新的原生 Android/Cordova/whatever 项目,可以通过 IDE 正常打开和编译。
<?xml version="1.0" encoding="UTF-8"?>
<project name="Flavors" basedir="." >
<property name="flavors.dir" value="flavors"/>
<property name="flavors.build.dir" value="build"/>
<property name="flavors.main.dir" value="main"/>
<target name="change-flavor">
<input message="Which Flavor to build?" addproperty="flavor.dir" />
<fail message="Empty flavor not allowed">
<condition>
<equals arg1="${flavor.dir}" arg2=""/>
</condition>
</fail>
<fail message="Directory ${flavors.dir}/${flavor.dir} not exists">
<condition>
<not>
<available file="${flavors.dir}/${flavor.dir}" type="dir" />
</not>
</condition>
</fail>
<echo message="Deleting build dir ${flavors.build.dir}"/>
<delete includeemptydirs="true">
<fileset dir="${flavors.build.dir}" includes="**/*"/>
</delete>
<echo message="Copying from main ${flavors.build.dir}"/>
<copy todir="${flavors.build.dir}" includeemptydirs="true" >
<fileset dir="${flavors.main.dir}" includes="**"/>
</copy>
<echo message="Copying from flavor ${flavors.build.dir}"/>
<copy todir="${flavors.build.dir}" includeemptydirs="true" overwrite="true" >
<!-- exclude folder is here because my flavors directories are also netbeans
projects. If similar approach is used on eclipse, maybe put here .project
and .settings folders -->
<fileset dir="${flavors.dir}/${flavor.dir}" includes="**" excludes="nbproject/**"/>
</copy>
</target>
</project>
每个风味构建都有一个惩罚时间,因为没有预编译的东西,也没有很好地集成到主项目构建系统中,但就我而言,我认为它是值得的,因为从一种风味到另一种风味的唯一变化是属性文件和资产。大多数开发过程都可以在“主要”项目上完成,口味只是皮肤。除此之外,它避免了对 cordova 自己的构建系统/netbeans 集成的介绍。