TL; DR:根据传递给gradle的参数,更改源的干净方法是什么?
我正在构建一个依赖于库_filterList(code){
let originalList = this.props.choiceOfOpioidsList;
let newList = originalList.filter(function (item,code) {
if(return item.short_name2.toLowerCase() === code){
return item;
}
return false;
});
console.log(newList);
},
的Android应用程序。我希望能够支持多个版本的A
(假设我想同时支持A
和v1
)。我的意思是说我希望能够同时构建v2
和myapp-withAv1.apk
。
我已经看到,在编译时选择所需的myapp-withAv2.apk
的版本很容易(例如,我可以在我的A
文件中的变量中引用该版本,然后启动构建build.gradle
)。
但是另一个困难是./gradlew -PversionOfA=v1 build
可以更改其公共API,因此我需要根据要构建的版本来更改代码。如果我使用C ++或C#(由于A
)会很容易,但是如果没有过多的代码重复,我一直无法找到一种方法来完成这项工作,如果您能指出我的意思,那我会很困惑。一种实现方法。
(请注意,尝试用#ifdef
之类的代码来分隔代码分支是行不通的,因为这将导致代码分支调用if(version == v1)
的方法,该方法不可用,因此构建会失败)
答案 0 :(得分:1)
我遇到了类似的问题,答案是Android中的productFlavors
或通用jar的sourceSets
。基本上,您需要为每个源集中的接口指定一个实现。
# define the interface in the main
/src/main/java/com/me/IMyInterface.java
# create a v1 and v2 sourceset with the implementation, note paths are the same
/src/v1/java/com/me/MyImplementation.java
/src/v2/java/com/me/MyImplementation.java
现在在您的gradle中定义productFlavors
android {
productFlavors {
v1 {
buildConfigField 'string', 'FLAVOR', 'v1'
}
v2 {
buildConfigField 'string', 'FLAVOR', 'v2'
}
}
//...
}
现在,当您引用实现时,您将获得定义为产品风味名称的版本的sourceSet
。
// since the package is the same we are unaware of which we are calling
// now we can treat them as the same regardless of the underlying
// implementation differences between v1/v2
import com.me.MyImplementation;
public String doSomethingWithImplementation() {
MyImplementation impl = new MyImplementation();
// here if we are executing in the productFlavor v1
// apk we get the code from the v1 folder, same for v2 apk
return impl.doSomething()
}
答案 1 :(得分:0)
在2002年为J2ME开发时,我有类似的需求,因此开发了a preprocessor,今天它已经支持maven,gradle和ant,您可以在android上试用它,它是一个测试android项目,可以用作示例can be found in the project repository 对于预处理器,Java sources look like that