Gradle终于懂了(二)带你认识SourceSet

作者: 键盘上的麒麟臂 | 来源:发表于2019-08-28 09:32 被阅读0次

    上一章内容Gradle终于懂了(一)带你玩转Project发现还是很多人对Gradle比较关注的,弄得我想水几篇文章都不行了。
    这里说一下,如果大家有对哪个方面感兴趣的,可以在评论处留言,我会抽时间去总结这部分内容。好吧,我知道我这水平的文章也没多少人看。

    没看过上一篇的朋友希望能先去了解下第一篇,因为我不想重复说一些知识点,但是我们还是会基于官方文档来说,当然也只是部分内容,如果想知道更多,当然官方文档才是最权威的。

    一.SourceSet

    先说说SourceSet吧,虽然之前也写过文章介绍过浅谈Gradle(二)与SourceSet

    1.带你浏览文档中的SourceSet

    看看官网的文档



    可以看到官网一上来就一个demo,我只能说良心啊,而且这个Demo的质量还是挺高的。
    我再用手敲一次

    sourceSets {
      main {
        java {
          exclude 'some/unwanted/package/**'
        }
      }
    }
    

    从这里看得出什么吗?我们回归到上一篇,可以知道,一起对象的起始是project,所以不管我们写什么内容都离不开project,而project的文档中有这么一行


    在java这个插件中,project还有sourceSets属性,可以找到详情也同样给出一个demo

    而且还提到了SourceSet和SourceDirectorySet,那从这里你就知道SourceSet是什么了吧,SourceSet就是指project的属性sourceSets,当然这样解释不是很好,但是他能给你一种感觉,把SourceSet和project联系到一起的感觉,sourceSets就是project的一个属性。所有我们能从project的这个地方跟着索引找到SourceSet的文档,也就是我最上面的截图。
    这里多说两句,假如我们看下面文档的这张图,我们有必要去了解这些属性吗

    没必要,因为这些是antlr插件、groovy插件、scala插件,我们用不上,我们用的是java插件或者android插件,等我们用到相应的插件的时候才去看对应的内容。
    点击进去可以看到相关的api,我们开发的时候就对照着api开发就行,如果你想实现某个逻辑功能,先看看api是否有能直接调用的方法,如果没有的话就需要自己去实现,那就比较麻烦了。

    这个图我截不完,如果你此时已经打开了api,可以看到有个java方法

    这就是我们常用的,对照Demo(再多贴一遍)

    java插件的情况下,我们其它的方法也能这样调用,比如我这里写
    sourceSets{
        main{
            println "getClassesTaskName()"+getClassesTaskName()
        }
    }
    

    调用getClassesTaskName方法,从api可以找到它的返回值是String,所以可以直接打印看看



    再随便多找个方法玩玩



    我们这样写
    sourceSets{
        main{
            println "name:"+getName()
            SourceDirectorySet sets = getJava();
            println "sets 长度:"+sets.size()
        }
    }
    

    可以看到结果有打印


    至于这个SourceDirectorySet怎么用,可以点过去看文档,这里就不介绍了。
    PS:注意,我现在所有写的sourceSets都是在android{}外部

    我想很多人可能都不知道sourceSet还有这么多方法,只是用过Java这些方法。但是你如果看得懂文档的话,即便是Java方法,你也可以这么玩
    sourceSets{
        main{
            SourceSet myJava = java{
                // ......
            }
        }
        println "名称:"+myJava.name
    }
    可以看到有打印结果
    

    因为文档中java是返回SourceSet对象,而SourceSet文档我们又能找到它有个name的属性,所以可以直接这样调用。
    文档中的SourceSet就举这些例子吧,我感觉讲得还是挺多了,就算不会用,至少也能有个了解了
    2.Android插件中的sourceSet

    讲完文档,其实还是想说一些我们sourceSet常用的方法。
    这里多补充一点,这点很重要,你看sourceSet的文档中发现



    为什么只有java和resources方法呢,这不太对啊,我们平时至少都是这么写的

        sourceSets{
            main{
                java{
    
                }
                res{
    
                }
                assets{
    
                }
            }
        }
    

    但是api里面没有res方法啊,没有assets方法啊。那是因为我们平时写的这个sourceSet是Android插件的,而官方文档里面的sourceSet是java插件的(上面有说过)。
    但是有有一个比较坑的地方,那就是Gradle官方文档,是没有介绍Android插件的,所以我们就需要去单独找Android插件的文档,才能看到Android插件的sourceSet的api。
    http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.api.AndroidSourceSet.html

    android这边的文档比较简陋,写得就没Gradle的详细,所以第一次看的时候可能会需要花费一些时间。



    可以看到它的java返回的是AndroidSourceDirectorySet,和java返回的对象不同,我们也可以看看这个对象



    看到后我们也可以这样玩
        sourceSets{
            main{
                println java.name
            }
        }
    

    可以看到打印



    这个能看得懂吧,Java返回AndroidSourceDirectorySet对象,AndroidSourceDirectorySet对象里面有name属性,所以java.name就是调用AndroidSourceDirectorySet的name。
    没事,觉得简单我们再举一个稍微复杂那么一些的例子

        sourceSets{
            main{
                Set<File> files = java.sourceFiles.getFiles();
                for (File mfile:files){
                    println "文件名:"+mfile.name
                }
            }
        }
    

    一般没见过这种玩法吧,一般都不会这样玩,我只是想说学会看Api之后,你想怎么玩都可以,看看结果。



    因为我的Demo的文件目录是


    例子讲完了,相信你对SourceSet也有一定了解了,那我们再回顾一下,平时我们的做法是什么?
    看到api



    没错,我们经常用的就是srcDir

    相关文章

      网友评论

        本文标题:Gradle终于懂了(二)带你认识SourceSet

        本文链接:https://www.haomeiwen.com/subject/zrmtectx.html