在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Gradle自定義插件介紹2

jf_78858299 ? 來源:小余的自習室 ? 作者:小余的自習室 ? 2023-03-30 11:17 ? 次閱讀

步驟4.創建插件實現的任務:上傳版本信息

class UploadTask extends DefaultTask{
    String url = 'http://127.0.0.1/api/v3/upload/version'
    @TaskAction
    void upload(){
        //1.獲取版本信息
        def version = getCurrentVersion()
        //2.發送版本信息
        def response = sendAndReceive(version)
        //3.處理響應:將版本信息以及響應寫入到本地文件中
//        checkResponse(response)

    }
    //1.獲取版本信息
    def getCurrentVersion(){
        def name = project.extensions.versionInfo.versionName
        def code = project.extensions.versionInfo.versionCode
        def info = project.extensions.versionInfo.versionUpdateInfo
        println "name:$name code:$code info:$info"
        return new VersionInfo(versionName: name,
                     versionCode: code,
                     versionUpdateInfo: info)
    }
    //2.發送版本信息
    void sendAndReceive(VersionInfo version){
        OkHttpClient client = new OkHttpClient()
        FormBody body = new FormBody.Builder()
                .add('versionName',version.versionName)
                .add('versionCode',""+version.versionCode)
                .add('versionUpdateInfo',version.versionUpdateInfo)
                .build()
        Request.Builder builder = new Request.Builder()
                .url(url)
                .post(body)

        def call1 = client.newCall(builder.build())
        call1.enqueue(new Callback() {
            @Override
            void onFailure(@NotNull Call call, @NotNull IOException e) {
                println "push version fail:reason:"+e.message
            }

            @Override
            void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                checkResponse(response);
            }
        })
    }
    //3.處理響應:將版本信息以及響應寫入到本地文件中
    void  checkResponse(response){
        println "response:"+new String(response.body().bytes())

    }
}

記住,在需要執行的方法上面添加TaskAction注解:在我們任務執行的時候就會執行到這個方法。

步驟5.將插件擴展和插件任務集成到Project生命周期中

@Override
void apply(Project project) {
    println "begin:now this is a ${project.name} 's upload plugin"
    //1.在插件中引入extensions中的字段,就是我們Project中配置的擴展字段
    project.extensions.create(EXTENSIVE,VersionInfo.class)
    //2.創建待處理的Task
    project.tasks.create(TASK_NAME,UploadTask.class)
    //3.將uploadTask任務掛架到Project的生命周期中
    def build = project.tasks.getByName('clean')
    def uploadTask = project.tasks.getByName(TASK_NAME)
    //這里使用dependsOn強依賴任務關系
    build.dependsOn(uploadTask)
}

步驟6.插件發布

筆者為了測試,將jar包只發布在本地,測試使用。

使用如下方式發布:

gradlePlugin {
    plugins {
        modularPlugin {
                id = 'com.yuhb.upload'
                implementationClass = 'com.yuhb.upload.UploadVersionPlugin'
        }
    }
}

這個配置在build后自動生成resources文件:這個插件擴展配置是引入的:java-gradle-plugin中。

圖片

resources文件自動生成.png

當然也可以直接在resources文件夾中上手動寫入該文件

在插件的build.gradle實現下面的邏輯:

uploadArchives {
    repositories {
            mavenDeployer {
                    repository(url:uri('D:/maven_local'))
                    pom.groupId = 'com.yuhb.upload'
                    pom.artifactId = 'uploader'
                    pom.version = '1.0.0'
            }
    }
}

在命令行執行:

./gradlew :uploadversion:uploadArchives

然后去本地文件夾下面看看是否上傳成功:

圖片

本地文件成功.png

這里要說明下:

一般情況下都會將自定義插件發布到maven私服或者中央倉庫,才可以供其他項目使用

關于如何發布到maven私服,可以查看這篇文章

后期也會出一期文章教大家如何將數據發布到中央倉庫

步驟7.插件引入

  • 步驟1 :在工程的根build.gradle文件中引入:
