Gradle排除依赖模块的某个类
好久没写⽂章了,开⼯第⼀天来⼀发开门红。既然没什么可写的,就简单聊聊Gradlew吧,是Gradle,命令敲多了习惯加个w,开个⼩玩笑。gradle⽤来构建项⽬可谓是⼗分的灵活,刚开始接触也许觉得有点懵,觉得这个东西就是多余的,但是⽤多了就真的会爱上它。
我之前做组件化的时候就碰到锅这样⼀个问题,怎么排除某个类
Gradle怎么排除所依赖的模块的某各类
千里难寻
其实我觉得在很多的情况下都会碰到这个问题,⽐如你的⽼⼤写了个BaModule,⾥⾯有很多东西,你就没必要造轮⼦了,但是其实你这个项⽬中⽤不到这么多,那就没必要在打包的时候也把多余的代码打进去,但是你⼜不能删掉,因为很多个模块都依赖这个Ba模块,所以你只能⽤“排除”的⽅法来去掉多余的代码。再⽐如你⾃⼰的模块和所依赖的模块有同名类,包名都相同的那种,那就肯定编译不过,所以你要排除相同类。甚⾄还有很多情况需要你在依赖中排除某个类或者某个包。
那么该怎么做?
只要稍微⽤过gradle构建项⽬的都知道,如果我们在依赖时出现了相同的jar包,我们是可以排除的
implementation fileTree(include: ['*.jar'], dir: '../balabala/balabala', exclude: ['重复包1.jar', '重复包2.jar'])
这样确实能排除某个jar包来达到解决jar包重复的问题,但是⽤这种⽅法你能排除到某个类吗?不能。
⽐如⼀般新⼿写依赖module都会这样写
implementation project(':testModule')
然后你想排除这个模块中的Test.java 这个⽂件,你能这样写吗?
implementation project(':testModule',exclude:['Test.java'])
或者完成英语怎么说
implementation project(':testModule'){
exclude :'Test.java'
}
这样写肯定不⾏,可能闭包的写法写错了,我也不太记得这个的闭包怎么弄来着,好像是女生乳液
七日瘦身瑜伽
implementation(project(':testModule')) {
exclude group: 'Test.java', module: 'testModule'
}
还是这个来着
implementation(project(':testModule'){
exclude group: 'Test.java', module: 'testModule'
})
但是这样的做法能排除掉掉这个Test.java吗?我试过是不⾏的,如果有朋友能⽤这种⽅法排除单个⽂件请告诉我。
既然这种⽅法没办法排除类,那么要怎么做?
⽅案⼀:放弃implementation project,使⽤sourceSets
sourceSets是java插件的东西,他能把代码⽂件导⼊到相应的地⽅,⽆论是绝对路径还是相对路径,我之前有写过⼀篇sourceSets的⽂章,获取⽹上也能找到很多关于sourceSets的⽂章,你把⽬标Modu
le的java、res、lib等引进来,即使不使⽤implementation project的⽅法,也能让这个module能够获取到⽬标module的东西。⽽且使⽤sourceSets的话可以很⽅便的exclude某个⽂件。
但是我觉得这样的⽅法不应该叫做“依赖”,更应该叫做“引⽤”或者“导⼊”。
所以这种⽅法更像是⼀种对⽂件的操作,copy的感觉,所以这种⽅法也就有了不⾜的地⽅,假如你在某种情况下需要引⽤ModuleA,某种情况下引⽤ModuleB,要么你就加个判断,要么就每次都改代码,要是有两个还好说,要是有20⼏个Module呢?我们总不能这样玩吧,就算是能,当你每次在gradle中看到这段代码时,相信你也会⽼阔疼。
⽅案⼆:在⽬标模块就进⾏排除代码
什么意思呢?⽐如说你想要依赖ModuleA,但是⼜想排除某些⽂件,我们可以直接在ModuleA中进⾏排除,意思是你依赖的ModuleA就已经少了你想排除的代码。
这样做的话可以让依赖的那⼀⽅不⽤考虑特殊情况,虽然像上⾯说的情况多的时候也要写挺多代码,但是这些逻辑会很清晰,很容易管理,我个⼈更倾向于使⽤这样的⽅法也排除单个⽂件。哪怕最上⾯说的implementation project时exclude能够实现,我依旧更倾向于在某块本⾝进⾏排除。
但是我们要怎样控制呢,难道每次都要去修改多个gradle⽂件吗?其实在gradle中我们可以使⽤全局
变量。
1.创建⼀个adle写变量
// 配置全局变量
ext{
configOne = [isRealy:true]
}
假设我这样有⼀种情况,叫configOne ,这种情况下isRealy这个值是true,这种情况下我们要在引⽤模块时排除掉某个类。
2.在全局gradle中引⽤adle
怎样跑步不累
apply from: 'adle'
......
我的同学作文300字3.在⽬标gradle中加⼊构建逻辑
假如我的⽬标模块 Moudle->myone中有两个类OneLog、TwoLog,然后我想在A模块依赖时这两个类都有,在B模块依赖时没有TwoLog。
在myone的gradle写
def configOne = figOne
android {
.....
sourceSets{
main{
java{
成长手抄报if(configOne.isRealy) {
exclude 'com/example/kylin/myone/TwoLog.java'
}煮山楂的做法
}
}
}
}
然后我们在A模块引⽤时,把isRealy改成fal,在B模块引⽤时把isRealy改成true这样就⾏了。