• Gradle的构建


    Gradle的构建

    来源 https://zhuanlan.zhihu.com/p/26382678

    Gradle是一款使用Kotlin(划掉)Groovy编写的JVM构建工具,其易用性和Maven接近,而由于它描述逻辑采用的是DSL而不是辣眼睛的xml, 股沟也钦定他作为Android的指定构建工具。

    关于Gradle

    由于Gradle的构建过程高度依赖网络,因此身在中国,在中国长城局域网的保护下的各位网络条件是很不好的。

    这就导致,明明一个贼好用的构建工具,把绝大多数的开发者都给坑惨了。

    我作为一个在2017年1月对Gradle黑转粉的Gradle用户,在这里向同学们传授中国Gradle的正确使用方式。

    其实写这篇博客我是很犹豫的,因为我在知乎已经看到过有人描述过我想写的东西了,但是写的很粗略,所以我决定再写一次。

    现在的问题就是,很多人没有VPN。这就导致你不能用Proxifier这种工具实现全局翻墙, 而像开灯这种行为又不能大幅影响命令行(作为一个有梯子的人,我是不清楚的,但是在我没有梯子的时候,那叫一个痛苦)。

    而他们面临着写Android项目的任务,想必很多人都体会过“只能在Android Studio里面构建, 切到命令行之后gradlew build之后不知道它在下什么东西,反正就是不行”的感受。

    其实呀,你们只是不知道AS在build的过程中,使用了自己夹带的gradle。我们现在要拒绝夹带私货,走向自由。

    简要介绍

    首先我说明一下一个最普通的gradle项目的目录结构:

    root:
      gradle:
        wrapper:
          - gradle-wrapper.properties
          - gradle-wrapper.jar
      - build.gradle
      - settings.gradle
      - gradlew.bat
      - gradlew

    这6个文件缺一不可,一般使用Android Studio新建gradle项目的时候会给你弄齐。

    其中:

    gradle-wrapper.properties——用于指定gradle版本号

    gradle-wrapper.jar——和上面那个配套

    build.gradle——构建脚本,写编译的逻辑,依赖,各种你能想到的配置

    settings.gradle——指定工程名

    gradlew.bat——Windows下命令行构建时用的,一般不动它

    gradlew——*nix下命令行构建时用的,一般不动它

    后两个文件随便找个Gradle项目(到处都是,不行也可以拿AS新建一个项目,自动加入)照抄即可,所以说我们要管的其实就四个文件。

    settings.gradle

    一般情况下,settings.gradle里面就这个东西:

    rootProject.name = 'lice'
    

    就是指定项目名称的,gradlew build生成的jar包就是[项目名称].jar。

    gradle-wrapper.properties

    这个文件一般的内容就是:

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https://services.gradle.org/distributions/gradle-[版本]-bin.zip
    

    其实也只有一行需要注意,就是最后一行里面的版本。本文采用的gradle版本是3.0,也就是说最后一行是:

    distributionUrl=https://services.gradle.org/distributions/gradle-3.0-bin.zip
    

    早期AS默认的是2.1X,我是不推荐的,已经过时很久啦。 根据评论区提醒,AS 2.3已经将gradle升级到了3.3。(知乎编辑器反应太慢了,根本艾特不出来,此处手动艾特 啊鱼 同学)

    不过本文的教程适用于任何版本哦。

    gradle-wrapper.jar

    这个jar和上面的properties文件是配套的。

    说一下以上两个文件的一般的获取方式(一般不直接写,而是找到现成的):

    在GitHub上随便找个使用这个版本的Gradle的仓库,然后download zip,把它使用的这俩文件拿出来。

    还有一个方法,就是

    gradlew wrapper --gradle-version=3.5

    这里顺便提供一个3.0版本的gradle wrapper的下载, 里面包含了properties文件和jar文件。

    所以说现在只有build.gradle需要注意了。这也是全文的重点。

    如何配置build.gradle

    其实很简单,举个例子你们就民白了。

    给一个项目加上gradle支持

    一般情况下,Gradle默认的项目结构是:

    root:
      build:
        - 编译输出
      src:
        main:
          java:
            - 代码的包
          kotlin:
            - Kotlin代码的包
        test:
          java:
            - 测试代码的包
          kotlin:
            - Kotlin测试代码的包
      gradle:
        wrapper:
          - gradle-wrapper.properties
          - gradle-wrapper.jar
      - build.gradle
      - settings.gradle
      - gradlew
      - gradlew.bat

    但是我们先不管,毕竟我要带你入坑,所以说我们要把一个原本不是这样目录结构的项目引入Gradle支持!

    我们现在需要把这样一个项目加上gradle支持:

    root:
      demo:
        - demo代码的包
      src:
        - 下面就是Java的package了,比如org/frice/dsl什么的
      test:
        - 测试代码的包

    很明显,这是个极其非主流的项目,它不符合Gradle的默认要求。

    这其实就是我的一个个人项目,为了简化教程,我把其中的一个子项目的构建给省略了。

    现在我们先给他加上一些必须的文件(就是前面提到的除了build.gradle之外的)

    root:
      gradle:
        wrapper:
          - gradle-wrapper.properties
          - gradle-wrapper.jar
      demo:
        - demo代码的包
      src:
        - 下面就是Java的package了,比如org/frice/dsl什么的
      test:
        - 测试代码的包
      - settings.gradle
      - gradlew
      - gradlew.bat

    然后我们给他加上一个build.gradle。首先你要确认你的项目的如下信息分别是什么(其实就根据你的情况自己编)。

    这里我给一个表格,并展示我在这个例子中为这些信息带入的值。

    包名——org.frice

    项目名——dsl

    依赖、版本——JUnit 4.12 和JetBrains annotation 15.0

    版本——1.0

    语言——Java

    Java版本——1.6

    源代码目录——/src

    测试代码目录——/test和/demo

    为什么选Java6呢?因为我这个项目其实是2%的Java加98%的Kotlin,那部分Java代码没有用到Java8的新特性, 我就选个兼容性更好的吧。

    关于Kotlin的配置

    这里说下Kotlin的配置(因为我这个项目是Kotlin的),不用Kotlin的同学可以跳过:

    由于Kotlin的编译需要加个Kotlin编译器插件和一些库,所以需要一些额外配置:

    Kotlin版本——1.1.1

    编写build.gradle

    首先我们根据如下模板填写我们的信息:

    group '[包名]'
    version '[版本]'
    
    buildscript {
      repositories {
        mavenCentral()
      }
    }
    
    apply plugin: 'java'
    
    sourceCompatibility = [语言版本]
    targetCompatibility = [语言版本]
    
    repositories {
      mavenCentral()
    }
    
    sourceSets {
      main.java.srcDirs += '[源代码目录]'
      test.java.srcDirs += '[测试代码目录]'
    }
    
    dependencies {
      compile group: '[依赖的包名]', name: '[依赖的名称]', version: '[依赖版本]'
      testCompile group: '[测试代码依赖的包名]', name: '[测试代码依赖的名称]', version: '[版本]'
    }
    

    和Kotlin有关的信息

    如果需要Kotlin支持,需要添加如下额外信息:

    buildscript {
      ext.kotlin_version = '[Kotlin版本]'
      dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
      }
    }
    
    apply plugin: 'kotlin'
    
    sourceSets {
      main.kotlin.srcDirs += '[Kotlin源码目录]'
      test.kotlin.srcDirs += '[Kotlin源码目录]'
    }
    
    dependencies {
      compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
      testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    }
    

    引入来自JitPack的依赖

    JitPack是一个免费的远端仓库,我们如果需要引入这个仓库的包的话,需要再加一句:

    allprojects {
      repositories {
        maven { url 'https://jitpack.io' }
      }
    }
    

    最后的结果

    根据我们此处的信息(再合并Kotlin、JitPack相关的依赖),应该这样填入:

    group 'org.frice'
    version '1.0'
    
    allprojects {
      repositories {
        maven { url 'https://jitpack.io' }
      }
    }
    
    buildscript {
      ext.kotlin_version = '1.1.1'
      repositories {
        mavenCentral()
      }
      dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
      }
    }
    
    apply plugin: 'java'
    apply plugin: 'kotlin'
    
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
    
    repositories {
      mavenCentral()
    }
    
    sourceSets {
      main.kotlin.srcDirs += 'src'
      main.java.srcDirs += 'src'
      test.kotlin.srcDirs += 'test'
      test.java.srcDirs += 'test'
      test.kotlin.srcDirs += 'demo'
      test.java.srcDirs += 'demo'
    }
    
    dependencies {
      compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
      compile group: 'org.jetbrains', name: 'annotations', version: '15.0'
    
      testCompile group: 'junit', name: 'junit', version: '4.12'
      testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    }
    

    尝试命令行构建

    然后我们在命令行运行(请一定要进行一次尝试!):

    • *nix:
    chmod a+x gradlew
    
    • Windows:
    ./gradlew build
    

    然后你会发现它开始下载gradle的本体了。。。我们身处中国长城局域网,下载这个速度是极慢的。

    Ctrl+C,把它停下吧。

    你可能已经意识到了,接下来我们要解决一个巨大的问题,就是下载包的问题。

    下载Gradle本体

    我们现在把灯打开(脑补丑八怪歌词),然后登陆Gradle官网找到下载页面 下载对应版本的Gradle(或者你也可以从一些国内网站下载,比如CSDN)。

    我们现在使用的是gradle 3.0(如果你是从我给的那个链接下载的Gradle wrapper的话),于是我们需要下载 这个

    上面那个链接直接点就好了。

    下载好后,放进这个目录:

    • Windows

    C:/Users/[用户名]/.gradle/wrapper/dists/gradle-3.0-bin/2z3tfybitalx2py5dr8rf2mti/

    • *nix

    /home/[计算机名]/.gradle/wrapper/distsgradle-3.0-bin/2z3tfybitalx2py5dr8rf2mti/

    这个诡异的路径会被自动创建,你只要执行一次gradlew build它就会自动创建。因此我建议大家让它自己创建,免得打错。

    然后重新回到刚才的项目目录,执行刚才说过的指令,会看到它没有在下载了,而是开始unzip我们刚才下载的

    然后你就等编译吧,我自己的编译结果是这样的(为了模拟第一次配置(就是刚手动下载完gradle), 我还特地删除了我本地已经解压好的包(但是我已经提前下载好Kotlin的Gradle插件了,这个也比较大,各位Kotlin猿请耐心等待!)):

    编译环境: Windows10 专业版

    D:git-reposFriceEngine-DSL>gradlew build
    Unzipping C:Usersice1000.gradlewrapperdistsgradle-3.0-bin2z3tfybitalx2py5dr8rf2mtigradle-3.0-bin.zip to C:Usersice1000.gradlewrapperdistsgradle-3.0-bin2z3tfybitalx2py5dr8rf2mti
    Starting a Gradle Daemon, 17 busy and 3 incompatible and 4 stopped Daemons could not be reused, use --status for details
    :compileKotlin UP-TO-DATE
    :compileJava UP-TO-DATE
    :copyMainKotlinClasses UP-TO-DATE
    :processResources UP-TO-DATE
    :classes UP-TO-DATE
    :jar UP-TO-DATE
    :assemble UP-TO-DATE
    :compileTestKotlin
    Using kotlin incremental compilation
    w: The '-d' option with a directory destination is ignored because '-module' is specified
    :compileTestJava UP-TO-DATE
    :copyTestKotlinClasses
    :processTestResources UP-TO-DATE
    :testClasses UP-TO-DATE
    :test
    :check
    :build
    
    BUILD SUCCESSFUL
    
    Total time: 40.232 secs
    

    编译报错的话,检查一下是不是你的代码本身就是错的。一切问题/希望看到的教程均可反馈,我会在新文章中继续讲解,或者修改旧文章。

    Enjoy Gradle!

    ================ End

  • 相关阅读:
    iOS: ARC和非ARC下使用Block属性的问题
    HTTP POST GET 本质区别详解
    php输出json,需要嵌套数组和对象问题
    正则验证在线生成代码
    笔记
    按钮删除
    sudo dpkg-reconfigure phpmyadmin命令,重新配置一遍phpmyadmin
    Ubuntu 16.04 安装 Apache, MySQL, PHP7
    ubuntu18.04安装chrome浏览器
    初三知识点
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/12624392.html
Copyright © 2020-2023  润新知