buildscript {
        repositories {
                ...
                maven {
                        url uri('D:/maven_local')
                }
        }
        dependencies {
                ...
                classpath 'com.yuhb.upload:upload:1.0.0'
        }
}

說明:

com.yuhb.upload:uploader:1.0.0格式:

引入字段 發布字段
com.yuhb.upload pom.groupId
uploader pom.artifactId
1.0.0 pom.version
  • 步驟2 :在子Project中引入插件:
apply plugin: 'com.yuhb.upload'
  • 步驟3 :配置extensive插件擴展:
versionInfo {
    versionName = '1.0.0'
    versionCode = 1
    versionUpdateInfo = '當前是第一個版本:初始apk'
}

這個versionInfo擴展是怎么來的呢?

我們看下之前我們配置插件的時候,使用了:

EXTENSIVE = 'versionInfo'
project.extensions.create(EXTENSIVE,VersionInfo.class)

在插件中引入extensions中的字段,就是我們Project中配置的擴展字段:

versionInfo {
    versionName = '1.0.0'
    versionCode = 1
    versionUpdateInfo = '當前是第一個版本:初始apk'
}

就是這里,如果外部配置了versionInfo的擴展字段,就會通過project.extensions獲取到,并將數據寫入project.extensionsversionInfo屬性中:之后就可以使用project.extensionsversionInfo屬性訪問外部傳入的配置數據:

def name = project.extensions.versionInfo.versionName
def code = project.extensions.versionInfo.versionCode
def info = project.extensions.versionInfo.versionUpdateInfo
  • 步驟4 :運行rootbuild 任務查看編譯信息:
./gradlew build
結果:
> Task :app:uploadTask
name:1.0.0 code:1 info:當前是第一個版本:初始apk

這里運行build可以執行插件中的任務是因為前面筆者將插件Task掛接到了build任務之前:

掛接代碼

//3.將uploadTask任務掛架到Project的生命周期中
def build = project.tasks.getByName('build')
def uploadTask = project.tasks.getByName(TASK_NAME)
//這里使用dependsOn強依賴任務關系
build.dependsOn(uploadTask)

項目Demo完整代碼已經上傳Github:

https://github.com/ByteYuhb/a_gradle_plugin_sample

5.總結

本文主要針對我們自定義插件定義以及優勢做了一些說明,且使用一個實戰項目對自定義插件制作,發布,引入流程做了一個詳細的講解

,Gradle插件部分還有Gradle的上傳流程和AGP插件講解沒有講,后面都會陸續推出。

參考資料

  • Gradle自定義插件

    _官網文檔

  • Using Gradle Plugins _ Gradle 官方文檔

  • Gradle 系列(2)手把手帶你自定義 Gradle 插件_胡飛洋

好了,本文就講解到這里了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • project
    +關注

    關注

    0

    文章

    35

    瀏覽量

    13298
  • 插件
    +關注

    關注

    0

    文章

    327

    瀏覽量

    22442
  • gradle
    +關注

    關注

    0

    文章

    26

    瀏覽量

    717
