成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

推薦 9 個 Gradle 優秀實踐,進階必備!

開發 前端
包裝器是項目中包含的特殊腳本,用于下載正確的 Gradle 版本并執行構建。

1.使用 Gradle 包裝器

包裝器是項目中包含的特殊腳本,用于下載正確的 Gradle 版本并執行構建。

使用包裝器有 3 大優點:

  1. 不需要在本地安裝 Gradle 來進行構建
  2. 可以始終使用項目支持的 Gradle 版本。
  3. 更新Gradle版本很容易

如果你的項目中當前沒有包裝器,在 Linux 中可以通過運行 ./gradlew <task-name> 來添加,在Windows 中使用 gradlew.bat <task-name>,那么就不會出錯。

2.停止清理項目

如果你每次構建時都執行清理,那么會造成極大的時間浪費,如下:

./gradlew clean build

Gradle 有一個很的強功能,稱為增量構建,意味著如果更改項目中的某些內容并運行構建,它只會根據該更改運行必要的任務。例如,如果只修改測試類,Gradle 不需要重新編譯生產代碼。增量構建意味著微小的更改構建速度會非???,從而幫助開發人員完成更多工作。

3.添加settings.gradle

settings.gradle文件通常位于項目的根目錄中,用于指定項目名稱以及要添加到構建中的子項目。

示例:

rootProject.name = 'settings-example'

include 'some-subproject'

不過,settings.gradle是可選的。

如果缺省該文件,Gradle 將會使用基于目錄名稱的項目名稱,如果項目被克隆到不同名稱的目錄,則其項目名稱將不正確。例如,這可能發生在 CI 服務器上。

還有性能影響。如果省略settings.gradle,Gradle 會遞歸地在目錄樹中向上導航以查找此類文件。這可能會產生大量不必要的文件讀取。

4. 將任務移至buildSrc

buildSrc目錄位于項目的根目錄中,可以包含 Groovy、Kotlin 或 Java 源代碼。如果build.gradle中有一些任務代碼,則可以轉移到buildSrc,原因有 3 個:

  • 清理build.gradle,使其更容易理解
  • 將任務實現與聲明分開
  • 對于多項目構建,任務可以在其他子項目中使用

例如下面這個不太友好的 build.gradle 示例:

abstract class RollercoasterTask extends DefaultTask {
    @Input
    abstract Property<String> getFavouriteCoaster()

    RollercoasterTask() {
        favouriteCoaster.convention('Space mountain')
    }

    @TaskAction
    def tellMeMyFavourite() {
        println "Your favourite coaster is ${favouriteCoaster.get()}!"
    }
}

tasks.register('coaster', RollercoasterTask) {
    favouriteCoaster = 'Super-duper loopy coaster'
}

隨著build.gradle 的增長,這種代碼會讓你頭暈目眩。解決辦法就是在與build.gradle相同的級別創建buildSrc目錄,結構如下:

├── build.gradle
├── buildSrc
│   └── src
│       └── main
│           └── groovy
│               └── com
│                   └── tomgregory
│                       └── RollercoasterTask.groovy

可以將類定義從build.gradle轉移到RollercoasterTask.groovy中。只需包含相關的package和import 即可。如下:

package com.tomgregory

import org.gradle.api.DefaultTask
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction

abstract class RollercoasterTask extends DefaultTask {
    @Input
    abstract Property<String> getFavouriteCoaster()

    RollercoasterTask() {
        favouriteCoaster.convention('Space mountain')
    }

    @TaskAction
    def tellMeMyFavourite() {
        println "Your favourite coaster is ${favouriteCoaster.get()}!"
    }
}

在build.gradle中,可以用單個 import 語句替換類定義。

import com.tomgregory.RollercoasterTask

tasks.register('coaster', RollercoasterTask) {
    favouriteCoaster = 'Super-duper loopy coaster'
}

這樣就清晰多了。

5. 并行運行測試

可以充分利用可用的 CPU 內核來并行運行測試,build.gradle 添加如下配置:

test {
    maxParallelForks 3
}

完成此操作后,Gradle 將會并行執行測試。這里配置了3個執行器,可根據實際配置此參數。

6. 項目進行版本化

對 Gradle 項目進行版本控制可以讓你更輕松地了解何時引入了更改。當其他人使用你的項目時,這一點尤其重要。

例如,Gradle 本身使用相當標準的版本號系統,其中包括主版本、次版本和補丁版本。

這樣做的好處是 Gradle 用戶,在升級 Gradle 時可以輕松了解更改的范圍。當主要版本增加時,這表明可能會有重大更改,我們應該閱讀發行說明。

在 Gradle 中,設置版本號是在build.gradle中完成的,如下所示:

version = '0.1.0'

7. 將任務聲明封裝在插件中

任務聲明是創建某個任務類的實例時,通常配置一些任務屬性。

如下創建了一個名為copyQuote的 Copy 任務:

project.tasks.register('copyQuote', Copy) {
    from 'quote.txt'
    into "$project.buildDir/quotes"
    filter(ReplaceTokens, tokens: [CHARACTER: 'Tweedledee'])
}

事實上,在build.gradle中聲明此任務可能會導致幾個問題:

  • 額外的代碼使得從高層次理解build.gradle變得更加困難
  • 如果在不同的子項目中聲明類似的任務,可能會出現重復

解決方案是將邏輯移至插件中,如果只需要在自己的項目(而不是其他項目)中使用該插件,則可以在buildSrc目錄中定義它。