收藏 人收藏

    評論

    相關推薦

    1602自定義字符

    1602液晶能夠顯示自定義字符,能夠根據讀者的具體情況顯示自定義字符。
    發表于 01-20 15:43 ?1次下載

    EDK中PS2自定義IP

    Xilinx FPGA工程例子源碼:EDK中PS2自定義IP
    發表于 06-07 11:44 ?4次下載

    占位面積很小的自定義進度指示器progressbutton

    概述 1、描述:progressbutton是占位面積很小的自定義進度指示器。默認實現提供了一個pin進度按鈕。 2、實現功能: a.自定義圓形進度條。 b.實現根據Slider滑動更新自定義
    發表于 03-18 14:45 ?3次下載

    自定義進度指示器progressbutton

    概述 1、描述:progressbutton是占位面積很小的自定義進度指示器。默認實現提供了一個pin進度按鈕。 2、實現功能:a.自定義圓形進度條。 b.實現根據Slider滑動更新自定義
    發表于 03-24 14:26 ?1次下載

    基于openharmony適配移植的自定義文本視圖

    項目介紹 項目名稱: ReadMoreTextView 所屬系列: openharmony的第三方組件適配移植 功能: 帶有修剪文本的自定義文本視圖 項目移植狀態: 給特定文字設置點擊事件功能未實現
    發表于 03-28 11:03 ?1次下載

    自定義視圖組件教程案例

    自定義組件 1.自定義組件-particles(粒子效果) 2.自定義組件- pulse(脈沖button效果) 3.自定義組件-progr
    發表于 04-08 10:48 ?14次下載

    ArkUI如何自定義彈窗(eTS)

    自定義彈窗其實也是比較簡單的,通過CustomDialogController類就可以顯示自定義彈窗。
    的頭像 發表于 08-31 08:24 ?2201次閱讀

    教程 2自定義配置文件示例

    教程 2自定義配置文件示例
    發表于 03-13 19:33 ?0次下載
    教程 <b class='flag-5'>2</b>:<b class='flag-5'>自定義</b>配置文件示例

    教程 2:添加特征-自定義配置文件創建

    教程 2:添加特征 - 自定義配置文件創建
    發表于 03-15 19:39 ?0次下載
    教程 <b class='flag-5'>2</b>:添加特征-<b class='flag-5'>自定義</b>配置文件創建

    Gradle自定義插件介紹1

    首先來講下`Gradle`和`Gradle插件`有啥區別? > `Gradle`是一套構建工具,其內部構建過程主要是以`Project`組成一個樹形的生態系統,整個構建流程有自己
    的頭像 發表于 03-30 11:17 ?899次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>自定義</b><b class='flag-5'>插件</b><b class='flag-5'>介紹</b>1

    labview自定義控件

    labview自定義精美控件
    發表于 05-15 16:46 ?17次下載

    自定義算子開發

    一個完整的自定義算子應用過程包括注冊算子、算子實現、含自定義算子模型轉換和運行含自定義op模型四個階段。在大多數情況下,您的模型應該可以通過使用hb_mapper工具完成轉換并順利部署到地平線芯片上……
    的頭像 發表于 04-07 16:11 ?2811次閱讀
    <b class='flag-5'>自定義</b>算子開發

    教程 2自定義配置文件示例

    教程 2自定義配置文件示例
    發表于 07-04 20:50 ?1次下載
    教程 <b class='flag-5'>2</b>:<b class='flag-5'>自定義</b>配置文件示例

    教程 2:添加特征-自定義配置文件創建

    教程 2:添加特征 - 自定義配置文件創建
    發表于 07-06 18:50 ?0次下載
    教程 <b class='flag-5'>2</b>:添加特征-<b class='flag-5'>自定義</b>配置文件創建

    labview超快自定義控件制作和普通自定義控件制作

    labview超快自定義控件制作和普通自定義控件制作
    發表于 08-21 10:32 ?13次下載
    主站蜘蛛池模板: 亚洲人成在线精品不卡网| 欧美ol丝袜高跟秘书在线观看| 日本一本高清视频| 国产精品好好热在线观看| 欧美xxxx做受欧美88bbw| 亚洲人成a在线网站| 性视频亚洲| 亚洲综合春色另类久久| 日本亚洲天堂网| 黄色美女网站免费| 天天综合天天操| 222aaa天堂| 足控免费视频xxav| 三级五月天| 国产精品亚洲玖玖玖在线靠爱| 天天做天天爱夜夜爽毛片毛片| 91亚洲国产成人久久精品网站| 亚洲天堂电影在线观看| 国产视频三区| 可以免费看黄的网址| 中文字幕123| 特级做a爰片毛片免费看一区| 玖玖国产| 天天草综合网| 亚洲日本一区二区三区在线不卡| 午夜性影院| 国产亚洲高清在线精品不卡| 成人午夜网站| 一级做a爰片久久毛片毛片| 欧美在线一区二区三区| 在线天堂在线| 手机看片神马午夜片| 亚洲爽爽网站| 一级特黄aaa大片| 好硬好湿好爽再深一点h视频| 一级特黄aa毛片免费观看| 国产成人优优影院| 51午夜| 日本国产视频| 天天摸天天操天天射| 亚洲专区一路线二|