.
├── build.gradle
├── buildSrc
│   └── src
│       └── main
│           ├── groovy
│           │   └── com
│           │       └── tomgregory
│           │           ├── WonderlandPlugin.groovy

將copyQuote任務移動到插件類中,代碼如下:

package com.tomgregory

import org.apache.tools.ant.filters.ReplaceTokens
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.Copy

class WonderlandPlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('wonderland', WonderlandPluginExtension)

        project.tasks.register('copyQuote', Copy) {
            from 'quote.txt'
            into "$project.buildDir/quotes"
            filter(ReplaceTokens, tokens: [CHARACTER: extension.characterName.get()])
        }
    }
}

現在build.gradle可以大大簡化。

plugins {
    id 'wonderland'
}

wonderland {
    characterName = 'Tweedledee'
}

8. 優化存儲庫

在build.gradle中聲明存儲庫告訴 Gradle 應該在哪里查找構建應用程序所需的依賴項。

例如,在這里我們告訴 Gradle 查看我的自定義本地 Maven 存儲庫和 Maven Central。

repositories {
    maven {
        name = 'tomRepo'
        url 'http://localhost:8081/repository/snapshots'
        allowInsecureProtocol true
        credentials(PasswordCredentials)
    }
    mavenCentral()
}

假設同一個項目需要這些依賴項來構建 Java 應用程序。

dependencies {
    implementation group: 'com.tom', name: 'artifact-to-publish', version: '1.0-SNAPSHOT'
    implementation 'commons-lang:commons-lang:2.6'
    implementation 'com.google.guava:guava:30.1.1-jre'
    implementation 'org.mapstruct:mapstruct:1.4.2.Final'
    implementation 'org.hibernate:hibernate-validator:7.0.1.Final'
}

第一個依賴項來自本地 Maven 存儲庫,但其他依賴項可在 Maven Central 中找到。

9. 切勿提交密碼

你是否曾經將密碼提交到版本控制中然后遭受領導的鄙夷,或者被安全公司審查出安全問題。接下來我們將介紹如何避免。

不過,這已經成為過去,因為 Gradle 提供了許多我們可以將憑證移出項目的方法。

示例:

repositories {
    maven {
        name = 'tomsRepo'
        url 'https://xxx.com/maven/demo/'
        credentials(PasswordCredentials)
    }
}

那么 Gradle 將自動查找屬性<repositoryName>Username和<repositoryName>Password.

你可以在命令行上傳遞這些參數或在~/.gradle/gradle.properties中設置,如下:

// gradle.properties 中配置
tomsRepoUsername=myusername
tomsRepoPassword=mypassword

另一種方法是直接訪問 Gradle 屬性:

repositories {
    maven {
        url 'https://xxx.com/maven/demo/'
        credentials {
            username 'toms'
            password property('mypw')
        }
    }
}

在命令行或~/.gradle/gradle.properties中傳遞密碼。

命令行示例:

./gradlew build --refresh-dependencies -Pmypw=<password>


~/.gradle/gradle.properties示例:

mypw=mypassword


責任編輯:華軒 來源: 今日頭條
相關推薦

2020-07-06 13:30:31

前端開發技術

2021-04-21 11:12:09

CIO大數據數據驅動

2022-05-23 09:20:00

數據庫架構

2021-03-25 08:00:00

首席信息官IT技術

2011-08-04 13:58:45

JavaScript

2020-06-24 07:47:16

Linux工具版本

2023-07-03 12:09:38

云日志云服務

2023-10-10 10:57:12

JavaScript代碼優化

2021-06-25 14:50:21

DevSecOps安全 DevOps

2022-11-28 23:48:06

JavaScript編程語言技巧

2020-10-27 06:56:53

IoT產品實踐

2019-11-05 17:10:19

Java開發編程語言

2025-04-03 11:25:39

2025-03-31 00:00:02

2023-05-16 08:47:39

2022-02-28 15:56:14

零信任企業

2020-11-24 10:32:16

CIO首席信息官工具

2022-10-10 14:53:00

云安全云計算云平臺

2022-12-26 07:52:33

DockerfileFROM命令

2021-05-26 08:50:37

JavaScript代碼重構函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日爽 | 国产伦精品一区二区三区高清 | 国产精品久久久久久久免费观看 | 国产精品久久午夜夜伦鲁鲁 | 国产欧美精品一区二区三区 | av免费成人 | www.国产视频 | av黄色国产| 伊人久久综合 | 亚洲高清在线观看 | 国产99久久精品一区二区永久免费 | 成人国产在线视频 | 久久99精品久久久久久青青日本 | 欧美一区二区三区大片 | 91性高湖久久久久久久久_久久99 | 高清一区二区三区 | 91综合在线视频 | 一区二区视频在线观看 | 91在线视频免费观看 | 中文视频在线 | 在线观看中文视频 | 99精品久久久 | 成人福利网站 | 草久久久 | 九九在线视频 | 福利视频三区 | 啪啪精品 | 日韩精品区 | 2019天天操| 亚洲欧美日韩在线 | 国产成人精品一区二区三区四区 | 欧美a在线 | 国产伦一区二区三区 | 亚洲精品国产综合区久久久久久久 | 久久久久国产精品人 | 91精品国产91久久久久久三级 | 亚洲啊v在线 | 一级毛片色一级 | 福利视频一区二区 | 在线看日韩 | 国产激情一区二区三区 |